From af4f3fd52351827ca75065df8df2b98450b2972a Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 8 Feb 2023 17:51:41 -0500 Subject: [PATCH 01/61] WIP Signed-off-by: Adam Li --- doc/references.bib | 17 ++++ doc/whats_new/v0.1.rst | 1 + dodiscover/constraint/__init__.py | 3 +- dodiscover/constraint/intervention.py | 130 ++++++++++++++++++++++++++ 4 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 dodiscover/constraint/intervention.py diff --git a/doc/references.bib b/doc/references.bib index dbb5fbfe7..154de67a7 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -16,6 +16,23 @@ @article{Colombo2012 url = {https://doi.org/10.1214/11-AOS940} } +@article{Jaber2020causal, + title={Causal discovery from soft interventions with unknown targets: Characterization and learning}, + author={Jaber, Amin and Kocaoglu, Murat and Shanmugam, Karthikeyan and Bareinboim, Elias}, + journal={Advances in neural information processing systems}, + volume={33}, + pages={9551--9561}, + year={2020} +} + +@article{Kocaoglu2019characterization, + title={Characterization and learning of causal graphs with latent variables from soft interventions}, + author={Kocaoglu, Murat and Jaber, Amin and Shanmugam, Karthikeyan and Bareinboim, Elias}, + journal={Advances in Neural Information Processing Systems}, + volume={32}, + year={2019} +} + @article{Lopez2016revisiting, title = {Revisiting classifier two-sample tests}, author = {Lopez-Paz, David and Oquab, Maxime}, diff --git a/doc/whats_new/v0.1.rst b/doc/whats_new/v0.1.rst index 74be27fbd..86e69556e 100644 --- a/doc/whats_new/v0.1.rst +++ b/doc/whats_new/v0.1.rst @@ -43,6 +43,7 @@ Changelog - |Feature| Add conditional k-sample (discrepancy) test, :class:`dodiscover.cd.BregmanCDTest`, by `Adam Li`_ (:pr:`82`) - |Feature| Add conditional mutual information test, :class:`dodiscover.ci.CMITest`, by `Adam Li`_ (:pr:`83`) - |Feature| Add classifier conditional mutual information test, :class:`dodiscover.ci.ClassifierCMITest`, by `Adam Li`_ (:pr:`85`) +- |Feature| Add Psi-FCI and I-FCI algorithm for handling soft-interventional data, :class:`dodiscover.constraint.PsiFCI` by `Adam Li`_ (:pr:``) Code and Documentation Contributors ----------------------------------- diff --git a/dodiscover/constraint/__init__.py b/dodiscover/constraint/__init__.py index 6bf409eff..a4b3469ea 100644 --- a/dodiscover/constraint/__init__.py +++ b/dodiscover/constraint/__init__.py @@ -1,3 +1,4 @@ +from .config import SkeletonMethods from .fcialg import FCI from .pcalg import PC -from .skeleton import LearnSemiMarkovianSkeleton, LearnSkeleton, SkeletonMethods +from .skeleton import LearnSemiMarkovianSkeleton, LearnSkeleton diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py new file mode 100644 index 000000000..0b55e8cee --- /dev/null +++ b/dodiscover/constraint/intervention.py @@ -0,0 +1,130 @@ +from typing import Optional, Tuple + +import networkx as nx +import pandas as pd + +from dodiscover._protocol import EquivalenceClass +from dodiscover.ci import BaseConditionalIndependenceTest +from dodiscover.constraint import SkeletonMethods +from dodiscover.context import Context +from dodiscover.typing import SeparatingSet + +from .fcialg import FCI + + +class PsiFCI(FCI): + def __init__( + self, + ci_estimator: BaseConditionalIndependenceTest, + alpha: float = 0.05, + min_cond_set_size: Optional[int] = None, + max_cond_set_size: Optional[int] = None, + max_combinations: Optional[int] = None, + skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + apply_orientations: bool = True, + max_iter: int = 1000, + max_path_length: Optional[int] = None, + pds_skeleton_method: SkeletonMethods = SkeletonMethods.PDS, + known_intervention_targets: bool = False, + **ci_estimator_kwargs, + ): + """Interventional (Psi) FCI algorithm. + + The I-FCI (or Psi-FCI) algorithm is an algorithm that accepts + multiple sets of data that may pertain to observational and/or + multiple interventional datasets under a known (I-FCI), or unknown (Psi-FCI) + intervention target setting. Our API consolidates them here under + one class, but you can control the setting using our hyperparameter. + See :footcite:`Kocaoglu2019characterization` for more information on + I-FCI and :footcite:`Jaber2020causal` for more information on Psi-FCI. + + The Psi-FCI algorithm is complete for the Psi-PAG equivalence class. + However, the I-FCI has not been shown to be complete for the I-PAG + equivalence class. Note that the I-FCI algorithm may change without + notice. + + Parameters + ---------- + ci_estimator : Callable + The conditional independence test function. The arguments of the estimator should + be data, node, node to compare, conditioning set of nodes, and any additional + keyword arguments. + alpha : float, optional + The significance level for the conditional independence test, by default 0.05. + min_cond_set_size : int, optional + Minimum size of the conditioning set, by default None, which will be set to '0'. + Used to constrain the computation spent on the algorithm. + max_cond_set_size : int, optional + Maximum size of the conditioning set, by default None. Used to limit + the computation spent on the algorithm. + max_combinations : int, optional + The maximum number of conditional independence tests to run from the set + of possible conditioning sets. By default None, which means the algorithm will + check all possible conditioning sets. If ``max_combinations=n`` is set, then + for every conditioning set size, 'p', there will be at most 'n' CI tests run + before the conditioning set size 'p' is incremented. For controlling the size + of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used + in conjunction with ``keep_sorted`` parameter to only test the "strongest" + dependences. + skeleton_method : SkeletonMethods + The method to use for testing conditional independence. Must be one of + ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. + apply_orientations : bool + Whether or not to apply orientation rules given the learned skeleton graph + and separating set per pair of variables. If ``True`` (default), will + apply Zhang's orientation rules R0-10, orienting colliders and certain + arrowheads and tails :footcite:`Zhang2008`. + max_iter : int + The maximum number of iterations through the graph to apply + orientation rules. + max_path_length : int, optional + The maximum length of any discriminating path, or None if unlimited. + selection_bias : bool + Whether or not to account for selection bias within the causal PAG. + See :footcite:`Zhang2008`. Currently not implemented. + pds_skeleton_method : SkeletonMethods + The method to use for learning the skeleton using PDS. Must be one of + ('pds', 'pds_path'). See Notes for more details. + known_intervention_targets : bool, optional + If `True`, then will run the I-FCI algorithm. If `False`, will run the + Psi-FCI algorithm. By default False. + ci_estimator_kwargs : dict + Keyword arguments for the ``ci_estimator`` function. + """ + super().__init__( + ci_estimator, + alpha, + min_cond_set_size, + max_cond_set_size, + max_combinations, + skeleton_method, + apply_orientations, + max_iter=max_iter, + max_path_length=max_path_length, + selection_bias=False, + pds_skeleton_method=pds_skeleton_method, + **ci_estimator_kwargs, + ) + self.known_intervention_targets = known_intervention_targets + + def learn_skeleton( + self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None + ) -> Tuple[nx.Graph, SeparatingSet]: + return super().learn_skeleton(data, context, sep_set) + + def fit(self, data: pd.DataFrame, context: Context) -> None: + return super().fit(data, context) + + def orient_edges(self, graph: EquivalenceClass): + return super().orient_edges(graph) + + def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: + import pywhy_graphs as pgraph + + # convert the undirected skeleton graph to its PAG-class, where + # all left-over edges have a "circle" endpoint + if self.known_intervention_targets: + pag = pgraph.IPAG(incoming_circle_edges=graph, name="IPAG derived with I-FCI") + else: + pag = pgraph.PsiPAG(incoming_circle_edges=graph, name="PsiPAG derived with Psi-FCI") + return pag From 70f666a849a103251e79325ff96c791793a4eb8d Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 13 Feb 2023 17:07:53 -0500 Subject: [PATCH 02/61] Working prototype of interventional skeleton Signed-off-by: Adam Li --- doc/api.rst | 2 + doc/conditional_independence.rst | 26 + doc/constraint_causal_discovery.rst | 31 + doc/index.rst | 7 +- doc/use.rst | 12 +- doc/user_guide.rst | 22 + dodiscover/__init__.py | 2 +- dodiscover/_protocol.py | 8 + dodiscover/base.py | 194 +++++ dodiscover/cd/bregman.py | 10 +- dodiscover/cd/kernel_test.py | 1 + dodiscover/ci/cmi_test.py | 2 +- dodiscover/ci/kernel_test.py | 8 +- dodiscover/ci/kernel_utils.py | 15 +- dodiscover/ci/monte_carlo.py | 4 +- dodiscover/constraint/_classes.py | 5 +- dodiscover/constraint/fcialg.py | 32 +- dodiscover/constraint/intervention.py | 38 +- dodiscover/constraint/skeleton.py | 682 ++++++++++++++++-- dodiscover/context.py | 144 ++-- dodiscover/context_builder.py | 352 ++++++++- dodiscover/metrics.py | 2 +- dodiscover/typing.py | 4 +- examples/README.txt | 2 + pyproject.toml | 2 +- .../constraint/test_intervene_skeleton.py | 62 ++ tests/unit_tests/constraint/test_skeleton.py | 91 ++- tests/unit_tests/test_base.py | 42 ++ tests/unit_tests/test_context_builder.py | 199 ++++- 29 files changed, 1773 insertions(+), 228 deletions(-) create mode 100644 doc/conditional_independence.rst create mode 100644 doc/constraint_causal_discovery.rst create mode 100644 doc/user_guide.rst create mode 100644 dodiscover/base.py create mode 100644 tests/unit_tests/constraint/test_intervene_skeleton.py create mode 100644 tests/unit_tests/test_base.py diff --git a/doc/api.rst b/doc/api.rst index d4d7a5c3d..7c7b8b301 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -1,3 +1,5 @@ +.. _api_ref: + ### API ### diff --git a/doc/conditional_independence.rst b/doc/conditional_independence.rst new file mode 100644 index 000000000..133a16a36 --- /dev/null +++ b/doc/conditional_independence.rst @@ -0,0 +1,26 @@ +.. _conditional_independence: + +======================== +Conditional Independence +======================== + +.. currentmodule:: dodiscover.ci + +TBD. + +Partial (Pearson) Correlation +----------------------------- +TBD. + +Discrete, Categorical and Binary Data +------------------------------------- +TBD. + + +Kernel-Approaches +----------------- +TBD. + +Conditional Mutual Information +------------------------------ +TBD. \ No newline at end of file diff --git a/doc/constraint_causal_discovery.rst b/doc/constraint_causal_discovery.rst new file mode 100644 index 000000000..07a337a20 --- /dev/null +++ b/doc/constraint_causal_discovery.rst @@ -0,0 +1,31 @@ +.. _constraint_causal_discovery: + +================================== +Constraint-based causal discovery +================================== + +.. currentmodule:: dodiscover.constraint + +The following are a set of methods intended for regression in which +the target value is expected to be a linear combination of the features. +In mathematical notation, if :math:`\hat{y}` is the predicted +value. + +(Non-parametric) Markovian SCMs with Observational Data +------------------------------------------------------- + + +(Non-parametric) Semi-Markovian SCMs with Observational Data +------------------------------------------------------------ + + +(Non-parametric) SCMs with Interventional Data +---------------------------------------------- + + +Robust learning +--------------- +Conservative orientations, etc. + + + diff --git a/doc/index.rst b/doc/index.rst index f068a093f..a6956c290 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -9,7 +9,12 @@ algorithms and data structures of ``networkx``. We encourage you to use the package for your causal inference research and also build on top with relevant Pull Requests. -See our examples for walk-throughs of how to use the package. +See our examples for walk-throughs of how to use the package, or + +Please refer to our :ref:`user_guide` for details on all the tools that we +provide. You can also find an exhaustive list of the public API in the +:ref:`api_ref`. You can also look at our numerous :ref:`examples ` +that illustrate the use of ``dodiscover`` in many different contexts. Contents -------- diff --git a/doc/use.rst b/doc/use.rst index 78a74b93c..c7bb0dbad 100644 --- a/doc/use.rst +++ b/doc/use.rst @@ -1,11 +1,11 @@ :orphan: -Using dodiscover -===================== - -To be able to effectively use dodiscover, look at some of the basic examples here -to learn everything you need! +Examples and Tutorials using DoDiscover +======================================= +To be able to effectively use dodiscover, you can look at some of the basic examples here +to learn everything you need from concepts to explicit code examples. .. include:: auto_examples/index.rst - :start-after: :orphan: \ No newline at end of file + :start-after: :orphan: + diff --git a/doc/user_guide.rst b/doc/user_guide.rst new file mode 100644 index 000000000..66fbe10e7 --- /dev/null +++ b/doc/user_guide.rst @@ -0,0 +1,22 @@ +.. Places parent toc into the sidebar + +:parenttoc: True + +.. title:: User guide: contents + +.. _user_guide: + +========== +User Guide +========== + +.. toctree:: + :numbered: + :maxdepth: 3 + + constraint_causal_discovery.rst + .. scores_causal_discovery.rst + .. visualizations.rst + .. datasets.rst + .. computing.rst + .. common_pitfalls.rst diff --git a/dodiscover/__init__.py b/dodiscover/__init__.py index 446ee292a..50014dbb8 100644 --- a/dodiscover/__init__.py +++ b/dodiscover/__init__.py @@ -8,4 +8,4 @@ from ._protocol import EquivalenceClass, Graph from ._version import __version__ # noqa: F401 from .constraint import FCI, PC -from .context_builder import ContextBuilder, make_context +from .context_builder import ContextBuilder, InterventionalContextBuilder, make_context diff --git a/dodiscover/_protocol.py b/dodiscover/_protocol.py index d0cc9b9e7..91709e069 100644 --- a/dodiscover/_protocol.py +++ b/dodiscover/_protocol.py @@ -51,6 +51,14 @@ def to_undirected(self) -> nx.Graph: """ pass + def subgraph(self, nodes): + """Get subgraph based on nodes.""" + pass + + def copy(self): + """Create a copy of the graph.""" + pass + class EquivalenceClass(Graph, Protocol): """Protocol for equivalence class of graphs.""" diff --git a/dodiscover/base.py b/dodiscover/base.py new file mode 100644 index 000000000..62599e39b --- /dev/null +++ b/dodiscover/base.py @@ -0,0 +1,194 @@ +import inspect +import warnings +from collections import defaultdict +from copy import deepcopy + +from ._version import __version__ + + +class InconsistentVersionWarning(UserWarning): + """Warning raised when an estimator is unpickled with a inconsistent version. + + Parameters + ---------- + estimator_name : str + Estimator name. + + current_dodiscover_version : str + Current dodiscover version. + + original_dodiscover_version : str + Original dodiscover version. + """ + + def __init__(self, *, estimator_name, current_dodiscover_version, original_dodiscover_version): + self.estimator_name = estimator_name + self.current_dodiscover_version = current_dodiscover_version + self.original_dodiscover_version = original_dodiscover_version + + def __str__(self): + return ( + f"Trying to unpickle estimator {self.estimator_name} from version" + f" {self.original_dodiscover_version} when " + f"using version {self.current_dodiscover_version}. This might lead to breaking" + " code or " + "invalid results. Use at your own risk. " + ) + + +class BasePyWhy: + """Base class for all PyWhy class objects. + + TODO: add parameter validation and data validation from sklearn. + TODO: add HTML representation. + + Notes + ----- + All learners and context should specify all the parameters that can be set + at the class level in their ``__init__`` as explicit keyword + arguments (no ``*args`` or ``**kwargs``). + """ + + @classmethod + def _get_param_names(cls): + """Get parameter names for the estimator.""" + # fetch the constructor or the original constructor before + # deprecation wrapping if any + init = getattr(cls.__init__, "deprecated_original", cls.__init__) + if init is object.__init__: + # No explicit constructor to introspect + return [] + + # introspect the constructor arguments to find the model parameters + # to represent + init_signature = inspect.signature(init) + # Consider the constructor parameters excluding 'self' + parameters = [ + p + for p in init_signature.parameters.values() + if p.name != "self" and p.kind != p.VAR_KEYWORD + ] + for p in parameters: + if p.kind == p.VAR_POSITIONAL: + raise RuntimeError( + "dodiscover estimators should always " + "specify their parameters in the signature" + " of their __init__ (no varargs)." + " %s with constructor %s doesn't " + " follow this convention." % (cls, init_signature) + ) + # Extract and sort argument names excluding 'self' + return sorted([p.name for p in parameters]) + + def get_params(self, deep=True): + """ + Get parameters for this Context. + + TODO: can update this when we build a causal-Pipeline similar to sklearn's Pipeline. + + Parameters + ---------- + deep : bool, default=True + If True, will return the parameters for this estimator and + contained subobjects that are estimators. + + Returns + ------- + params : dict + Parameter names mapped to their values. + """ + out = dict() + for key in self._get_param_names(): + value = getattr(self, key) + + if deep and hasattr(value, "get_params") and not isinstance(value, type): + # future proof for pipeline objects + deep_items = value.get_params().items() + out.update((key + "__" + k, val) for k, val in deep_items) + elif deep and not isinstance(value, type): + # this ensures a deepcopy is applied, which is useful for graphs + value = deepcopy(value) + + out[key] = value + return out + + def set_params(self, **params): + """Set the parameters of this estimator. + + The method works on simple estimators as well as on nested objects. + The latter have parameters of the form ``__`` + so that it's possible to update each component of a nested object. + + Parameters + ---------- + **params : dict + Estimator parameters. + + Returns + ------- + self : estimator instance + Estimator instance. + """ + if not params: + # Simple optimization to gain speed (inspect is slow) + return self + valid_params = self.get_params(deep=True) + + nested_params = defaultdict(dict) # grouped by prefix + for key, value in params.items(): + key, delim, sub_key = key.partition("__") + if key not in valid_params: + local_valid_params = self._get_param_names() + raise ValueError( + f"Invalid parameter {key!r} for estimator {self}. " + f"Valid parameters are: {local_valid_params!r}." + ) + + if delim: + nested_params[key][sub_key] = value + else: + setattr(self, key, value) + valid_params[key] = value + + for key, sub_params in nested_params.items(): + valid_params[key].set_params(**sub_params) + + return self + + def __getstate__(self): + if getattr(self, "__slots__", None): + raise TypeError( + "You cannot use `__slots__` in objects inheriting from " + "`dodiscover.base.BasePyWhy`." + ) + + try: + state = super().__getstate__() + if state is None: + # For Python 3.11+, empty instance (no `__slots__`, + # and `__dict__`) will return a state equal to `None`. + state = self.__dict__.copy() + except AttributeError: + # Python < 3.11 + state = self.__dict__.copy() + + if type(self).__module__.startswith("dodiscover."): + return dict(state.items(), _dodiscover_version=__version__) + else: + return state + + def __setstate__(self, state): + if type(self).__module__.startswith("dodiscover."): + pickle_version = state.pop("_dodiscover_version", "pre-0.18") + if pickle_version != __version__: + warnings.warn( + InconsistentVersionWarning( + estimator_name=self.__class__.__name__, + current_dodiscover_version=__version__, + original_dodiscover_version=pickle_version, + ), + ) + try: + super().__setstate__(state) + except AttributeError: + self.__dict__.update(state) diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index d292a2725..0224c1f52 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -1,4 +1,4 @@ -from typing import Set, Tuple +from typing import Optional, Set, Tuple import numpy as np import pandas as pd @@ -42,10 +42,10 @@ def __init__( self, metric: str = "rbf", distance_metric: str = "euclidean", - kwidth: float = None, + kwidth: Optional[float] = None, null_reps: int = 1000, - n_jobs: int = None, - random_state: int = None, + n_jobs: Optional[int] = None, + random_state: Optional[int] = None, ) -> None: self.metric = metric self.distance_metric = distance_metric @@ -125,7 +125,7 @@ def _statistic(self, X: ArrayLike, Y: ArrayLike, group_ind: ArrayLike) -> float: return conditional_div def compute_null( - self, X: ArrayLike, Y: ArrayLike, null_reps: int = 1000, random_state: int = None + self, X: ArrayLike, Y: ArrayLike, null_reps: int = 1000, random_state: Optional[int] = None ): rng = np.random.default_rng(random_state) diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index 51b2b99c2..a9f9a2893 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -99,6 +99,7 @@ def test( Set of Y variables. group_col : Column The column denoting, which group (i.e. environment) each sample belongs to. + This is typically the F-node. Returns ------- diff --git a/dodiscover/ci/cmi_test.py b/dodiscover/ci/cmi_test.py index e48395229..bab463fc0 100644 --- a/dodiscover/ci/cmi_test.py +++ b/dodiscover/ci/cmi_test.py @@ -85,7 +85,7 @@ def __init__( n_jobs: int = -1, n_shuffle_nbrs: int = 5, n_shuffle: int = 100, - random_seed: int = None, + random_seed: Optional[int] = None, ) -> None: self.k = k self.n_shuffle_nbrs = n_shuffle_nbrs diff --git a/dodiscover/ci/kernel_test.py b/dodiscover/ci/kernel_test.py index 6c8cb4e2b..2aae14ba4 100644 --- a/dodiscover/ci/kernel_test.py +++ b/dodiscover/ci/kernel_test.py @@ -21,11 +21,11 @@ def __init__( kernel_z: str = "rbf", null_size: int = 1000, approx_with_gamma: bool = True, - kwidth_x: float = None, - kwidth_y: float = None, - kwidth_z: float = None, + kwidth_x: Optional[float] = None, + kwidth_y: Optional[float] = None, + kwidth_z: Optional[float] = None, threshold: float = 1e-5, - n_jobs: int = None, + n_jobs: Optional[int] = None, ): """Kernel (Conditional) Independence Test. diff --git a/dodiscover/ci/kernel_utils.py b/dodiscover/ci/kernel_utils.py index 4d7234576..9bb0f8f11 100644 --- a/dodiscover/ci/kernel_utils.py +++ b/dodiscover/ci/kernel_utils.py @@ -101,9 +101,9 @@ def kl_divergence_score(y_stat_q: ArrayLike, y_stat_p: ArrayLike, eps: float) -> def corrent_matrix( data: ArrayLike, metric: str = "rbf", - kwidth: float = None, + kwidth: Optional[float] = None, distance_metric="euclidean", - n_jobs=None, + n_jobs: Optional[int] = None, ) -> ArrayLike: """Compute the centered correntropy of a matrix. @@ -227,7 +227,10 @@ def compute_kernel( def _estimate_kwidth( - X: ArrayLike, method="scott", distance_metric: str = None, n_jobs: int = None + X: ArrayLike, + method="scott", + distance_metric: Optional[str] = None, + n_jobs: Optional[int] = None, ) -> float: """Estimate kernel width. @@ -272,9 +275,9 @@ def _estimate_kwidth( def _kernel_estimate_propensity_scores( K: ArrayLike, group_ind: ArrayLike, - penalty: float = None, - n_jobs: int = None, - random_state: int = None, + penalty: Optional[float] = None, + n_jobs: Optional[int] = None, + random_state: Optional[int] = None, ) -> ArrayLike: """Estimate propensity scores given kernel and propensities. diff --git a/dodiscover/ci/monte_carlo.py b/dodiscover/ci/monte_carlo.py index 3f20d509d..71349df6d 100644 --- a/dodiscover/ci/monte_carlo.py +++ b/dodiscover/ci/monte_carlo.py @@ -1,3 +1,5 @@ +from typing import Optional + import numpy as np import scipy.spatial from numpy.typing import ArrayLike @@ -5,7 +7,7 @@ def generate_knn_in_subspace( - z_arr: ArrayLike, method: str = "knn", k: int = 1, n_jobs: int = None + z_arr: ArrayLike, method: str = "knn", k: int = 1, n_jobs: Optional[int] = None ) -> ArrayLike: """Generate kNN in subspace. diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index dce215fd3..dc3087e7c 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -153,15 +153,12 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: constructor. """ self.context_ = make_context(context).build() - graph = self.context_.init_graph - self.init_graph_ = graph - self.fixed_edges_ = self.context_.included_edges # create a reference to the underlying data to be used self.X_ = data # initialize graph object to apply learning - self.separating_sets_ = self._initialize_sep_sets(self.init_graph_) + self.separating_sets_ = self._initialize_sep_sets(self.context_.init_graph) # learn skeleton graph and the separating sets per variable graph, self.separating_sets_ = self.learn_skeleton( diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 0f92c07a3..2dcc6def7 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -801,33 +801,6 @@ def _apply_rules_1to10(self, graph: EquivalenceClass, sep_set: SeparatingSet): def learn_skeleton( self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None ) -> Tuple[nx.Graph, SeparatingSet]: - import pywhy_graphs - - from dodiscover import make_context - - # initially learn the skeleton - skel_graph, sep_set = super().learn_skeleton(data, context, sep_set) - - # convert the undirected skeleton graph to a PAG, where - # all left-over edges have a "circle" endpoint - pag = pywhy_graphs.PAG(incoming_circle_edges=skel_graph, name="PAG derived with FCI") - - # orient colliders - self.orient_unshielded_triples(pag, sep_set) - - # convert the adjacency graph - new_init_graph = pag.to_undirected() - - # Update the Context: - # add the corresponding intermediate PAG now to the context - # new initialization graph - for (_, _, d) in new_init_graph.edges(data=True): - if "test_stat" in d: - d.pop("test_stat") - if "pvalue" in d: - d.pop("pvalue") - context = make_context(context).graph(new_init_graph).state_variable("PAG", pag).build() - # # now compute all possibly d-separating sets and learn a better skeleton skel_alg = LearnSemiMarkovianSkeleton( self.ci_estimator, @@ -836,7 +809,8 @@ def learn_skeleton( min_cond_set_size=self.min_cond_set_size, max_cond_set_size=self.max_cond_set_size, max_combinations=self.max_combinations, - skeleton_method=self.pds_skeleton_method, + skeleton_method=self.skeleton_method, + second_stage_skeleton_method=self.pds_skeleton_method, keep_sorted=False, max_path_length=self.max_path_length, **self.ci_estimator_kwargs, @@ -849,7 +823,7 @@ def learn_skeleton( return skel_graph, sep_set def fit(self, data: pd.DataFrame, context: Context) -> None: - return super().fit(data, context) + super().fit(data, context) def orient_edges(self, graph: EquivalenceClass): # orient colliders again diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index 0b55e8cee..ae6164137 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -1,4 +1,4 @@ -from typing import Optional, Tuple +from typing import List, Optional, Tuple import networkx as nx import pandas as pd @@ -112,8 +112,40 @@ def learn_skeleton( ) -> Tuple[nx.Graph, SeparatingSet]: return super().learn_skeleton(data, context, sep_set) - def fit(self, data: pd.DataFrame, context: Context) -> None: - return super().fit(data, context) + def fit(self, data: List[pd.DataFrame], context: Context): + """Learn the relevant causal graph equivalence class. + + From the pairs of datasets, we take all combinations and + construct F-nodes corresponding to those. + + Parameters + ---------- + data : List[pd.DataFrame] + The list of different datasets assigned to different + environments. We assume the first dataset is always + observational. + context : Context + _description_ + + Returns + ------- + _type_ + _description_ + """ + if not isinstance(data, list): + raise RuntimeError("The input datasets must be in a Python list.") + + n_datasets = len(data) + intervention_targets = context.intervention_targets + + if n_datasets - 1 != len(intervention_targets): + raise RuntimeError( + f"There are {n_datasets} passed in, but {len(intervention_targets)} " + f"intervention targets. There must be a matching (number of datasets - 1) and " + f"intervention targets." + ) + + super().fit(data, context) def orient_edges(self, graph: EquivalenceClass): return super().orient_edges(graph) diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index b05123451..f70320630 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1,18 +1,23 @@ import logging from collections import defaultdict +from copy import deepcopy +from functools import reduce from itertools import chain, combinations -from typing import Iterable, Optional, Set, SupportsFloat, Tuple, Union +from typing import Iterable, List, Optional, Set, SupportsFloat, Tuple, Union import networkx as nx import numpy as np import pandas as pd -from dodiscover.ci import BaseConditionalIndependenceTest +from dodiscover.cd import BaseConditionalDiscrepancyTest +from dodiscover.ci import BaseConditionalIndependenceTest, Oracle from dodiscover.constraint.config import SkeletonMethods +from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet +from .._protocol import EquivalenceClass from ..context import Context -from ..context_builder import make_context +from ..context_builder import ContextBuilder, InterventionalContextBuilder, make_context logger = logging.getLogger() @@ -94,7 +99,10 @@ def _assign_weight(u, v, edge_attr): class LearnSkeleton: - """Learn a skeleton graph from a Markovian causal model. + """Learn a skeleton graph from observational data without latent confounding. + + A skeleton graph from a Markovian causal model can be learned completely + with this procedure. Parameters ---------- @@ -142,6 +150,17 @@ class LearnSkeleton: testing 'x' || 'y' given some conditioning set (key name 'pvalue'). sep_set_ : dictionary of dictionary of list of set Mapping node to other nodes to separating sets of variables. + context_ : Context + The result context. Encodes causal assumptions. + min_cond_set_size_ : int + The inferred minimum conditioning set size. + max_cond_set_size_ : int + The inferred maximum conditioning set size. + max_combinations_ : int + The inferred maximum number of combinations of 'Z' to test per + :math:`X \\perp Y | Z`. + n_iters_ : int + The number of iterations the skeleton has been learned. Notes ----- @@ -195,12 +214,14 @@ class LearnSkeleton: """ adj_graph_: nx.Graph - sep_set_: SeparatingSet - remove_edges: Set - context: Context + context_: Context min_cond_set_size_: int max_cond_set_size_: int max_combinations_: int + sep_set_: SeparatingSet + n_iters_: int = 0 + + remove_edges: Set def __init__( self, @@ -212,7 +233,7 @@ def __init__( max_combinations: Optional[int] = None, skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, keep_sorted: bool = False, - **ci_estimator_kwargs, + ci_estimator_kwargs=None, ) -> None: self.ci_estimator = ci_estimator self.sep_set = sep_set @@ -234,10 +255,7 @@ def __init__( def _initialize_params(self) -> None: """Initialize parameters for learning skeleton. - Parameters - ---------- - nodes : list of nodes - The list of nodes that will be present in the learned skeleton graph. + Basic parameters that are used by any constraint-based causal discovery algorithms. """ # error checks of passed in arguments if self.max_combinations is not None and self.max_combinations <= 0: @@ -248,11 +266,11 @@ def _initialize_params(self) -> None: f"Skeleton method must be one of {SkeletonMethods}, not {self.skeleton_method}." ) - if self.sep_set is None: + if self.sep_set is None and not hasattr(self, "sep_set_"): # keep track of separating sets self.sep_set_ = defaultdict(lambda: defaultdict(list)) - else: - self.sep_set_ = self.sep_set + elif not hasattr(self, "sep_set_"): + self.sep_set_ = self.sep_set # type: ignore # control of the conditioning set if self.max_cond_set_size is None: @@ -268,6 +286,9 @@ def _initialize_params(self) -> None: else: self.max_combinations_ = self.max_combinations + if self.ci_estimator_kwargs is None: + self.ci_estimator_kwargs = dict() + def evaluate_edge( self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None ) -> Tuple[float, float]: @@ -297,7 +318,7 @@ def evaluate_edge( self.n_ci_tests += 1 return test_stat, pvalue - def fit(self, data: pd.DataFrame, context: Context) -> None: + def fit(self, data: pd.DataFrame, context: Context): """Run structure learning to learn the skeleton of the causal graph. Parameters @@ -307,11 +328,10 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: context : Context A context object. """ - self.context = make_context(context).build() + self.context_ = context.copy() # get the initialized graph - adj_graph = self.context.init_graph - X = data + adj_graph = deepcopy(self.context_.init_graph.copy()) # track progress of the algorithm for which edges to remove to ensure stability self.remove_edges = set() @@ -322,8 +342,10 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: # the size of the conditioning set will start off at the minimum size_cond_set = self.min_cond_set_size_ + # allow us to query the iteration stage of the causal discovery algorithm + # allowing us to run multiple iterations of the skeleton discovery edge_attrs = set(chain.from_iterable(d.keys() for *_, d in adj_graph.edges(data=True))) - if "test_stat" in edge_attrs or "pvalue" in edge_attrs: + if self.n_iters_ == 0 and "test_stat" in edge_attrs or "pvalue" in edge_attrs: raise RuntimeError( "Running skeleton discovery with adjacency graph " "with 'test_stat' or 'pvalue' is not supported yet." @@ -361,7 +383,7 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: continue # ignore fixed edges - if (x_var, y_var) in self.context.included_edges.edges: + if (x_var, y_var) in self.context_.included_edges.edges: continue # compute the possible variables used in the conditioning set @@ -369,7 +391,6 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: adj_graph, x_var, y_var, - skeleton_method=self.skeleton_method, ) logger.debug( @@ -408,7 +429,7 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: break # compute conditional independence test - test_stat, pvalue = self.evaluate_edge(X, x_var, y_var, set(cond_set)) + test_stat, pvalue = self.evaluate_edge(data, x_var, y_var, set(cond_set)) # if any "independence" is found through inability to reject # the null hypothesis, then we will break the loop comparing X and Y @@ -441,6 +462,7 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: break self.adj_graph_ = adj_graph + self.n_iters_ += 1 def _summarize_xy_comparison( self, x_var: Column, y_var: Column, removed_edge: bool, pvalue: float @@ -458,9 +480,13 @@ def _summarize_xy_comparison( ) def _compute_candidate_conditioning_sets( - self, adj_graph: nx.Graph, x_var: Column, y_var: Column, skeleton_method: SkeletonMethods + self, adj_graph: nx.Graph, x_var: Column, y_var: Column ) -> Set[Column]: - """Compute candidate conditioning sets. + r"""Compute candidate conditioning sets. + + For a given 'X' and 'Y', this method implements a graphical algorithm that + enumerates possible variables that are part of 'Z', the conditioning set. + One can then test the following null hypothesis :math:`H_0: X \perp Y | Z`. Parameters ---------- @@ -470,16 +496,20 @@ def _compute_candidate_conditioning_sets( The 'X' node. y_var : node The 'Y' node. - skeleton_method : SkeletonMethods - The skeleton method, which dictates how we choose the corresponding - conditioning sets. Returns ------- - possible_variables : Set + possible_variables : Set of Column The set of nodes in 'adj_graph' that are candidates for the conditioning set. + + Notes + ----- + The :attr:`skeleton_method` dictates how we choose the corresponding conditioning sets. + For more information, see :class:`SkeletonMethods`. """ + skeleton_method = self.skeleton_method + if skeleton_method == SkeletonMethods.COMPLETE: possible_variables = set(adj_graph.nodes) elif skeleton_method == SkeletonMethods.NBRS: @@ -566,8 +596,12 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. skeleton_method : SkeletonMethods - The method to use for testing conditional independence. Must be one of - ('pds', 'pds_path'). See Notes for more details. + The method to use for determining conditioning sets when testing conditional + independence of the first stage. See :class:`LearnSkeleton` for details. + second_stage_skeleton_method : SkeletonMethods | None + The method to use for determining conditioning sets when testing conditional + independence of the first stage. Must be one of ('pds', 'pds_path'). See Notes + for more details. If `None`, then no second stage skeleton discovery phase will be run. keep_sorted : bool Whether or not to keep the considered conditioning set variables in sorted dependency order. If True (default) will sort the existing dependencies of each variable @@ -579,6 +613,29 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): ci_estimator_kwargs : dict Keyword arguments for the ``ci_estimator`` function. + Attributes + ---------- + adj_graph_ : nx.Graph + The discovered graph from data. Stored using an undirected + graph. The graph contains edge attributes for the smallest value of the + test statistic encountered (key name 'test_stat'), the largest pvalue seen in + testing 'x' || 'y' given some conditioning set (key name 'pvalue'). + sep_set_ : dictionary of dictionary of list of set + Mapping node to other nodes to separating sets of variables. + context_ : Context + The result context. Encodes causal assumptions. + min_cond_set_size_ : int + The inferred minimum conditioning set size. + max_cond_set_size_ : int + The inferred maximum conditioning set size. + max_combinations_ : int + The inferred maximum number of combinations of 'Z' to test per + :math:`X \\perp Y | Z`. + n_iters_ : int + The number of iterations the skeleton has been learned. + max_path_length_ : int + Th inferred maximum path length any single discriminating path is allowed to take. + Notes ----- To learn the skeleton of a Semi-Markovian causal model, one approach is to consider @@ -608,6 +665,8 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): .. footbibliography:: """ + max_path_length_: int + def __init__( self, ci_estimator: BaseConditionalIndependenceTest, @@ -616,10 +675,11 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.PDS, + skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + second_stage_skeleton_method: Optional[SkeletonMethods] = SkeletonMethods.PDS, keep_sorted: bool = False, max_path_length: Optional[int] = None, - **ci_estimator_kwargs, + ci_estimator_kwargs=None, ) -> None: super().__init__( ci_estimator, @@ -630,41 +690,75 @@ def __init__( max_combinations, skeleton_method, keep_sorted, - **ci_estimator_kwargs, + ci_estimator_kwargs=ci_estimator_kwargs, ) - if max_path_length is None: - max_path_length = np.inf + + self.second_stage_skeleton_method = second_stage_skeleton_method self.max_path_length = max_path_length + def _orient_unshielded_triples(self, graph: EquivalenceClass, sep_set: SeparatingSet) -> None: + """Orient colliders given a graph and separation set. + + Parameters + ---------- + graph : EquivalenceClass + The partial ancestral graph (PAG). + sep_set : SeparatingSet + The separating set between any two nodes. + """ + # for every node in the PAG, evaluate neighbors that have any edge + for u in graph.nodes: + for v_i, v_j in combinations(graph.neighbors(u), 2): + # Check that there is no edge of any type between + # v_i and v_j, else this is a "shielded" collider. + # Then check to see if 'u' is in the separating + # set. If it is not, then there is a collider. + if v_j not in graph.neighbors(v_i) and not is_in_sep_set( + u, sep_set, v_i, v_j, mode="any" + ): + if graph.has_edge(v_i, u, graph.circle_edge_name): + graph.orient_uncertain_edge(v_i, u) + if graph.has_edge(v_j, u, graph.circle_edge_name): + graph.orient_uncertain_edge(v_j, u) + def _compute_candidate_conditioning_sets( - self, adj_graph: nx.Graph, x_var: Column, y_var: Column, skeleton_method: SkeletonMethods + self, adj_graph: nx.Graph, x_var: Column, y_var: Column ) -> Set[Column]: import pywhy_graphs as pgraph # get PAG from the context object - pag = self.context.state_variable("PAG") + pag = self.context_.state_variable("PAG", on_missing="ignore") - if skeleton_method == SkeletonMethods.PDS: - # determine how we want to construct the candidates for separating nodes - # perform conditioning independence testing on all combinations - possible_variables = pgraph.pds( - pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore - ) - elif skeleton_method == SkeletonMethods.PDS_PATH: - # determine how we want to construct the candidates for separating nodes - # perform conditioning independence testing on all combinations - possible_variables = pgraph.pds_path( - pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore - ) - - if self.keep_sorted: - # Note it is assumed in public API that 'test_stat' is set - # inside the adj_graph - possible_variables = sorted( - possible_variables, - key=lambda n: adj_graph.edges[x_var, n]["test_stat"], - reverse=True, - ) # type: ignore + if pag is None: + # if PAG has not been set as a state variable, then we are learning a skeleton + # without PDS information. I.e. the normal LearnSkeleton algorithm + return super()._compute_candidate_conditioning_sets(adj_graph, x_var, y_var) + else: + if not all(x in pag.nodes for x in [x_var, y_var]): + raise RuntimeError("wtf..") + skeleton_method = self.second_stage_skeleton_method + + if skeleton_method == SkeletonMethods.PDS: + # determine how we want to construct the candidates for separating nodes + # perform conditioning independence testing on all combinations + possible_variables = pgraph.pds( + pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore + ) + elif skeleton_method == SkeletonMethods.PDS_PATH: + # determine how we want to construct the candidates for separating nodes + # perform conditioning independence testing on all combinations + possible_variables = pgraph.pds_path( + pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore + ) + + if self.keep_sorted: + # Note it is assumed in public API that 'test_stat' is set + # inside the adj_graph + possible_variables = sorted( + possible_variables, + key=lambda n: adj_graph.edges[x_var, n]["test_stat"], + reverse=True, + ) # type: ignore if x_var in possible_variables: possible_variables.remove(x_var) @@ -673,5 +767,471 @@ def _compute_candidate_conditioning_sets( return possible_variables - def fit(self, data: pd.DataFrame, context: Context) -> None: - return super().fit(data, context) + def fit(self, data: pd.DataFrame, context: Context): + import pywhy_graphs as pgraphs + + if self.max_path_length is None: + self.max_path_length_ = np.inf + else: + self.max_path_length_ = self.max_path_length + + # initially learn the skeleton without using PDS information + super().fit(data, context) + + # if there is no second stage skeleton method to be run, then we + # will stop with the skeleton here + if self.second_stage_skeleton_method is None: + return self + + # convert the undirected skeleton graph to a PAG, where + # all left-over edges have a "circle" endpoint + sep_set = self.sep_set_ + skel_graph = self.adj_graph_ + pag = pgraphs.PAG(incoming_circle_edges=skel_graph, name="PAG derived with FCI") + + # orient colliders + self._orient_unshielded_triples(pag, sep_set) + + # convert the adjacency graph + new_init_graph = pag.to_undirected() + + # Update the Context: + # add the corresponding intermediate PAG now to the context + # new initialization graph + for (_, _, d) in new_init_graph.edges(data=True): + if "test_stat" in d: + d.pop("test_stat") + if "pvalue" in d: + d.pop("pvalue") + context = ( + make_context(context).init_graph(new_init_graph).state_variable("PAG", pag).build() + ) + + if not all(x in context.state_variable("PAG").nodes for x in data.columns): + raise RuntimeError("wtf..") + + # now compute all possibly d-separating sets and learn a better skeleton + super().fit(data, context) + return self + + +class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): + """Learn skeleton using observational and interventional data. + + Parameters + ---------- + ci_estimator : BaseConditionalIndependenceTest + The conditional independence test function. + cd_estimator : BaseConditionalDiscrepancyTest + The conditional discrepancy test function. + sep_set : dictionary of dictionary of list of set + Mapping node to other nodes to separating sets of variables. + If ``None``, then an empty dictionary of dictionary of list of sets + will be initialized. + alpha : float, optional + The significance level for the conditional independence test, by default 0.05. + min_cond_set_size : int + The minimum size of the conditioning set, by default 0. The number of variables + used in the conditioning set. + max_cond_set_size : int, optional + Maximum size of the conditioning set, by default None. Used to limit + the computation spent on the algorithm. + max_combinations : int, optional + The maximum number of conditional independence tests to run from the set + of possible conditioning sets. By default None, which means the algorithm will + check all possible conditioning sets. If ``max_combinations=n`` is set, then + for every conditioning set size, 'p', there will be at most 'n' CI tests run + before the conditioning set size 'p' is incremented. For controlling the size + of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used + in conjunction with ``keep_sorted`` parameter to only test the "strongest" + dependences. + skeleton_method : SkeletonMethods + The method to use for testing conditional independence. Must be one of + ('pds', 'pds_path'). See Notes for more details. + keep_sorted : bool + Whether or not to keep the considered conditioning set variables in sorted + dependency order. If True (default) will sort the existing dependencies of each variable + by its dependencies from strongest to weakest (i.e. largest CI test statistic value + to lowest). This can be used in conjunction with ``max_combinations`` parameter + to only test the "strongest" dependences. + max_path_length : int, optional + The maximum length of any discriminating path, or None if unlimited. + ci_estimator_kwargs : dict + Keyword arguments for the ``ci_estimator`` function. + cd_estimator_kwargs : dict + Keyword arguments for the ``cd_estimator`` function. + + Notes + ----- + With interventional data, one may either know the interventional targets from each + experimental distribution dataset, or one may not know the explicit targets. If the + interventional targets are known, then the skeleton discovery algorithm of + :footcite:`Kocaoglu2019characterization` is used. That is we learn the skeleton of a + IPAG. Otherwise, we will not know the intervention targets, and use the skeleton discovery + algorithm described in :footcite:`Jaber2020causal`. To define intervention targets, one + must use the :class:`dodiscover.InterventionalContextBuilder`. + + References + ---------- + .. footbibliography:: + """ + + def __init__( + self, + ci_estimator: BaseConditionalIndependenceTest, + cd_estimator: BaseConditionalDiscrepancyTest, + sep_set: Optional[SeparatingSet] = None, + alpha: float = 0.05, + min_cond_set_size: int = 0, + max_cond_set_size: Optional[int] = None, + max_combinations: Optional[int] = None, + skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + second_stage_skeleton_method: SkeletonMethods = SkeletonMethods.PDS, + keep_sorted: bool = False, + max_path_length: Optional[int] = None, + known_intervention_targets: bool = False, + ci_estimator_kwargs=None, + cd_estimator_kwargs=None, + ) -> None: + super().__init__( + ci_estimator, + sep_set, + alpha, + min_cond_set_size, + max_cond_set_size, + max_combinations, + skeleton_method, + second_stage_skeleton_method, + keep_sorted, + max_path_length, + ci_estimator_kwargs, + ) + + self.cd_estimator = cd_estimator + self.known_intervention_targets = known_intervention_targets + self.cd_estimator_kwargs = cd_estimator_kwargs + + def evaluate_fnode_edge( + self, + data: List[pd.DataFrame], + X: Set[Column], + Y: Set[Column], + Z: Optional[Set[Column]] = None, + ) -> Tuple[float, float]: + """Test an edge from an F-node to a regular node for X || Y | Z. + + Parameters + ---------- + data : pd.DataFrame + The dataset + X : column + A column in ``data``. This is assumed to be the F-node. + Y : column + A column in ``data``. + Z : set, optional + A list of columns in ``data``, by default None. + + Returns + ------- + test_stat : float + Test statistic. + pvalue : float + The pvalue. + """ + if Z is None: + Z = set() + + # extract the F-node name + group_col: Column = reduce(lambda x: x, X) # type: ignore + + # get the sigma-map for this F-node + distribution_idx = self.context_.sigma_map[group_col] + + # get the distributions across the two distributions + data_i = data[distribution_idx[0]] + data_j = data[distribution_idx[1]] + + # name the group column the F-node, so Oracle works as expected + data_i[group_col] = 0 + data_j[group_col] = 1 + data = pd.concat((data_i, data_j), axis=0) + + # compare conditional distributions P(Y | X) vs P'(Y | X), where 'group_col' + # indicates which distribution data came from + if isinstance(self.cd_estimator, Oracle): + # test graphically if Y is d-separated from F-node given Z + test_stat, pvalue = self.cd_estimator.test( + data, {group_col}, Y, Z, **self.cd_estimator_kwargs + ) + else: + # test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) + test_stat, pvalue = self.cd_estimator.test( + data, Z, Y, group_col, **self.cd_estimator_kwargs + ) + + self.n_ci_tests += 1 + return test_stat, pvalue + + def _compute_candidate_conditioning_sets( + self, adj_graph: nx.Graph, x_var: Column, y_var: Column + ) -> Set[Column]: + """Override the computation for conditioning sets. + + Parameters + ---------- + adj_graph : nx.Graph + _description_ + x_var : Column + _description_ + y_var : Column + _description_ + + Returns + ------- + Z : Set[Column] + _description_ + """ + f_nodes = self.context_.f_nodes + + # if F-nodes is not defined, then we are simply doing learning in the observational setting + if len(f_nodes) == 0: + # compute the possible variables used in the conditioning set + return super()._compute_candidate_conditioning_sets(adj_graph, x_var, y_var) + else: + if y_var in f_nodes: + raise RuntimeError("This should not be the case") + + # get only neighboring sets of Y-vars, or PDS that depend on Y + possible_variables = set(adj_graph.neighbors(y_var)) + return possible_variables + + def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): + self.context_ = make_context(context, create_using=InterventionalContextBuilder).build() + + # get the initialized graph + adj_graph = self.context_.init_graph + f_nodes = self.context_.f_nodes + + print("Starting learning int skeleton: ", f_nodes) + + # the size of the conditioning set will start off at the minimum + size_cond_set = self.min_cond_set_size_ + + # track progress of the algorithm for which edges to remove to ensure stability + self.remove_edges = set() + + # Outer loop: iterate over 'size_cond_set' until stopping criterion is met + # - 'size_cond_set' > 'max_cond_set_size' or + # - All (X, Y) pairs have candidate conditioning sets of size < 'size_cond_set' + while 1: + cont = False + # initialize set of edges to remove at the end of every loop + self.remove_edges = set() + + # loop through every node + for x_var in f_nodes: + possible_adjacencies = set(adj_graph.neighbors(x_var)) + + logger.info(f"Considering node {x_var}...\n\n") + + for y_var in possible_adjacencies: + # a node cannot be a parent to itself in DAGs + if y_var == x_var: + continue + + # if Y is also a F-node, then they are automatically assumed d-separated + if y_var in f_nodes: + pvalue = 1.0 + test_stat = 0.0 + + # post-process the CI test results + removed_edge = self._postprocess_ci_test( + adj_graph, x_var, y_var, set(), test_stat, pvalue + ) + + # summarize the comparison of XY + self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + continue + + # TODO: allow ignoring fixed edges + # if self.context_.included_edges.has_edge(x_var, y_var): + # continue + # if self.context_.excluded_edges.has_edge(x_var, y_var): + # pvalue = 1.0 + # test_stat = 0.0 + + # # post-process the CI test results + # removed_edge = self._postprocess_ci_test( + # adj_graph, x_var, y_var, {}, test_stat, pvalue + # ) + + # # summarize the comparison of XY + # self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + # continue + + # compute the possible variables used in the conditioning set + possible_variables = self._compute_candidate_conditioning_sets( + adj_graph, + x_var, + y_var, + ) + + logger.debug( + f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " + f"with p={size_cond_set}. The possible variables to condition on are: " + f"{possible_variables}." + ) + + # check that number of adjacencies is greater then the + # cardinality of the conditioning set + if len(possible_variables) < size_cond_set: + logger.debug( + f"\n\nBreaking for {x_var}, {y_var}, {len(possible_adjacencies)}, " + f"{size_cond_set}, {possible_variables}" + ) + continue + else: + cont = True + + # generate iterator through the conditioning sets + conditioning_sets = _iter_conditioning_set( + possible_variables=possible_variables, + x_var=x_var, + y_var=y_var, + size_cond_set=size_cond_set, + ) + + # now iterate through the possible parents + for comb_idx, cond_set in enumerate(conditioning_sets): + # check the number of combinations of possible parents we have tried + # to use as a separating set + if ( + self.max_combinations_ is not None + and comb_idx >= self.max_combinations_ + ): + break + + # compute conditional independence test + test_stat, pvalue = self.evaluate_fnode_edge( + interv_data, {x_var}, {y_var}, set(cond_set) + ) + + # if any "independence" is found through inability to reject + # the null hypothesis, then we will break the loop comparing X and Y + # and say X and Y are conditionally independent given 'cond_set' + if pvalue > self.alpha: + break + + # post-process the CI test results + removed_edge = self._postprocess_ci_test( + adj_graph, x_var, y_var, cond_set, test_stat, pvalue + ) + + # summarize the comparison of XY + self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + + # finally remove edges after performing + # conditional independence tests + logger.info(f"For p = {size_cond_set}, removing all edges: {self.remove_edges}") + + # Remove non-significant links + # Note: Removing edges at the end ensures "stability" of the algorithm + # with respect to the randomness choice of pairs of edges considered in the inner loop + adj_graph.remove_edges_from(self.remove_edges) + + # increment the conditioning set size + size_cond_set += 1 + + # only allow conditioning set sizes up to maximum set number + if size_cond_set > self.max_cond_set_size_ or cont is False: + break + + self.adj_graph_ = adj_graph + + def _learn_skeleton_with_observations(self, obs_data: pd.DataFrame, context: Context): + f_nodes = context.f_nodes + + # get the init graph that does not contain any F-nodes + obs_context_bld = make_context(context, create_using=ContextBuilder) + init_graph = deepcopy(context.init_graph) + + # get the subgraph of non-f nodes + non_f_nodes = set(init_graph.nodes) - set(f_nodes) + obs_init_graph = init_graph.subgraph(non_f_nodes) + + # now learn the observational subgraph + obs_context_bld.init_graph(obs_init_graph) + obs_context = obs_context_bld.build() + super().fit(obs_data, obs_context) + + def fit(self, data: List[pd.DataFrame], context: Context) -> None: + """Fit data and context. + + Parameters + ---------- + data : List[pd.DataFrame] + List of dataframes corresponding to different distributions of data. + context : Context + Context object. + """ + if self.cd_estimator_kwargs is None: + self.cd_estimator_kwargs = dict() + + # error-check the datasets passed in match the intervention contexts + if len(data) != context.num_distributions: + raise RuntimeError( + f"The number of datasets does not match the number of interventions. " + f"You passed in {len(data)} different datasets, whereas " + f"there are {len(context.intervention_targets)} different interventions " + f"specified. It is assumed that the first dataset is observational, " + f"while the rest are interventional." + ) + + orig_context = context.copy() + f_nodes = context.f_nodes + + # it is fine to run the first stage of the FCI algorithm, as this will + # not result in removing any edges among the F-nodes + obs_data = data[0] + self._learn_skeleton_with_observations(obs_data, context) + + # keep track of the observational skeleton graph + obs_skel_graph = self.adj_graph_.copy() + + # all separating sets are either: + # i) augmented with all F-nodes, or + # ii) augmented with all F-nodes except intervention index 'i' + # R9 allows us to leverage F-nodes being not in separating sets to + + # augment all separating sets that have non-empty sets with all + # F-nodes to keep consistency with the algorithm + for x_var, y_vars in self.sep_set_.items(): + for y_var in y_vars: + sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + if len(sep_sets) > 0: + for idx in range(len(sep_sets)): + self.sep_set_[x_var][y_var][idx].update(f_nodes) + + # index all datasets, where the first one may be observational + non_f_nodes = self.context_.get_non_f_nodes() + + # reset the init graph and this time learn the skeleton using + # interventional distributions + # create a complete subgraph of F-nodes with all other nodes + for node in f_nodes: + for obs_node in set(f_nodes).union(set(non_f_nodes)): + if node == obs_node: + continue + self.adj_graph_.add_edge(node, obs_node, test_stat=np.inf, pvalue=-1e-5) + + # reset context and add observational skeleton + self.context_ = ( + make_context(orig_context, create_using=InterventionalContextBuilder) + .init_graph(self.adj_graph_.copy()) + .build() + ) + self.context_.add_state_variable("obs_skel_graph", obs_skel_graph) + + # now, we'll fit the data using interventional data by looping over all + # combinations of F-nodes and their neighbors + self._learn_skeleton_with_interventions(data, self.context_) diff --git a/dodiscover/context.py b/dodiscover/context.py index 8830af853..71dc5f3c3 100644 --- a/dodiscover/context.py +++ b/dodiscover/context.py @@ -1,12 +1,16 @@ -from typing import Any, Dict, Set +from dataclasses import dataclass, field +from typing import Any, Dict, FrozenSet, List, Set, Tuple +from warnings import warn import networkx as nx from ._protocol import Graph -from .typing import Column, NetworkxGraph +from .base import BasePyWhy +from .typing import Column -class Context: +@dataclass(eq=True, frozen=True) +class Context(BasePyWhy): """Context of assumptions, domain knowledge and data. This should NOT be instantiated directly. One should instead @@ -28,6 +32,12 @@ class Context: Included edges without direction. excluded_edges : nx.Graph Excluded edges without direction. + state_variables : Dict + Name of intermediate state variables during the learning process. + intervention_targets : list of tuples + List of intervention targets (known, or unknown), which correspond to + the nodes in the graph (known), or indices of datasets that contain + interventions (unknown). Raises ------ @@ -42,57 +52,43 @@ class Context: is used in conjunction with a discovery algorithm. Setting the a priori explicit direction of an edge is not supported yet. + + **Testing for equality** + + Currently, testing for equality is done on all attributes that are not + graphs. Defining equality among graphs is ill-defined, and as such, we + leave testing of the internal graphs to users. Some checks of equality + for example can be :func:`nx.is_isomorphic` for checking isomorphism + among two graphs. """ - _variables: Set[Column] - _latents: Set[Column] - _init_graph: Graph - _included_edges: nx.Graph - _excluded_edges: nx.Graph - _state_variables: Dict[str, Any] - - def __init__( - self, - variables: Set[Column], - latents: Set[Column], - init_graph: Graph, - included_edges: NetworkxGraph, - excluded_edges: NetworkxGraph, - state_variables: Dict[str, Any], - ) -> None: - # set to class - self._state_variables = state_variables - self._variables = variables - self._latents = latents - self._init_graph = init_graph - self._included_edges = included_edges - self._excluded_edges = excluded_edges - - @property - def included_edges(self) -> nx.Graph: - return self._included_edges - - @property - def excluded_edges(self) -> nx.Graph: - return self._excluded_edges - - @property - def init_graph(self) -> Graph: - return self._init_graph - - @property - def observed_variables(self) -> Set[Column]: - return self._variables - - @property - def latent_variables(self) -> Set[Column]: - return self._latents - - @property - def state_variables(self) -> Dict[str, Any]: - return self._state_variables - - def add_state_variable(self, name: str, var: Any) -> None: + observed_variables: Set[Column] + latent_variables: Set[Column] + state_variables: Dict[str, Any] + init_graph: Graph = field(compare=False) + included_edges: nx.Graph = field(compare=False) + excluded_edges: nx.Graph = field(compare=False) + + ######################################################## + # for interventional data + ######################################################## + # the number of distributions we expect to have access to + num_distributions: int = field(default=1) + + # whether or not observational distribution is present + obs_distribution: bool = field(default=True) + + # (optional) known intervention targets, corresponding to nodes in the graph + intervention_targets: List[Tuple[Column]] = field(default_factory=list) + + # (optional) mapping F-nodes to their symmetric difference intervention targets + symmetric_diff_map: Dict[Any, FrozenSet] = field(default_factory=dict) + + # sigma-map mapping F-nodes to their distribution indices + sigma_map: Dict[Any, Tuple] = field(default_factory=dict) + f_nodes: List = field(default_factory=list) + + def add_state_variable(self, name: str, var: Any) -> "Context": """Add a state variable. Called by an algorithm to persist data objects that @@ -105,22 +101,54 @@ def add_state_variable(self, name: str, var: Any) -> None: var : any Any state variable. """ - self._state_variables[name] = var + self.state_variables[name] = var + return self - def state_variable(self, name: str) -> Any: + def state_variable(self, name: str, on_missing: str = "raise") -> Any: """Get a state variable. Parameters ---------- name : str The name of the state variable. + on_missing : one of {'raise', 'warn', 'ignore'} + Behavior if ``name`` is not in the dictionary of state variables. + If 'raise' (default) will raise a RuntimeError. If 'warn', will + raise a UserWarning. If 'ignore', will return `None`. Returns ------- state_var : Any The state variable. """ - if name not in self._state_variables: - raise RuntimeError(f"{name} is not a state variable: {self._state_variables}") - - return self._state_variables[name] + if name not in self.state_variables and on_missing != "ignore": + err_msg = f"{name} is not a state variable: {self.state_variables}" + if on_missing == "raise": + raise RuntimeError(err_msg) + elif on_missing == "warn": + warn(err_msg) + + return self.state_variables.get(name) + + def copy(self) -> "Context": + """Create a deepcopy of the context.""" + return Context(**self.get_params(deep=True)) + + ############################################################### + # Methods for interventional data. + ############################################################### + def get_non_f_nodes(self) -> Set: + """Get the set of non f-nodes.""" + non_f_nodes = set() + f_nodes = set(self.f_nodes) + for node in self.init_graph.nodes: + if node not in f_nodes: + non_f_nodes.add(node) + return non_f_nodes + + def reverse_sigma_map(self) -> Dict: + """Get the reverse sigma-map.""" + reverse_map = dict() + for node, mapping in self.sigma_map.items(): + reverse_map[mapping] = node + return reverse_map diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index dd331e0be..ea8f9b406 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -1,30 +1,54 @@ -from copy import copy, deepcopy -from typing import Any, Dict, Optional, Set, Tuple, cast +import types +from copy import copy +from itertools import combinations +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, cast import networkx as nx +import numpy as np import pandas as pd from ._protocol import Graph from .context import Context from .typing import Column, NetworkxGraph +CALLABLES = types.FunctionType, types.MethodType + class ContextBuilder: - """A builder class for creating Context objects ergonomically. + """A builder class for creating observational data Context objects ergonomically. + + The ContextBuilder is meant solely to build Context objects that work + with observational datasets. The context builder provides a way to capture assumptions, domain knowledge, and data. This should NOT be instantiated directly. One should instead use `dodiscover.make_context` to build a Context data structure. """ - _graph: Optional[Graph] = None + _init_graph: Optional[Graph] = None _included_edges: Optional[NetworkxGraph] = None _excluded_edges: Optional[NetworkxGraph] = None _observed_variables: Optional[Set[Column]] = None _latent_variables: Optional[Set[Column]] = None _state_variables: Dict[str, Any] = dict() - def graph(self, graph: Graph) -> "ContextBuilder": + def __init__(self) -> None: + # perform an error-check on subclass definitions of ContextBuilder + for attribute, value in self.__class__.__dict__.items(): + if isinstance(value, CALLABLES) or isinstance(value, property): + continue + if attribute.startswith("__"): + continue + + if not hasattr(self, attribute[1:]): + raise RuntimeError( + f"Context objects has class attributes that do not have " + f"a matching class method to set the attribute, {attribute}. " + f"The form of the attribute must be '_' and a " + f"corresponding function name ''." + ) + + def init_graph(self, graph: Graph) -> "ContextBuilder": """Set the partial graph to start with. Parameters @@ -37,7 +61,47 @@ def graph(self, graph: Graph) -> "ContextBuilder": self : ContextBuilder The builder instance """ - self._graph = graph + self._init_graph = graph + return self + + def excluded_edges(self, exclude: Optional[NetworkxGraph]) -> "ContextBuilder": + """Set exclusion edge constraints to apply in discovery. + + Parameters + ---------- + excluded : Optional[NetworkxGraph] + Edges that should be excluded in the resultant graph + + Returns + ------- + self : ContextBuilder + The builder instance + """ + if self._included_edges is not None: + for u, v in exclude.edges: # type: ignore + if self._included_edges.has_edge(u, v): + raise RuntimeError(f"{(u, v)} is already specified as an included edge.") + self._excluded_edges = exclude + return self + + def included_edges(self, include: Optional[NetworkxGraph]) -> "ContextBuilder": + """Set inclusion edge constraints to apply in discovery. + + Parameters + ---------- + included : Optional[NetworkxGraph] + Edges that should be included in the resultant graph + + Returns + ------- + self : ContextBuilder + The builder instance + """ + if self._excluded_edges is not None: + for u, v in include.edges: # type: ignore + if self._excluded_edges.has_edge(u, v): + raise RuntimeError(f"{(u, v)} is already specified as an excluded edge.") + self._included_edges = include return self def edges( @@ -63,6 +127,46 @@ def edges( self._excluded_edges = exclude return self + def observed_variables(self, observed: Optional[Set[Column]] = None) -> "ContextBuilder": + """Set observed variables. + + Parameters + ---------- + observed : Optional[Set[Column]] + Set of observed variables, by default None. If neither ``latents``, + nor ``variables`` is set, then it is presumed that ``variables`` consists + of the columns of ``data`` and ``latents`` is the empty set. + """ + if self._latent_variables is not None and any( + obs_var in self._latent_variables for obs_var in observed # type: ignore + ): + raise RuntimeError( + f"Latent variables are set already {self._latent_variables}, " + f'which contain variables you are trying to set as "observed".' + ) + self._observed_variables = observed + return self + + def latent_variables(self, latents: Optional[Set[Column]] = None) -> "ContextBuilder": + """Set latent variables. + + Parameters + ---------- + latents : Optional[Set[Column]] + Set of latent "unobserved" variables, by default None. If neither ``latents``, + nor ``variables`` is set, then it is presumed that ``variables`` consists + of the columns of ``data`` and ``latents`` is the empty set. + """ + if self._observed_variables is not None and any( + latent_var in self._observed_variables for latent_var in latents # type: ignore + ): + raise RuntimeError( + f"Observed variables are set already {self._observed_variables}, " + f'which contain variables you are trying to set as "latent".' + ) + self._latent_variables = latents + return self + def variables( self, observed: Optional[Set[Column]] = None, @@ -145,13 +249,13 @@ def build(self) -> Context: if self._observed_variables is None: raise ValueError("Could not infer variables from data or given arguments.") - empty_graph = lambda: nx.empty_graph(self._observed_variables, create_using=nx.Graph) + empty_graph = self._empty_graph_func(self._observed_variables) return Context( - init_graph=self._interpolate_graph(), + init_graph=self._interpolate_graph(self._observed_variables), included_edges=self._included_edges or empty_graph(), excluded_edges=self._excluded_edges or empty_graph(), - variables=self._observed_variables, - latents=self._latent_variables or set(), + observed_variables=self._observed_variables, + latent_variables=self._latent_variables or set(), state_variables=self._state_variables, ) @@ -166,7 +270,7 @@ def _interpolate_variables( if observed is not None and latents is not None: if columns - set(observed) != set(latents): raise ValueError( - "If observed and latents are set, then they must be " + "If observed and latents are both set, then they must " "include all columns in data." ) elif observed is None and latents is not None: @@ -183,26 +287,215 @@ def _interpolate_variables( latents = set(cast(Set[Column], latents)) return (observed, latents) - def _interpolate_graph(self) -> nx.Graph: + def _interpolate_graph(self, graph_variables) -> nx.Graph: if self._observed_variables is None: raise ValueError("Must set variables() before building Context.") - complete_graph = lambda: nx.complete_graph(self._observed_variables, create_using=nx.Graph) - has_all_variables = lambda g: set(g.nodes) == set(self._observed_variables) + complete_graph = lambda: nx.complete_graph(graph_variables, create_using=nx.Graph) + has_all_variables = lambda g: set(g.nodes).issuperset(set(self._observed_variables)) # initialize the starting graph - if self._graph is None: + if self._init_graph is None: return complete_graph() else: - if not has_all_variables(self._graph): + if not has_all_variables(self._init_graph): raise ValueError( - f"The nodes within the initial graph, {self._graph.nodes}, " + f"The nodes within the initial graph, {self._init_graph.nodes}, " f"do not match the nodes in the passed in data, {self._observed_variables}." ) - return self._graph + return self._init_graph + + def _empty_graph_func(self, graph_variables) -> Callable: + empty_graph = lambda: nx.empty_graph(graph_variables, create_using=nx.Graph) + return empty_graph -def make_context(context: Optional[Context] = None) -> ContextBuilder: +class InterventionalContextBuilder(ContextBuilder): + """A builder class for creating observational+interventional data Context objects. + + The InterventionalContextBuilder is meant solely to build Context objects that work + with observational + interventional datasets. + + The context builder provides a way to capture assumptions, domain knowledge, + and data. This should NOT be instantiated directly. One should instead use + `dodiscover.make_context` to build a Context data structure. + + Notes + ----- + The number of distributions and/or interventional targets must be set in order + to build the `Context` object here. + """ + + _intervention_targets: List[Tuple[Column]] = [] + _num_distributions: Optional[int] = None + _obs_distribution: bool = True + + def obs_distribution(self, has_obs_distrib: bool): + """Whether or not we have access to the observational distribution.""" + self._obs_distribution = has_obs_distrib + return self + + def num_distributions(self, num_distribs: int): + """Set the number of data distributions we are expected to have access to. + + Note this must include observational too if observational is assumed present. + To assume that we do not have access to observational data, use the + :meth:`InterventionalContextBuilder.obs_distribution` to turn off that assumption. + + Parameters + ---------- + num_distribs : int + Number of distributions we will have access to. Will set the number of + distributions to be ``num_distribs + 1`` if ``_obs_distribution is True`` (default). + """ + if len(self._intervention_targets) > 0 and ( + len(self._intervention_targets) + int(self._obs_distribution) != num_distribs + ): + raise RuntimeError( + f"Setting the number of distributions {num_distribs} does not match the number of " + f"intervention targets {len(self._intervention_targets)}." + ) + self._num_distributions = num_distribs + return self + + def intervention_targets(self, targets: List[Tuple[Column]]): + """Set known intervention targets of the data. + + Will also automatically infer the F-nodes that will be present + in the graph. For more information on F-nodes see ``pywhy-graphs``. + + Parameters + ---------- + interventions : List of tuples + A list of tuples of nodes that are known intervention targets. + Assumes that the order of the interventions marked are those of the + passed in the data. + + If intervention targets are unknown, then this is not necessary. + """ + if ( + self._num_distributions is not None + and len(targets) + int(self._obs_distribution) != self._num_distributions + ): + raise RuntimeError( + f"Setting the number of intervention targets {targets} does not match the " + f"number of distributions set {self._num_distributions} (it is assumed " + f"there are {int(self._obs_distribution)} observational distributions)." + ) + self._intervention_targets = targets + self._num_distributions = len(targets) + int(self._obs_distribution) + return self + + def build(self) -> Context: + """Build the Context object. + + Returns + ------- + context : Context + The populated Context object. + """ + if self._observed_variables is None: + raise ValueError("Could not infer variables from data or given arguments.") + if self._num_distributions is None: + raise ValueError( + "There is no intervention context set. Are you sure you are using " + "the right contextbuilder? If you only have observational data " + "use `ContextBuilder` instead of `InterventionContextBuilder`." + ) + + # get F-nodes and sigma-map + f_nodes, sigma_map, symmetric_diff_map = self._create_augmented_nodes() + graph_variables = set(self._observed_variables).union(set(f_nodes)) + + empty_graph = self._empty_graph_func(graph_variables) + return Context( + init_graph=self._interpolate_graph(graph_variables), + included_edges=self._included_edges or empty_graph(), + excluded_edges=self._excluded_edges or empty_graph(), + observed_variables=self._observed_variables, + latent_variables=self._latent_variables or set(), + state_variables=self._state_variables, + intervention_targets=self._intervention_targets, + f_nodes=f_nodes, + sigma_map=sigma_map, + symmetric_diff_map=symmetric_diff_map, + obs_distribution=self._obs_distribution, + num_distributions=self._num_distributions, + ) + + def _create_augmented_nodes(self) -> Tuple[List, Dict, Dict]: + """Create augmented nodes, sigma map and optionally a symmetric difference map. + + Given a number of distributions attributed to interventions, one constructs + F-nodes to add to the causal graph via one of two procedures: + + - (known targets): For all pairs of intervention targets, form the + symmetric difference and then assign this to a new F-node. + This is ``n_targets choose 2`` + - (unknown targets): For all pairs of incoming distributions, form + a new F-node. This is ``n_distributions choose 2`` + + The difference is the additional information is encoded in the known + targets case. That is we know the symmetric difference mapping for each + F-node. + + Returns + ------- + Tuple[List, Dict[Any, Tuple], Dict[Any, FrozenSet]] + _description_ + """ + augmented_nodes = [] + sigma_map = dict() + symmetric_diff_map = dict() + + # add the empty intervention if there is assumed observational data + if self._obs_distribution: + distribution_targets_idx = [0] + else: + distribution_targets_idx = [] + + # now map all distribution targets to their indexed distribution + int_dist_idx = np.arange(int(self._obs_distribution), self._num_distributions).tolist() + distribution_targets_idx.extend(int_dist_idx) + + # store known-targets, which are sets of nodes + targets = [] + if len(self._intervention_targets) > 0: + if self._obs_distribution: + targets.append(()) + targets.extend(copy(list(self._intervention_targets))) # type: ignore + + for idx, (jdx, kdx) in enumerate(combinations(distribution_targets_idx, 2)): + if jdx == kdx: + continue + f_node = ("F", idx) + augmented_nodes.append(f_node) + sigma_map[f_node] = (jdx, kdx) + + # if we additionally know the intervention targets + if len(self._intervention_targets) > 0: + print(jdx, kdx, len(targets), distribution_targets_idx) + i_target: Set = set(targets[jdx]) + j_target: Set = set(targets[kdx]) + + # form symmetric difference and store its frozenset + # (so that way order is not important) + f_node_targets = frozenset(i_target.symmetric_difference(j_target)) + symmetric_diff_map[f_node] = f_node_targets + return augmented_nodes, sigma_map, symmetric_diff_map + + def _interpolate_graph(self, graph_variables) -> nx.Graph: + init_graph = super()._interpolate_graph(graph_variables) + + # do error-check + if not all(node in init_graph for node in graph_variables): + raise RuntimeError( + "Not all nodes (observational and f-nodes) are part of the init graph." + ) + return init_graph + + +def make_context(context: Optional[Context] = None, create_using=ContextBuilder) -> ContextBuilder: """Create a new ContextBuilder instance. Returns @@ -216,11 +509,22 @@ def make_context(context: Optional[Context] = None) -> ContextBuilder: variables, ``(1, 2, 3)``. >>> context_builder = make_context() >>> context = context_builder.variables([1, 2, 3]).build() + + Notes + ----- + `Context` objects are dataclasses that creates a dictionary-like access + to causal context metadata. Copying relevant information from a `Context` + object into a `ContextBuilder` is all supported with the exception of + state variables. State variables are not copied over. To set state variables + again, one must build the Context and then call :meth:`Context.state_variable`. """ - result = ContextBuilder() + result = create_using() if context is not None: - result.graph(deepcopy(context.init_graph)) - result.edges(deepcopy(context.included_edges), deepcopy(context.excluded_edges)) - result.variables(copy(context.observed_variables), copy(context.latent_variables)) - result.state_variables(deepcopy(context.state_variables)) + # we create a copy of the ContextBuilder with the current values + # in the context + ctx_params = context.get_params() + for param, value in ctx_params.items(): + if getattr(result, param, None) is not None: + getattr(result, param)(value) + return result diff --git a/dodiscover/metrics.py b/dodiscover/metrics.py index 28d683efe..f47b636e3 100644 --- a/dodiscover/metrics.py +++ b/dodiscover/metrics.py @@ -15,7 +15,7 @@ def confusion_matrix_networks( true_graph: Graph, pred_graph: Graph, labels: Optional[NDArray] = None, - normalize: str = None, + normalize: Optional[str] = None, ): """Compute the confusion matrix comparing a predicted graph from the true graph. diff --git a/dodiscover/typing.py b/dodiscover/typing.py index ddbbd3d69..4a90b9f0a 100644 --- a/dodiscover/typing.py +++ b/dodiscover/typing.py @@ -1,9 +1,9 @@ -from typing import Dict, List, Set, Union +from typing import Dict, List, Set, Tuple, Union import networkx as nx # Pandas DataFrame columns that are also compatible with Graph nodes -Column = Union[int, float, str] +Column = Union[None, int, float, str, Tuple] # The separating set used in constraint-based causal discovery SeparatingSet = Dict[Column, Dict[Column, List[Set[Column]]]] diff --git a/examples/README.txt b/examples/README.txt index 141afd482..77b91b485 100644 --- a/examples/README.txt +++ b/examples/README.txt @@ -1,3 +1,5 @@ +.. _general_examples: + Examples -------- diff --git a/pyproject.toml b/pyproject.toml index c16e394d4..d7134cc91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -201,7 +201,7 @@ convention = 'numpy' ignore-decorators = '(copy_doc|property|.*setter|.*getter|pyqtSlot|Slot)' match = '^(?!setup|__init__|test_).*\.py' match-dir = '^dodiscover.*' -add_ignore = 'D100,D104,D107' +add_ignore = 'D100,D104,D105,D107' [tool.mypy] ignore_missing_imports = true diff --git a/tests/unit_tests/constraint/test_intervene_skeleton.py b/tests/unit_tests/constraint/test_intervene_skeleton.py new file mode 100644 index 000000000..52457e986 --- /dev/null +++ b/tests/unit_tests/constraint/test_intervene_skeleton.py @@ -0,0 +1,62 @@ +import networkx as nx +import pywhy_graphs as pgraphs + +from dodiscover import InterventionalContextBuilder, make_context +from dodiscover.ci import Oracle +from dodiscover.constraint.skeleton import LearnInterventionSkeleton +from dodiscover.constraint.utils import dummy_sample + + +def test_fnode_skeleton(): + """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`.""" + # first create the oracle + directed_edges = [ + ("x", "w"), + ("w", "y"), + ("z", "y"), + ] + bidirected_edges = [("x", "z"), ("z", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = LearnInterventionSkeleton( + ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True + ) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .intervention_targets([("x",)]) + .build() + ) + learner.fit(data, context) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph") + + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + +def test_fnode_skeleton_errors(): + pass diff --git a/tests/unit_tests/constraint/test_skeleton.py b/tests/unit_tests/constraint/test_skeleton.py index 0b622e85e..dff8fe9e2 100644 --- a/tests/unit_tests/constraint/test_skeleton.py +++ b/tests/unit_tests/constraint/test_skeleton.py @@ -3,7 +3,6 @@ import pandas as pd import pytest import pywhy_graphs -from flaky import flaky from dodiscover import make_context from dodiscover.ci import GSquareCITest, Oracle @@ -105,12 +104,13 @@ def test_learn_skeleton_with_data(indep_test_func, data_matrix, g_answer): assert skel_graph.has_edge(*edge), error_msg +@pytest.mark.parametrize("skel_method", [LearnSkeleton, LearnSemiMarkovianSkeleton]) @pytest.mark.parametrize("G", [collider(), common_cause_and_collider(), complex_graph()]) -def test_learn_skeleton_oracle(G): +def test_learn_skeleton_oracle(G, skel_method): df = dummy_sample(G) oracle = Oracle(G) alpha = 0.05 - alg = LearnSkeleton(ci_estimator=oracle, alpha=alpha) + alg = skel_method(ci_estimator=oracle, alpha=alpha) context = make_context().variables(data=df).build() alg.fit(df, context) @@ -121,7 +121,63 @@ def test_learn_skeleton_oracle(G): assert nx.is_isomorphic(skel_graph, G.to_undirected()) -@flaky +def test_learn_skeleton_pds_disabled_first_stage(): + """Test that we can disable the first stage of the algorithm.""" + # reconstruct the PAG the way FCI would + edge_list = [("D", "A"), ("B", "E"), ("F", "B"), ("C", "F"), ("C", "H"), ("H", "D")] + latent_edge_list = [("A", "B"), ("D", "E")] + graph = pywhy_graphs.ADMG( + incoming_directed_edges=edge_list, incoming_bidirected_edges=latent_edge_list + ) + ci_estimator = Oracle(graph) + sample = dummy_sample(graph) + context = make_context().variables(data=sample).build() + + # generate the expected PAG + edge_list = [ + ("A", "B"), + ("D", "A"), + ("B", "E"), + ("B", "F"), + ("F", "C"), + ("C", "H"), + ("H", "D"), + ("D", "E"), + ("A", "E"), # Note: this is the extra edge + ] + expected_skel = nx.Graph(edge_list) + + # learn the skeleton of the graph now with the first stage skeleton + alg = LearnSemiMarkovianSkeleton(ci_estimator=ci_estimator, second_stage_skeleton_method=None) + alg.fit(sample, context) + assert alg.context_.state_variable("PAG", on_missing="ignore") is None + assert nx.is_isomorphic(expected_skel, alg.adj_graph_) + + +@pytest.mark.parametrize("skel_method", [LearnSkeleton, LearnSemiMarkovianSkeleton]) +def test_method_does_not_change_context(skel_method): + # reconstruct the PAG the way FCI would + edge_list = [("D", "A")] + latent_edge_list = [("A", "B"), ("D", "E")] + graph = pywhy_graphs.ADMG( + incoming_directed_edges=edge_list, incoming_bidirected_edges=latent_edge_list + ) + ci_estimator = Oracle(graph) + sample = dummy_sample(graph) + context = make_context().variables(data=sample).build() + context_copy = context.copy() + + # after the first stage, we learn a skeleton as in Figure 16 + firstalg = skel_method(ci_estimator=ci_estimator) + firstalg.fit(sample, context) + + # context should not change as a copy is made internally + assert context == context_copy + assert nx.is_isomorphic(context.init_graph, context_copy.init_graph) + assert nx.is_isomorphic(context.included_edges, context_copy.included_edges) + assert nx.is_isomorphic(context.excluded_edges, context_copy.excluded_edges) + + def test_learn_pds_skeleton(): """Test example in Causation, Prediction and Search book. @@ -171,6 +227,8 @@ def test_learn_pds_skeleton(): latent_edge_list = [("A", "B"), ("D", "E")] uncertain_edge_list = [ ("A", "E"), + ("A", "D"), + ("E", "B"), ("E", "A"), ("B", "F"), ("F", "C"), @@ -179,24 +237,24 @@ def test_learn_pds_skeleton(): ("H", "C"), ("D", "H"), ] - first_stage_pag = pywhy_graphs.PAG( + exp_first_stage_pag = pywhy_graphs.PAG( edge_list, incoming_bidirected_edges=latent_edge_list, incoming_circle_edges=uncertain_edge_list, ) # learn the skeleton of the graph now with the first stage skeleton - context = ( - make_context(context) - .graph(first_stage_pag.to_undirected()) - .state_variable("PAG", first_stage_pag) - .build() - ) + print(context.init_graph.edges(data=True)) alg = LearnSemiMarkovianSkeleton(ci_estimator=ci_estimator) alg.fit(sample, context) - skel_graph = alg.adj_graph_ - # generate the expected PAG + # the first stage PAG should be equal to what we learned + first_stage_pag = alg.context_.state_variable("PAG") + for edge_type, subgraph in exp_first_stage_pag.get_graphs().items(): + assert nx.is_isomorphic(first_stage_pag.get_graphs(edge_type), subgraph) + + # now test that the expected skeleton is the same as the learned skeleton + skel_graph = alg.adj_graph_ edge_list = [ ("D", "A"), ("B", "E"), @@ -217,8 +275,9 @@ def test_learn_pds_skeleton(): incoming_bidirected_edges=latent_edge_list, incoming_circle_edges=uncertain_edge_list, ) - for edge in expected_pag.to_undirected().edges: + expected_skel = expected_pag.to_undirected() + for edge in expected_skel.edges: assert skel_graph.has_edge(*edge) for edge in skel_graph.edges: - assert expected_pag.to_undirected().has_edge(*edge) - assert nx.is_isomorphic(skel_graph, expected_pag.to_undirected()) + assert expected_skel.has_edge(*edge) + assert nx.is_isomorphic(skel_graph, expected_skel) diff --git a/tests/unit_tests/test_base.py b/tests/unit_tests/test_base.py new file mode 100644 index 000000000..5e89182bd --- /dev/null +++ b/tests/unit_tests/test_base.py @@ -0,0 +1,42 @@ +import pytest + +from dodiscover.base import BasePyWhy + +# TODO: add pickling tests + + +class MyLearner(BasePyWhy): + def __init__(self, l1=0, empty=None): + self.l1 = l1 + self.empty = empty + + +class K(BasePyWhy): + def __init__(self, c=None, d=None): + self.c = c + self.d = d + + +class T(BasePyWhy): + def __init__(self, a=None, b=None): + self.a = a + self.b = b + + +def test_str(): + # Smoke test the str of the base estimator + my_estimator = MyLearner() + str(my_estimator) + + +def test_get_params(): + test = T(K(), K) + + assert "a__d" in test.get_params(deep=True) + assert "a__d" not in test.get_params(deep=False) + + test.set_params(a__d=2) + assert test.a.d == 2 + + with pytest.raises(ValueError): + test.set_params(a__a=2) diff --git a/tests/unit_tests/test_context_builder.py b/tests/unit_tests/test_context_builder.py index 42e3feebb..a970ef92b 100644 --- a/tests/unit_tests/test_context_builder.py +++ b/tests/unit_tests/test_context_builder.py @@ -1,9 +1,13 @@ +import dataclasses +import math +from copy import copy, deepcopy + import networkx as nx import numpy as np import pandas as pd import pytest -from dodiscover import make_context +from dodiscover import ContextBuilder, InterventionalContextBuilder, make_context seed = 12345 @@ -24,12 +28,15 @@ def test_build_with_initial_graph(): graph = nx.DiGraph() graph.add_edges_from([("x", "y")]) data = make_df() - ctx = make_context().graph(graph).variables(data=data).build() + ctx = make_context().init_graph(graph).variables(data=data).build() assert ctx.init_graph is graph # if the initial graph does not match the variables passed in, then raise an error with pytest.raises(ValueError, match="The nodes within the initial graph*"): - make_context().graph(graph).variables(observed="x").build() + make_context().init_graph(graph).variables(observed="blah").build() + + # this should work since 'x' is in the subset of the initial graph + ctx = make_context().init_graph(graph).variables(observed="x").build() def test_build_with_observed_and_latents(): @@ -48,6 +55,16 @@ def test_build_with_observed_and_latents(): ctx = ctx_builder.variables(latents="x", data=df).build() assert ctx.observed_variables == {"y"} + cp_ctx_builder = make_context() + with pytest.raises(RuntimeError, match="Observed variables are set already"): + cp_ctx_builder.observed_variables({"x"}) + cp_ctx_builder.latent_variables({"x"}) + + cp_ctx_builder = deepcopy(ctx_builder) + with pytest.raises(RuntimeError, match="Latent variables are set already"): + cp_ctx_builder.latent_variables({"x"}) + cp_ctx_builder.observed_variables({"x"}) + def test_build_context_errors(): ctx_builder = make_context() @@ -61,5 +78,179 @@ def test_build_context_errors(): # if we specify latent and observed variables, they should match up with # the columns of the dataset - with pytest.raises(ValueError, match="If observed and latents are set"): + with pytest.raises(ValueError, match="If observed and latents are both set"): ctx_builder.variables(observed="x", latents="z", data=df) + + +def test_context_set_errors(): + ctx_builder = make_context() + df = make_df() + ctx = ctx_builder.variables(data=df).build() + + with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): + ctx.init_graph = nx.empty_graph(0) + + +def test_context_set_edges(): + ctx_builder = make_context() + df = make_df() + + # an error should be raised in inclusion/exclusion edges do not match + inc_graph = nx.Graph() + inc_graph.add_edge("x", "y") + ctx_builder.variables(data=df).included_edges(inc_graph) + with pytest.raises(RuntimeError, match="^(.*)is already specified as an included edge"): + ctx_builder.excluded_edges(inc_graph) + + inc_graph = nx.Graph() + ctx_builder = ctx_builder.included_edges(None) + inc_graph.add_edge("x", "y") + ctx_builder.excluded_edges(inc_graph) + + with pytest.raises(RuntimeError, match="^(.*) is already specified as an excluded edge"): + ctx_builder.included_edges(inc_graph) + + +class BadContextBuilder(ContextBuilder): + random_attribute: str = "hi" + + +def test_context_builder_extension_error(): + """All context builders should follow a specific pattern for definine private attributes.""" + + with pytest.raises(RuntimeError, match="Context objects has class attributes that do not have"): + BadContextBuilder().observed_variables(["x"]).build() + + +def test_context_set_get(): + ctx_builder = make_context() + df = make_df() + ctx = ( + ctx_builder.variables(data=df) + .init_graph(nx.empty_graph(df.columns)) + .included_edges(nx.DiGraph([("x", "y")])) + .build() + ) + + # making the contexBuilder with that context should result in the exact same copy + ctx2 = make_context(ctx).build() + assert ctx == ctx2 + + # directly setting fields should not be allowed + with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): + ctx.intervention_targets = ["new"] + + # however, altering via functions is fine + ctx.add_state_variable("new", 0) + assert ctx.state_variables == {"new": 0} + + # basic smoke-check of functionality of dataclasses + assert all( + x not in dataclasses.asdict(ctx) for x in ("get_f_nodes", "get_params", "get_sigma_map") + ) + + ctx_copy = ctx.copy() + assert ctx == ctx_copy + + +def test_context_state_variables(): + ctx_builder = make_context() + df = make_df() + ctx = ( + ctx_builder.variables(data=df) + .init_graph(nx.empty_graph(df.columns)) + .included_edges(nx.DiGraph([("x", "y")])) + .build() + ) + + with pytest.raises(RuntimeError, match="^(.*) is not a state variable:"): + ctx.state_variable("pag") + with pytest.warns(UserWarning, match="^(.*) is not a state variable:"): + ctx.state_variable("pag", on_missing="warn") + assert ctx.state_variable("pag", on_missing="ignore") is None + + +def test_context_interventions(): + ctx_builder = make_context(create_using=InterventionalContextBuilder) + df = make_df() + + # check InterventionalContextBuilder errors that should be raised + with pytest.raises(ValueError, match="There is no intervention context set"): + copy(ctx_builder).variables(data=df).init_graph( + nx.empty_graph(df.columns + ["blah"]) + ).build() + + with pytest.raises(RuntimeError, match="Not all nodes"): + copy(ctx_builder).variables(data=df).init_graph( + nx.empty_graph(list(df.columns) + ["blah"]) + ).num_distributions(5).build() + + with pytest.raises(RuntimeError, match="Setting the number of distribution"): + copy(ctx_builder).variables(data=df).intervention_targets([("x",)]).num_distributions( + 5 + ).build() + + with pytest.raises(RuntimeError, match="Setting the number of intervention targets"): + copy(ctx_builder).variables(data=df).num_distributions(5).intervention_targets( + [("x",)] + ).build() + + # check InterventionalContextBuilder building with + # known-interventional targets + # now build context + ctx = ( + copy(ctx_builder) + .variables(data=df) + .intervention_targets([("x",), ("x", "y"), ("y",)]) + .build() + ) + assert ctx.obs_distribution is True + assert len(ctx.intervention_targets) == 3 + expected_num_f_nodes = math.comb(4, 2) + assert len(ctx.sigma_map) == expected_num_f_nodes + assert len(ctx.f_nodes) == expected_num_f_nodes + assert ctx.symmetric_diff_map.keys() == ctx.sigma_map.keys() + for val in [("x",), ("x", "y"), ("y",)]: + assert frozenset(val) in ctx.symmetric_diff_map.values() + + # check that there are (4 choose 2) = 6 F-nodes + assert len(ctx.f_nodes) == 6 + + # now build context by also specifying number of distributions should be the same + ctx2 = ( + copy(ctx_builder) + .variables(data=df) + .num_distributions(4) + .intervention_targets([("x",), ("x", "y"), ("y",)]) + .build() + ) + assert ctx == ctx2 + + # making a copy should not change anything + ctx3 = make_context(ctx, create_using=InterventionalContextBuilder).build() + assert ctx == ctx3 + + # now build context without intervention targets + ctx = copy(ctx_builder).variables(data=df).num_distributions(4).build() + + # the symmetric diff map is now empty because we do not know the targets + assert ctx.symmetric_diff_map == dict() + assert set(ctx.sigma_map.keys()) == set(ctx.f_nodes) + + +def test_context_interventions_without_observational(): + ctx_builder = make_context(create_using=InterventionalContextBuilder) + df = make_df() + + # now build context without observational data + ctx = ( + copy(ctx_builder) + .variables(data=df) + .obs_distribution(False) + .num_distributions(3) + .intervention_targets([("x",), ("x", "y"), ("y",)]) + .build() + ) + + # check that there are (3 choose 2) = 3 F-nodes + assert len(ctx.f_nodes) == 3 From 32416a4f1748398f719dee2d9a245759caf479fa Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 14 Feb 2023 11:37:15 -0500 Subject: [PATCH 03/61] WIP Signed-off-by: Adam Li --- doc/constraint_causal_discovery.rst | 54 ++++++- doc/references.bib | 9 ++ doc/user_guide.rst | 1 + dodiscover/constraint/__init__.py | 2 +- dodiscover/constraint/fcialg.py | 39 ++++- dodiscover/constraint/intervention.py | 166 ++++++++++++--------- dodiscover/constraint/skeleton.py | 28 ++-- tests/unit_tests/constraint/test_fcialg.py | 76 +++++++++- tests/unit_tests/constraint/test_pcalg.py | 18 ++- 9 files changed, 296 insertions(+), 97 deletions(-) diff --git a/doc/constraint_causal_discovery.rst b/doc/constraint_causal_discovery.rst index 07a337a20..66d69fbc0 100644 --- a/doc/constraint_causal_discovery.rst +++ b/doc/constraint_causal_discovery.rst @@ -6,13 +6,51 @@ Constraint-based causal discovery .. currentmodule:: dodiscover.constraint -The following are a set of methods intended for regression in which -the target value is expected to be a linear combination of the features. -In mathematical notation, if :math:`\hat{y}` is the predicted -value. +The following are a set of methods intended for (non-parametric) structure learning +of causal graphs (i.e. causal discovery) given observational and/or interventional data +by checking constraints in the form of conditional independences (CI). At a high level +all constraint-based causal discovery, tests CI statements, where we use different CI +statistical tests to test the following null hypothesis: + +:math:`H_0: X \perp Y | Z` and :math:`H_A: X \not\perp Y | Z` + +For a given node ``X`` and ``Y`` in the underlying causal graph of interest, and +a conditioning set, ``Z``. CI tests can have a variety of different assumptions +that make one better than another in different settings and data assumptions. +For more information on the CI tests themselves, see :ref:`conditional_independence`. + +Fundamental Assumptions of Constraint-Based Causal Discovery +------------------------------------------------------------ +The fundamental assumptions of all algorithms in this section are the Markov property assumption +and the causal faithfulness assumption :footcite:`Spirtes1993` and :footcite:`Pearl_causality_2009`. +The Markov assumption states that all d-separation statements in the causal graph imply a +corresponding CI statement in the data. This is a core-assumption that users from graphical modeling +may be familiar with. On the other hand, the causal faithfulness assumption states that all +CI statements in the data map to a d-separation statement. That is, there are no accidental +CI that occur in the data, which are not represented by a d-separation statement in the underlying +causal graph. The causal faithfulness assumption is a very problematic assumption because in practice +one might have data that is very weakly dependent, such that a CI test under a specified :math:`\alpha` +level would fail to reject the null hypothesis and conclude the variables in question are CI. In higher +dimensions this can occur a large percentage of the time as demonstrated in :footcite:`uhler2013geometry`. + +Tackling constraint-based causal discovery is a large and active area of research. (Non-parametric) Markovian SCMs with Observational Data ------------------------------------------------------- +If one assumes that the underlying structural causal model (SCM) is Markovian, +then the Peter and Clarke (PC) algorithm has been shown to be sound and complete +for learning a completed partially directed acyclic graph (CPDAG) :footcite:`Meek1995`. + +The PC algorithm and its variants assume Markovianity, which is also known as +causal-sufficiency in the literature. In other words, it assumes a lack of latent +confounders, where there is no latent variable that is a confounder of the observed data. + +The PC algorithm learns a CPDAG in three stages: + +1. skeleton discovery: This first phase is the process of leveraging CI tests to test + edges for conditional independence. +2. unshielded triplet orientation: +3. deterministic path orientations: (Non-parametric) Semi-Markovian SCMs with Observational Data @@ -23,6 +61,14 @@ value. ---------------------------------------------- +Choosing the conditioning sets +------------------------------ +To describe. + +Hyperparameters and controlling overfitting +------------------------------------------- +To describe. + Robust learning --------------- Conservative orientations, etc. diff --git a/doc/references.bib b/doc/references.bib index 154de67a7..2f0ea855c 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -104,6 +104,15 @@ @article{Sen2017model year = {2017} } +@article{uhler2013geometry, + title={Geometry of the faithfulness assumption in causal inference}, + author={Uhler, Caroline and Raskutti, Garvesh and B{\"u}hlmann, Peter and Yu, Bin}, + journal={The Annals of Statistics}, + pages={436--463}, + year={2013}, + publisher={JSTOR} +} + @inproceedings{Yu2020Bregman, title = {Measuring the Discrepancy between Conditional Distributions: Methods, Properties and Applications}, author = {Yu, Shujian and Shaker, Ammar and Alesiani, Francesco and Principe, Jose}, diff --git a/doc/user_guide.rst b/doc/user_guide.rst index 66fbe10e7..7b7ecaaf8 100644 --- a/doc/user_guide.rst +++ b/doc/user_guide.rst @@ -15,6 +15,7 @@ User Guide :maxdepth: 3 constraint_causal_discovery.rst + conditional_independence.rst .. scores_causal_discovery.rst .. visualizations.rst .. datasets.rst diff --git a/dodiscover/constraint/__init__.py b/dodiscover/constraint/__init__.py index a4b3469ea..761edfc13 100644 --- a/dodiscover/constraint/__init__.py +++ b/dodiscover/constraint/__init__.py @@ -1,4 +1,4 @@ from .config import SkeletonMethods from .fcialg import FCI from .pcalg import PC -from .skeleton import LearnSemiMarkovianSkeleton, LearnSkeleton +from .skeleton import LearnInterventionSkeleton, LearnSemiMarkovianSkeleton, LearnSkeleton diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 2dcc6def7..22e0f7fe7 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -525,9 +525,10 @@ def _apply_rule7(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) def _apply_rule8(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: """Apply rule 8 of FCI algorithm. - If A -> u -> C, or A -o u -> C - and A o-> C, then orient A o-> C as A -> C. - + If: + - A -> u -> C, or A -o u -> C, (the second condition is only present with selection bias) + - and A o-> C, + - then orient A o-> C as A -> C. Parameters ---------- @@ -553,10 +554,18 @@ def _apply_rule8(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) if graph.has_edge(c, a, graph.circle_edge_name) and graph.has_edge( a, c, graph.directed_edge_name ): - # check that A -> u or A -o u - condition_one = graph.has_edge(a, u, graph.directed_edge_name) or graph.has_edge( + # check that A -> u + condition_one_Adirectu = graph.has_edge( + a, u, graph.directed_edge_name + ) and not graph.has_edge(u, a, graph.circle_edge_name) + # check that A -o u + # Note: this is not possible without first running R5-7 because a tail with a circle edge + # would not occur through any of the other rules. + condition_one_Acircleu = graph.has_edge( a, u, graph.circle_edge_name - ) + ) and not graph.has_edge(u, a) + condition_one = condition_one_Adirectu or condition_one_Acircleu + # check that u -> C condition_two = graph.has_edge(u, c, graph.directed_edge_name) and not graph.has_edge( c, u, graph.circle_edge_name @@ -784,6 +793,22 @@ def _apply_rules_1to10(self, graph: EquivalenceClass, sep_set: SeparatingSet): r9_add, r10_add, ] + if all(x in [u, a, c] for x in ["x6", "x4"]) and any(all_flags): + print(u, a, c) + print( + [ + r1_add, + r2_add, + r3_add, + r4_add, + r5_add, + r6_add, + r7_add, + r8_add, + r9_add, + r10_add, + ] + ) if any(all_flags) and not change_flag: logger.info(f"{change_flag} with " f"{all_flags}") change_flag = True @@ -801,7 +826,7 @@ def _apply_rules_1to10(self, graph: EquivalenceClass, sep_set: SeparatingSet): def learn_skeleton( self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None ) -> Tuple[nx.Graph, SeparatingSet]: - # # now compute all possibly d-separating sets and learn a better skeleton + # now compute all possibly d-separating sets and learn a better skeleton skel_alg = LearnSemiMarkovianSkeleton( self.ci_estimator, sep_set=sep_set, diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index ae6164137..4ed6f1c18 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -4,8 +4,9 @@ import pandas as pd from dodiscover._protocol import EquivalenceClass +from dodiscover.cd import BaseConditionalDiscrepancyTest from dodiscover.ci import BaseConditionalIndependenceTest -from dodiscover.constraint import SkeletonMethods +from dodiscover.constraint import LearnInterventionSkeleton, SkeletonMethods from dodiscover.context import Context from dodiscover.typing import SeparatingSet @@ -13,9 +14,79 @@ class PsiFCI(FCI): + """Interventional (Psi) FCI algorithm. + + The I-FCI (or Psi-FCI) algorithm is an algorithm that accepts + multiple sets of data that may pertain to observational and/or + multiple interventional datasets under a known (I-FCI), or unknown (Psi-FCI) + intervention target setting. Our API consolidates them here under + one class, but you can control the setting using our hyperparameter. + See :footcite:`Kocaoglu2019characterization` for more information on + I-FCI and :footcite:`Jaber2020causal` for more information on Psi-FCI. + + The Psi-FCI algorithm is complete for the Psi-PAG equivalence class. + However, the I-FCI has not been shown to be complete for the I-PAG + equivalence class. Note that the I-FCI algorithm may change without + notice. + + Parameters + ---------- + ci_estimator : Callable + The conditional independence test function. The arguments of the estimator should + be data, node, node to compare, conditioning set of nodes, and any additional + keyword arguments. + cd_estimator : BaseConditionalDiscrepancyTest + The conditional discrepancy test function. + alpha : float, optional + The significance level for the conditional independence test, by default 0.05. + min_cond_set_size : int, optional + Minimum size of the conditioning set, by default None, which will be set to '0'. + Used to constrain the computation spent on the algorithm. + max_cond_set_size : int, optional + Maximum size of the conditioning set, by default None. Used to limit + the computation spent on the algorithm. + max_combinations : int, optional + The maximum number of conditional independence tests to run from the set + of possible conditioning sets. By default None, which means the algorithm will + check all possible conditioning sets. If ``max_combinations=n`` is set, then + for every conditioning set size, 'p', there will be at most 'n' CI tests run + before the conditioning set size 'p' is incremented. For controlling the size + of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used + in conjunction with ``keep_sorted`` parameter to only test the "strongest" + dependences. + skeleton_method : SkeletonMethods + The method to use for testing conditional independence. Must be one of + ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. + apply_orientations : bool + Whether or not to apply orientation rules given the learned skeleton graph + and separating set per pair of variables. If ``True`` (default), will + apply Zhang's orientation rules R0-10, orienting colliders and certain + arrowheads and tails :footcite:`Zhang2008`. + max_iter : int + The maximum number of iterations through the graph to apply + orientation rules. + max_path_length : int, optional + The maximum length of any discriminating path, or None if unlimited. + pds_skeleton_method : SkeletonMethods + The method to use for learning the skeleton using PDS. Must be one of + ('pds', 'pds_path'). See Notes for more details. + known_intervention_targets : bool, optional + If `True`, then will run the I-FCI algorithm. If `False`, will run the + Psi-FCI algorithm. By default False. + ci_estimator_kwargs : dict + Keyword arguments for the ``ci_estimator`` function. + cd_estimator_kwargs : dict + Keyword arguments for the ``cd_estimator`` function. + + Notes + ----- + Selection bias is unsupported because it is still an active research area. + """ + def __init__( self, ci_estimator: BaseConditionalIndependenceTest, + cd_estimator: BaseConditionalDiscrepancyTest, alpha: float = 0.05, min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, @@ -26,71 +97,9 @@ def __init__( max_path_length: Optional[int] = None, pds_skeleton_method: SkeletonMethods = SkeletonMethods.PDS, known_intervention_targets: bool = False, - **ci_estimator_kwargs, + ci_estimator_kwargs=None, + cd_estimator_kwargs=None, ): - """Interventional (Psi) FCI algorithm. - - The I-FCI (or Psi-FCI) algorithm is an algorithm that accepts - multiple sets of data that may pertain to observational and/or - multiple interventional datasets under a known (I-FCI), or unknown (Psi-FCI) - intervention target setting. Our API consolidates them here under - one class, but you can control the setting using our hyperparameter. - See :footcite:`Kocaoglu2019characterization` for more information on - I-FCI and :footcite:`Jaber2020causal` for more information on Psi-FCI. - - The Psi-FCI algorithm is complete for the Psi-PAG equivalence class. - However, the I-FCI has not been shown to be complete for the I-PAG - equivalence class. Note that the I-FCI algorithm may change without - notice. - - Parameters - ---------- - ci_estimator : Callable - The conditional independence test function. The arguments of the estimator should - be data, node, node to compare, conditioning set of nodes, and any additional - keyword arguments. - alpha : float, optional - The significance level for the conditional independence test, by default 0.05. - min_cond_set_size : int, optional - Minimum size of the conditioning set, by default None, which will be set to '0'. - Used to constrain the computation spent on the algorithm. - max_cond_set_size : int, optional - Maximum size of the conditioning set, by default None. Used to limit - the computation spent on the algorithm. - max_combinations : int, optional - The maximum number of conditional independence tests to run from the set - of possible conditioning sets. By default None, which means the algorithm will - check all possible conditioning sets. If ``max_combinations=n`` is set, then - for every conditioning set size, 'p', there will be at most 'n' CI tests run - before the conditioning set size 'p' is incremented. For controlling the size - of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used - in conjunction with ``keep_sorted`` parameter to only test the "strongest" - dependences. - skeleton_method : SkeletonMethods - The method to use for testing conditional independence. Must be one of - ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. - apply_orientations : bool - Whether or not to apply orientation rules given the learned skeleton graph - and separating set per pair of variables. If ``True`` (default), will - apply Zhang's orientation rules R0-10, orienting colliders and certain - arrowheads and tails :footcite:`Zhang2008`. - max_iter : int - The maximum number of iterations through the graph to apply - orientation rules. - max_path_length : int, optional - The maximum length of any discriminating path, or None if unlimited. - selection_bias : bool - Whether or not to account for selection bias within the causal PAG. - See :footcite:`Zhang2008`. Currently not implemented. - pds_skeleton_method : SkeletonMethods - The method to use for learning the skeleton using PDS. Must be one of - ('pds', 'pds_path'). See Notes for more details. - known_intervention_targets : bool, optional - If `True`, then will run the I-FCI algorithm. If `False`, will run the - Psi-FCI algorithm. By default False. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. - """ super().__init__( ci_estimator, alpha, @@ -103,14 +112,37 @@ def __init__( max_path_length=max_path_length, selection_bias=False, pds_skeleton_method=pds_skeleton_method, - **ci_estimator_kwargs, + ci_estimator_kwargs=ci_estimator_kwargs, ) + self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets + self.cd_estimator_kwargs = cd_estimator_kwargs def learn_skeleton( self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None ) -> Tuple[nx.Graph, SeparatingSet]: - return super().learn_skeleton(data, context, sep_set) + # now compute all possibly d-separating sets and learn a better skeleton + skel_alg = LearnInterventionSkeleton( + self.ci_estimator, + self.cd_estimator, + sep_set=sep_set, + alpha=self.alpha, + min_cond_set_size=self.min_cond_set_size, + max_cond_set_size=self.max_cond_set_size, + max_combinations=self.max_combinations, + skeleton_method=self.skeleton_method, + second_stage_skeleton_method=self.pds_skeleton_method, + keep_sorted=False, + max_path_length=self.max_path_length, + ci_estimator_kwargs=self.ci_estimator_kwargs, + cd_estimator_kwargs=self.cd_estimator_kwargs, + ) + skel_alg.fit(data, context) + + skel_graph = skel_alg.adj_graph_ + sep_set = skel_alg.sep_set_ + self.n_ci_tests += skel_alg.n_ci_tests + return skel_graph, sep_set def fit(self, data: List[pd.DataFrame], context: Context): """Learn the relevant causal graph equivalence class. diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index f70320630..e1304e154 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -77,24 +77,28 @@ def _find_neighbors_along_path(G: nx.Graph, start, end) -> Set: The set of neighbors that are also along a path towards the 'end' node. """ - - def _assign_weight(u, v, edge_attr): - if u == node or v == node: - return np.inf - else: - return 1 - nbrs = set() + + # query all neighbors of X and then only add nodes that are in a valid path + # to end for node in G.neighbors(start): if not G.has_edge(start, node): raise RuntimeError(f"{start} and {node} are not connected, but they are assumed to be.") + # if we queried the edge we are testing, then pick that one + if node == end: + continue + # find a path from start node to end - path = nx.shortest_path(G, source=node, target=end, weight=_assign_weight) - if len(path) > 0: - if start in path: - raise RuntimeError("There is an error with the input. This is not possible.") - nbrs.add(node) + paths = nx.all_simple_paths(G, source=node, target=end) + for path in paths: + # the trivial path which indicates that 'node' is only connected to 'end' through 'start' + if path == (node, start, end): + continue + else: + # found a single path + nbrs.add(node) + break return nbrs diff --git a/tests/unit_tests/constraint/test_fcialg.py b/tests/unit_tests/constraint/test_fcialg.py index 01c133efb..785f4c8be 100644 --- a/tests/unit_tests/constraint/test_fcialg.py +++ b/tests/unit_tests/constraint/test_fcialg.py @@ -2,12 +2,14 @@ import networkx as nx import numpy as np +import pytest import pywhy_graphs import pywhy_graphs.networkx as pywhy_nx from pywhy_graphs import ADMG, PAG from dodiscover import FCI, make_context from dodiscover.ci import Oracle +from dodiscover.constraint.config import SkeletonMethods from dodiscover.constraint.utils import dummy_sample np.random.seed(12345) @@ -567,10 +569,6 @@ def test_fci_unobserved_confounder(self): assert set(pag.edges()) == set(expected_pag.edges()) - # expected_pag_digraph = expected_pag.compute_full_graph(to_networkx=True) - # pag_digraph = pag.compute_full_graph(to_networkx=True) - # assert nx.is_isomorphic(pag_digraph, expected_pag_digraph) - def test_fci_spirtes_example(self): """Test example in book. @@ -751,3 +749,73 @@ def test_fci_selection_bias(self): expected_pag.add_edge("D", "R", expected_pag.directed_edge_name) assert pag.nodes() == expected_pag.nodes() assert pag.edges() == expected_pag.edges() + + +@pytest.mark.parametrize( + "skeleton_method", [SkeletonMethods.NBRS, SkeletonMethods.NBRS_PATH, SkeletonMethods.COMPLETE] +) +@pytest.mark.parametrize("pds_skeleton_method", [SkeletonMethods.PDS_PATH, SkeletonMethods.PDS]) +def test_fci_complex(skeleton_method, pds_skeleton_method): + """ + Test FCI algorithm with more complex graph. + + Use Figure 2 from :footcite:`Colombo2012`. + + References + ---------- + .. footbibliography:: + """ + edge_list = [ + ("x4", "x1"), + ("x2", "x5"), + ("x3", "x2"), + ("x3", "x4"), + ("x2", "x6"), + ("x3", "x6"), + ("x4", "x6"), + ("x5", "x6"), + ] + latent_edge_list = [("x1", "x2"), ("x4", "x5")] + G = ADMG(edge_list, latent_edge_list) + sample = dummy_sample(G) + context = make_context().variables(data=sample).build() + oracle = Oracle(G) + ci_estimator = oracle + fci = FCI( + ci_estimator=ci_estimator, + max_iter=np.inf, + skeleton_method=skeleton_method, + pds_skeleton_method=pds_skeleton_method, + selection_bias=False, + ) + fci.fit(sample, context) + pag = fci.graph_ + + # double check the m-separation statement and PDS + assert pywhy_nx.m_separated(G, {"x1"}, {"x3"}, {"x4"}) + pdsep = pywhy_graphs.pds(G, "x1", "x3") + assert "x2" in pdsep + + expected_pag = PAG() + expected_pag.add_edges_from( + [("x6", "x5"), ("x2", "x3"), ("x4", "x3"), ("x6", "x4")], expected_pag.circle_edge_name + ) + expected_pag.add_edges_from( + [ + ("x4", "x1"), + ("x2", "x5"), + ("x3", "x2"), + ("x3", "x4"), + ("x2", "x6"), + ("x3", "x6"), + ("x4", "x6"), + ("x5", "x6"), + ], + expected_pag.directed_edge_name, + ) + expected_pag.add_edge("x1", "x2", expected_pag.bidirected_edge_name) + expected_pag.add_edge("x4", "x5", expected_pag.bidirected_edge_name) + + assert set(pag.edges()) == set(expected_pag.edges()) + for edge_type, subgraph in expected_pag.get_graphs().items(): + assert nx.is_isomorphic(subgraph, pag.get_graphs(edge_type)) diff --git a/tests/unit_tests/constraint/test_pcalg.py b/tests/unit_tests/constraint/test_pcalg.py index 60337a484..66d028c51 100644 --- a/tests/unit_tests/constraint/test_pcalg.py +++ b/tests/unit_tests/constraint/test_pcalg.py @@ -8,11 +8,25 @@ from dodiscover import make_context from dodiscover.ci import GSquareCITest, Oracle from dodiscover.constraint import PC +from dodiscover.constraint.config import SkeletonMethods from dodiscover.constraint.utils import dummy_sample from dodiscover.metrics import confusion_matrix_networks from dodiscover.testdata.testdata import bin_data, dis_data +@pytest.mark.parametrize( + "pc_kwargs", + [ + { + "min_cond_set_size": 0, + "max_cond_set_size": 3, + "max_combinations": 10, + "max_iter": 10, + "skeleton_method": SkeletonMethods.NBRS_PATH, + }, + {}, + ], +) @pytest.mark.parametrize( ("indep_test_func", "data_matrix", "g_answer", "alpha"), [ @@ -46,7 +60,7 @@ ), ], ) -def test_estimate_cpdag_testdata(indep_test_func, data_matrix, g_answer, alpha): +def test_estimate_cpdag_testdata(indep_test_func, data_matrix, g_answer, alpha, pc_kwargs): """Test PC algorithm for estimating the causal DAG. Test data is imported from pcalg, which is sensitive to the CI test @@ -56,7 +70,7 @@ def test_estimate_cpdag_testdata(indep_test_func, data_matrix, g_answer, alpha): """ data_df = pd.DataFrame(data_matrix) context = make_context().variables(data=data_df).build() - alg = PC(ci_estimator=indep_test_func, alpha=alpha) + alg = PC(ci_estimator=indep_test_func, alpha=alpha, **pc_kwargs) alg.fit(data_df, context) graph = alg.graph_ From 339bdad9e56e80c3c7bb72af756ea91f1b094520 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 14 Feb 2023 14:57:26 -0500 Subject: [PATCH 04/61] Merging Signed-off-by: Adam Li --- dodiscover/base.py | 4 ++-- dodiscover/constraint/__init__.py | 1 + dodiscover/constraint/fcialg.py | 4 ++-- dodiscover/constraint/skeleton.py | 3 ++- dodiscover/context.py | 6 +++--- dodiscover/context_builder.py | 9 +++++---- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/dodiscover/base.py b/dodiscover/base.py index 62599e39b..05c9879ee 100644 --- a/dodiscover/base.py +++ b/dodiscover/base.py @@ -126,8 +126,8 @@ def set_params(self, **params): Returns ------- - self : estimator instance - Estimator instance. + self : instance + Learner instance. """ if not params: # Simple optimization to gain speed (inspect is slow) diff --git a/dodiscover/constraint/__init__.py b/dodiscover/constraint/__init__.py index 761edfc13..2d4fdd511 100644 --- a/dodiscover/constraint/__init__.py +++ b/dodiscover/constraint/__init__.py @@ -1,4 +1,5 @@ from .config import SkeletonMethods from .fcialg import FCI +from .intervention import PsiFCI from .pcalg import PC from .skeleton import LearnInterventionSkeleton, LearnSemiMarkovianSkeleton, LearnSkeleton diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 22e0f7fe7..4c4d2bfa7 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -559,8 +559,8 @@ def _apply_rule8(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) a, u, graph.directed_edge_name ) and not graph.has_edge(u, a, graph.circle_edge_name) # check that A -o u - # Note: this is not possible without first running R5-7 because a tail with a circle edge - # would not occur through any of the other rules. + # Note: this is not possible without first running R5-7 because a tail with a + # circle edge would not occur through any of the other rules. condition_one_Acircleu = graph.has_edge( a, u, graph.circle_edge_name ) and not graph.has_edge(u, a) diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index e1304e154..a2d331a1c 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -92,7 +92,8 @@ def _find_neighbors_along_path(G: nx.Graph, start, end) -> Set: # find a path from start node to end paths = nx.all_simple_paths(G, source=node, target=end) for path in paths: - # the trivial path which indicates that 'node' is only connected to 'end' through 'start' + # the trivial path which indicates that 'node' is only connected to + # 'end' through 'start' if path == (node, start, end): continue else: diff --git a/dodiscover/context.py b/dodiscover/context.py index 71dc5f3c3..7df174669 100644 --- a/dodiscover/context.py +++ b/dodiscover/context.py @@ -34,7 +34,7 @@ class Context(BasePyWhy): Excluded edges without direction. state_variables : Dict Name of intermediate state variables during the learning process. - intervention_targets : list of tuples + intervention_targets : list of tuple List of intervention targets (known, or unknown), which correspond to the nodes in the graph (known), or indices of datasets that contain interventions (unknown). @@ -58,7 +58,7 @@ class Context(BasePyWhy): Currently, testing for equality is done on all attributes that are not graphs. Defining equality among graphs is ill-defined, and as such, we leave testing of the internal graphs to users. Some checks of equality - for example can be :func:`nx.is_isomorphic` for checking isomorphism + for example can be :func:`networkx.is_isomorphic` for checking isomorphism among two graphs. """ @@ -111,7 +111,7 @@ def state_variable(self, name: str, on_missing: str = "raise") -> Any: ---------- name : str The name of the state variable. - on_missing : one of {'raise', 'warn', 'ignore'} + on_missing : {'raise', 'warn', 'ignore'} Behavior if ``name`` is not in the dictionary of state variables. If 'raise' (default) will raise a RuntimeError. If 'warn', will raise a UserWarning. If 'ignore', will return `None`. diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index ea8f9b406..057a47744 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -323,7 +323,7 @@ class InterventionalContextBuilder(ContextBuilder): Notes ----- The number of distributions and/or interventional targets must be set in order - to build the `Context` object here. + to build the `dodiscover.Context` object here. """ _intervention_targets: List[Tuple[Column]] = [] @@ -512,11 +512,12 @@ def make_context(context: Optional[Context] = None, create_using=ContextBuilder) Notes ----- - `Context` objects are dataclasses that creates a dictionary-like access - to causal context metadata. Copying relevant information from a `Context` + `dodiscover.Context` objects are dataclasses that creates a dictionary-like access + to causal context metadata. Copying relevant information from a `dodiscover.Context` object into a `ContextBuilder` is all supported with the exception of state variables. State variables are not copied over. To set state variables - again, one must build the Context and then call :meth:`Context.state_variable`. + again, one must build the Context and then call + :meth:`dodiscover.Context.state_variable`. """ result = create_using() if context is not None: From 3d025916b7088bb3744ab40397b9fee3333e8e73 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 14 Feb 2023 16:24:01 -0500 Subject: [PATCH 05/61] Merge Signed-off-by: Adam Li --- tests/unit_tests/constraint/test_fcialg.py | 74 +--------------------- 1 file changed, 2 insertions(+), 72 deletions(-) diff --git a/tests/unit_tests/constraint/test_fcialg.py b/tests/unit_tests/constraint/test_fcialg.py index a63dffb5b..64c84ad4f 100644 --- a/tests/unit_tests/constraint/test_fcialg.py +++ b/tests/unit_tests/constraint/test_fcialg.py @@ -636,8 +636,8 @@ def test_fci_spirtes_example(self): assert nx.is_isomorphic(skel_graph.to_undirected(), expected_pag.to_undirected()) assert set(expected_pag.edges()) == set(pag.edges()) - @pytest.mark.parametrize("skeleton_method", [SkeletonMethods.NBRS, SkeletonMethods.COMPLETE]) - @pytest.mark.parametrize("pds_skeleton_method", [SkeletonMethods.PDS]) + @pytest.mark.parametrize("skeleton_method", [SkeletonMethods.NBRS, SkeletonMethods.NBRS_PATH, SkeletonMethods.COMPLETE]) + @pytest.mark.parametrize("pds_skeleton_method", [SkeletonMethods.PDS, SkeletonMethods.PDS_PATH]) @pytest.mark.parametrize("selection_bias", [True, False]) def test_fci_complex(self, skeleton_method, pds_skeleton_method, selection_bias): """ @@ -780,73 +780,3 @@ def test_fci_selection_bias(self): expected_pag.add_edge("D", "R", expected_pag.directed_edge_name) assert pag.nodes() == expected_pag.nodes() assert pag.edges() == expected_pag.edges() - - -@pytest.mark.parametrize( - "skeleton_method", [SkeletonMethods.NBRS, SkeletonMethods.NBRS_PATH, SkeletonMethods.COMPLETE] -) -@pytest.mark.parametrize("pds_skeleton_method", [SkeletonMethods.PDS_PATH, SkeletonMethods.PDS]) -def test_fci_complex(skeleton_method, pds_skeleton_method): - """ - Test FCI algorithm with more complex graph. - - Use Figure 2 from :footcite:`Colombo2012`. - - References - ---------- - .. footbibliography:: - """ - edge_list = [ - ("x4", "x1"), - ("x2", "x5"), - ("x3", "x2"), - ("x3", "x4"), - ("x2", "x6"), - ("x3", "x6"), - ("x4", "x6"), - ("x5", "x6"), - ] - latent_edge_list = [("x1", "x2"), ("x4", "x5")] - G = ADMG(edge_list, latent_edge_list) - sample = dummy_sample(G) - context = make_context().variables(data=sample).build() - oracle = Oracle(G) - ci_estimator = oracle - fci = FCI( - ci_estimator=ci_estimator, - max_iter=np.inf, - skeleton_method=skeleton_method, - pds_skeleton_method=pds_skeleton_method, - selection_bias=False, - ) - fci.fit(sample, context) - pag = fci.graph_ - - # double check the m-separation statement and PDS - assert pywhy_nx.m_separated(G, {"x1"}, {"x3"}, {"x4"}) - pdsep = pywhy_graphs.pds(G, "x1", "x3") - assert "x2" in pdsep - - expected_pag = PAG() - expected_pag.add_edges_from( - [("x6", "x5"), ("x2", "x3"), ("x4", "x3"), ("x6", "x4")], expected_pag.circle_edge_name - ) - expected_pag.add_edges_from( - [ - ("x4", "x1"), - ("x2", "x5"), - ("x3", "x2"), - ("x3", "x4"), - ("x2", "x6"), - ("x3", "x6"), - ("x4", "x6"), - ("x5", "x6"), - ], - expected_pag.directed_edge_name, - ) - expected_pag.add_edge("x1", "x2", expected_pag.bidirected_edge_name) - expected_pag.add_edge("x4", "x5", expected_pag.bidirected_edge_name) - - assert set(pag.edges()) == set(expected_pag.edges()) - for edge_type, subgraph in expected_pag.get_graphs().items(): - assert nx.is_isomorphic(subgraph, pag.get_graphs(edge_type)) From 1b4a18410f55087558db45e02e088f5dbb1f58ca Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 17 Feb 2023 16:48:43 -0500 Subject: [PATCH 06/61] Adding updated psifci working tests Signed-off-by: Adam Li --- .vscode/settings.json | 3 + doc/api.rst | 2 +- doc/conditional_independence.rst | 33 ++- doc/conf.py | 1 + doc/constraint_causal_discovery.rst | 78 +++++- doc/index.rst | 5 +- doc/references.bib | 75 ++++-- dodiscover/__init__.py | 2 +- dodiscover/_protocol.py | 6 +- dodiscover/ci/g_test.py | 8 +- dodiscover/constraint/__init__.py | 2 +- dodiscover/constraint/_classes.py | 19 +- dodiscover/constraint/config.py | 29 ++- dodiscover/constraint/fcialg.py | 35 +-- dodiscover/constraint/intervention.py | 206 +++++++++++++-- dodiscover/constraint/pcalg.py | 8 +- dodiscover/constraint/skeleton.py | 84 ++---- dodiscover/context_builder.py | 17 +- .../unit_tests/conditional/ci/test_g_test.py | 11 +- tests/unit_tests/constraint/__init__.py | 0 tests/unit_tests/constraint/test_fcialg.py | 33 ++- .../constraint/test_intervene_skeleton.py | 85 +++++- tests/unit_tests/constraint/test_pcalg.py | 4 +- tests/unit_tests/constraint/test_psifcialg.py | 243 ++++++++++++++++++ tests/unit_tests/test_context_builder.py | 6 +- 25 files changed, 777 insertions(+), 218 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 tests/unit_tests/constraint/__init__.py create mode 100644 tests/unit_tests/constraint/test_psifcialg.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..a7d0fc7b7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "esbonio.sphinx.confDir": "" +} \ No newline at end of file diff --git a/doc/api.rst b/doc/api.rst index 7c7b8b301..5c7331419 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -46,7 +46,7 @@ Constraint-based structure learning LearnSkeleton LearnSemiMarkovianSkeleton - SkeletonMethods + ConditioningSetSelection PC FCI diff --git a/doc/conditional_independence.rst b/doc/conditional_independence.rst index 133a16a36..026703a00 100644 --- a/doc/conditional_independence.rst +++ b/doc/conditional_independence.rst @@ -6,6 +6,34 @@ Conditional Independence .. currentmodule:: dodiscover.ci +Testing for invariances in the data, such as conditional independence (CI) can be represented graphically +in the form of d-separation statements under the causal faithfulness assumption. Given this, one +is interested in high-powered and well-controlled CI tests that can be used to test for CI in data. + +CI tests are framed as a statistical hypothesis test, with the following null hypothesis for a given +pair of variables ``(X, Y)`` and a conditioning set ``Z`` (which may be empty): + +:math:`H_0: X \perp Y | Z`, or written in terms of their distribution :math:`H_0: P(Y | X, Z) = P(Y | Z)` + +Similarly, the alternative hypothesis is written as: + +:math:`H_0: X \not\perp Y | Z`, or written in terms of their distribution :math:`H_0: P(Y | X, Z) \neq P(Y | Z)` + +Then typically, one posits an acceptable Type I error rate (false positive), typically :math:`\alpha = 0.05` +and then either attempts to sample from the null distribution, or characterizes the asymptotic distribution +of the test statistic. In both approaches a pvalue is computed, which is compared to :math:`\alpha`. The pvalue +states the "probability that we observe our data (e.g. test statistic) under the null hypothesis". By rejecting +the null hypothesis, one claims that :math:`X \not\perp Y | Z`, so that X and Y are in fact (conditionally) +dependent given Z. Note that if one fails to reject the null hypothesis, it is simply by convention that we +claim X and Y are conditionally independent. It is not necessarily the case, and it is plausible that there +is a weak dependency that is unable to be captured by our proposed CI test, and/or data samples. + +It is because of this reason, one would typically like the most powerful test given assumptions about +the data. With that in mind, there are various approaches to CI testing that are typically more powerful +with certain assumptions on the underlying data distribution. + +Conditional Mutual Information +------------------------------ TBD. Partial (Pearson) Correlation @@ -16,11 +44,10 @@ Discrete, Categorical and Binary Data ------------------------------------- TBD. - Kernel-Approaches ----------------- TBD. -Conditional Mutual Information ------------------------------- +Classifier-based Approaches +--------------------------- TBD. \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py index 69762332e..96511bff7 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -205,6 +205,7 @@ "joblib": ("https://joblib.readthedocs.io/en/latest", None), "matplotlib": ("https://matplotlib.org/stable", None), "torch": ("https://pytorch.org/docs/master/", None), + "pywhy_graphs": ("https://www.pywhy.org/pywhy-graphs/dev/", None), } intersphinx_timeout = 5 diff --git a/doc/constraint_causal_discovery.rst b/doc/constraint_causal_discovery.rst index 66d69fbc0..23f751c88 100644 --- a/doc/constraint_causal_discovery.rst +++ b/doc/constraint_causal_discovery.rst @@ -23,9 +23,12 @@ Fundamental Assumptions of Constraint-Based Causal Discovery ------------------------------------------------------------ The fundamental assumptions of all algorithms in this section are the Markov property assumption and the causal faithfulness assumption :footcite:`Spirtes1993` and :footcite:`Pearl_causality_2009`. + The Markov assumption states that all d-separation statements in the causal graph imply a corresponding CI statement in the data. This is a core-assumption that users from graphical modeling -may be familiar with. On the other hand, the causal faithfulness assumption states that all +may be familiar with. + +On the other hand, the causal faithfulness assumption states that all CI statements in the data map to a d-separation statement. That is, there are no accidental CI that occur in the data, which are not represented by a d-separation statement in the underlying causal graph. The causal faithfulness assumption is a very problematic assumption because in practice @@ -33,7 +36,8 @@ one might have data that is very weakly dependent, such that a CI test under a s level would fail to reject the null hypothesis and conclude the variables in question are CI. In higher dimensions this can occur a large percentage of the time as demonstrated in :footcite:`uhler2013geometry`. -Tackling constraint-based causal discovery is a large and active area of research. +Tackling violations of faithfulness in constraint-based causal discovery is a large and active +area of research. (Non-parametric) Markovian SCMs with Observational Data ------------------------------------------------------- @@ -41,29 +45,83 @@ If one assumes that the underlying structural causal model (SCM) is Markovian, then the Peter and Clarke (PC) algorithm has been shown to be sound and complete for learning a completed partially directed acyclic graph (CPDAG) :footcite:`Meek1995`. -The PC algorithm and its variants assume Markovianity, which is also known as -causal-sufficiency in the literature. In other words, it assumes a lack of latent +The :class:`dodiscover.PC` algorithm and its variants assume Markovianity, which is +also known as causal-sufficiency in the literature. In other words, it assumes a lack of latent confounders, where there is no latent variable that is a confounder of the observed data. The PC algorithm learns a CPDAG in three stages: 1. skeleton discovery: This first phase is the process of leveraging CI tests to test - edges for conditional independence. -2. unshielded triplet orientation: -3. deterministic path orientations: - + edges for conditional independence. Along the way, connections of the graph are trimmed + (when CI is detected) and the separating sets among pairs of variables are tracked. + + A separating set is a set of nodes in the graph that d-separate a pair of variables. + Note that a pair of variables may contain many d-separators, and thus there may be + many separating sets. +2. unshielded triplet orientation: This takes triplets on a path of the form ``X *-* Y *-* Z``, + where the triplet path is "unshielded" meaning ``X`` and ``Z`` are not connected. Then + it checks that ``Y`` is not in the separating set of X and Z. Given these two conditions, + Y must be a collider and is oriented as ``X *-> Y <-* Z``. The stars in the path indicate + that it can be any kind of edge endpoint (e.g. in a PAG it could be a circle endpoint edge). +3. deterministic path orientations: Once all colliders are oriented, there are a set of + deterministic logical rules that allow us to orient more edges. In the PC algorithm, + these are the so-called "Meek's orientation rules", which are 4 rules that are applied + repeatedly until no more changes to the graph are made :footcite:`Meek1995`. + +The resulting graph is an equivalence class of DAGs without latent confounders, the CPDAG. +For more information on CPDAGs, one can also see :class:`pywhy_graphs.CPDAG`. (Non-parametric) Semi-Markovian SCMs with Observational Data ------------------------------------------------------------ - +If one assumes that the underlying SCM is Semi-Markovian, then the "Fast Causal Inference" +(FCI) algorithm has been shown to be sound and complete for learning a partial ancestral +graph (PAG) :footcite:`zhang2008ancestralgraphs,Zhang2008`. + +The FCI algorithm and its variants assume Semi-Markovianity, which assumes the +possible presence of latent confounders and even selection bias in the observational data. + +The :class:`dodiscover.FCI` algorithm follows the three stages of learning that the PC +algorithm does, but with a few minor modifications that we will outline here: + +1. skeleton discovery: The skeleton discovery phase is now composed of two stages. The first + stage is the same as the PC algorithm. The second phase, takes the output graph of the first + phase and tries to orient colliders. This results in a PAG that can be queried for the + potentially d-separating (PDS) sets for any pair of variables ``(X, Y)``. The skeleton + discovery phase is restarted from scratch, but now the conditioning sets are chosen from + the PDS sets. The PDS set approach is described in :footcite:`Colombo2012` and + :footcite:`Spirtes1993`. +2. deterministic path orientations: The four orientation rules of the PC algorithm are still + the same, but in the FCI case, we add an additional six orientation rules. The additional + rules account for latent confounding and selection bias. Three of those rules + only apply if we assume selection bias is present. (Non-parametric) SCMs with Interventional Data ---------------------------------------------- +When we have access to experimental data, there are multiple datasets corresponding to multiple +distributions (e.g. observational and different interventions), we can improve causal discovery. +If one assumes we have access to multiple distributions, one may know the targets of +each intervention, where one can apply the I-FCI algorithm to learn an Interventional-PAG +(I-PAG) :footcite:`Kocaoglu2019characterization`. + +Alternatively, one may assume they do not know where the intervention was applied in each +distribution. In this case, one may apply the :math:`Psi`-FCI algorithm to learn a +:math:`Psi`-PAG :footcite:`Jaber2020causal`. +.. autosummary:: + :toctree: generated/ + + PsiFCI Choosing the conditioning sets ------------------------------ -To describe. +We briefly describe how ``dodiscover`` chooses conditioning sets, ``Z`` that are tested given +a pair of nodes ``(X, Y)``. The test we are doing is :math:`X \perp Y | Z`, where ``Z`` can +be the empty set. There are multiple strategies for choosing ``Z``. + +.. autosummary:: + :toctree: generated/ + + ConditioningSetSelection Hyperparameters and controlling overfitting ------------------------------------------- diff --git a/doc/index.rst b/doc/index.rst index a6956c290..de95af9fd 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -24,8 +24,9 @@ Contents :caption: Getting started: installation - api - use + Reference API + Usage + User Guide tutorials/index whats_new diff --git a/doc/references.bib b/doc/references.bib index 2f0ea855c..c52d35d08 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -16,21 +16,31 @@ @article{Colombo2012 url = {https://doi.org/10.1214/11-AOS940} } +@inproceedings{correa2020calculus, + title = {A calculus for stochastic interventions: Causal effect identification and surrogate experiments}, + author = {Correa, Juan and Bareinboim, Elias}, + booktitle = {Proceedings of the AAAI conference on artificial intelligence}, + volume = {34}, + number = {06}, + pages = {10093--10100}, + year = {2020} +} + @article{Jaber2020causal, - title={Causal discovery from soft interventions with unknown targets: Characterization and learning}, - author={Jaber, Amin and Kocaoglu, Murat and Shanmugam, Karthikeyan and Bareinboim, Elias}, - journal={Advances in neural information processing systems}, - volume={33}, - pages={9551--9561}, - year={2020} + title = {Causal discovery from soft interventions with unknown targets: Characterization and learning}, + author = {Jaber, Amin and Kocaoglu, Murat and Shanmugam, Karthikeyan and Bareinboim, Elias}, + journal = {Advances in neural information processing systems}, + volume = {33}, + pages = {9551--9561}, + year = {2020} } @article{Kocaoglu2019characterization, - title={Characterization and learning of causal graphs with latent variables from soft interventions}, - author={Kocaoglu, Murat and Jaber, Amin and Shanmugam, Karthikeyan and Bareinboim, Elias}, - journal={Advances in Neural Information Processing Systems}, - volume={32}, - year={2019} + title = {Characterization and learning of causal graphs with latent variables from soft interventions}, + author = {Kocaoglu, Murat and Jaber, Amin and Shanmugam, Karthikeyan and Bareinboim, Elias}, + journal = {Advances in Neural Information Processing Systems}, + volume = {32}, + year = {2019} } @article{Lopez2016revisiting, @@ -105,12 +115,12 @@ @article{Sen2017model } @article{uhler2013geometry, - title={Geometry of the faithfulness assumption in causal inference}, - author={Uhler, Caroline and Raskutti, Garvesh and B{\"u}hlmann, Peter and Yu, Bin}, - journal={The Annals of Statistics}, - pages={436--463}, - year={2013}, - publisher={JSTOR} + title = {Geometry of the faithfulness assumption in causal inference}, + author = {Uhler, Caroline and Raskutti, Garvesh and B{\"u}hlmann, Peter and Yu, Bin}, + journal = {The Annals of Statistics}, + pages = {436--463}, + year = {2013}, + publisher = {JSTOR} } @inproceedings{Yu2020Bregman, @@ -142,6 +152,17 @@ @article{Zhang2008 keywords = {Ancestral graphs, Automated causal discovery, Bayesian networks, Causal models, Markov equivalence, Latent variables} } +@article{zhang2008ancestralgraphs, + author = {Jiji Zhang}, + title = {Causal Reasoning with Ancestral Graphs}, + journal = {Journal of Machine Learning Research}, + year = {2008}, + volume = {9}, + number = {47}, + pages = {1437--1474}, + url = {http://jmlr.org/papers/v9/zhang08a.html} +} + @inproceedings{Zhang2011, author = {Zhang, Kun and Peters, Jonas and Janzing, Dominik and Sch\"{o}lkopf, Bernhard}, title = {Kernel-Based Conditional Independence Test and Application in Causal Discovery}, @@ -181,17 +202,17 @@ @book{Spirtes1993 } @article{xie2020generalized, - title = {Generalized independent noise condition for estimating latent variable causal graphs}, - author = {Xie, Feng and Cai, Ruichu and Huang, Biwei and Glymour, Clark and Hao, Zhifeng and Zhang, Kun}, - journal = {Advances in Neural Information Processing Systems}, - volume = {33}, - pages = {14891--14902}, - year = {2020} + title = {Generalized independent noise condition for estimating latent variable causal graphs}, + author = {Xie, Feng and Cai, Ruichu and Huang, Biwei and Glymour, Clark and Hao, Zhifeng and Zhang, Kun}, + journal = {Advances in Neural Information Processing Systems}, + volume = {33}, + pages = {14891--14902}, + year = {2020} } @article{dai2022independence, - title = {Independence Testing-Based Approach to Causal Discovery under Measurement Error and Linear Non-Gaussian Models}, - author = {Dai, Haoyue and Spirtes, Peter and Zhang, Kun}, - journal = {arXiv preprint arXiv:2210.11021}, - year = {2022} + title = {Independence Testing-Based Approach to Causal Discovery under Measurement Error and Linear Non-Gaussian Models}, + author = {Dai, Haoyue and Spirtes, Peter and Zhang, Kun}, + journal = {arXiv preprint arXiv:2210.11021}, + year = {2022} } diff --git a/dodiscover/__init__.py b/dodiscover/__init__.py index 50014dbb8..1ca3fc985 100644 --- a/dodiscover/__init__.py +++ b/dodiscover/__init__.py @@ -7,5 +7,5 @@ from . import metrics # noqa: F401 from ._protocol import EquivalenceClass, Graph from ._version import __version__ # noqa: F401 -from .constraint import FCI, PC +from .constraint import FCI, PC, PsiFCI from .context_builder import ContextBuilder, InterventionalContextBuilder, make_context diff --git a/dodiscover/_protocol.py b/dodiscover/_protocol.py index 91709e069..84e32defc 100644 --- a/dodiscover/_protocol.py +++ b/dodiscover/_protocol.py @@ -15,7 +15,7 @@ def edges(self, data=None) -> Iterable: """Return an iterable over edge tuples in graph.""" pass - def has_edge(self, u, v, edge_type) -> bool: + def has_edge(self, u, v, edge_type="any") -> bool: """Check if graph has an edge for a specific edge type.""" pass @@ -31,11 +31,11 @@ def remove_edges_from(self, edges) -> None: """Remove a set of edges from the graph.""" pass - def add_edge(self, u, v, edge_type) -> None: + def add_edge(self, u, v, edge_type="all") -> None: """Add an edge to the graph.""" pass - def remove_edge(self, u, v, edge_type) -> None: + def remove_edge(self, u, v, edge_type="all") -> None: """Remove an edge from the graph.""" pass diff --git a/dodiscover/ci/g_test.py b/dodiscover/ci/g_test.py index 5b30644fe..6bb42a7c7 100644 --- a/dodiscover/ci/g_test.py +++ b/dodiscover/ci/g_test.py @@ -382,7 +382,7 @@ def g_square_discrete( class GSquareCITest(BaseConditionalIndependenceTest): - def __init__(self, data_type: str = "binary"): + def __init__(self, data_type: str = "binary", levels: Optional[List] = None): r"""G squared CI test for discrete or binary data. For details of the test see :footcite:`Neapolitan2003`. @@ -392,6 +392,8 @@ def __init__(self, data_type: str = "binary"): data_type : str, optional The type of data, which can be "binary", or "discrete". By default "binary". + levels : List, optional + Levels of each column in the data matrix (as a list()). Notes ----- @@ -411,6 +413,7 @@ def __init__(self, data_type: str = "binary"): .. footbibliography:: """ self.data_type = data_type + self.levels = levels def test( self, @@ -418,7 +421,6 @@ def test( x_vars: Set[Column], y_vars: Set[Column], z_covariates: Optional[Set[Column]] = None, - levels: Optional[List] = None, ) -> Tuple[float, float]: """Abstract method for all conditional independence tests. @@ -450,7 +452,7 @@ def test( if self.data_type == "binary": stat, pvalue = g_square_binary(df, x_var, y_var, z_covariates) elif self.data_type == "discrete": - stat, pvalue = g_square_discrete(df, x_var, y_var, z_covariates, levels=levels) + stat, pvalue = g_square_discrete(df, x_var, y_var, z_covariates, levels=self.levels) else: raise ValueError( f"The acceptable data_type for G Square CI test is " diff --git a/dodiscover/constraint/__init__.py b/dodiscover/constraint/__init__.py index 2d4fdd511..f21aed4ce 100644 --- a/dodiscover/constraint/__init__.py +++ b/dodiscover/constraint/__init__.py @@ -1,4 +1,4 @@ -from .config import SkeletonMethods +from .config import ConditioningSetSelection from .fcialg import FCI from .intervention import PsiFCI from .pcalg import PC diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index dc3087e7c..764330104 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -7,9 +7,8 @@ import pandas as pd from dodiscover.ci.base import BaseConditionalIndependenceTest -from dodiscover.constraint.skeleton import LearnSkeleton, SkeletonMethods +from dodiscover.constraint.skeleton import ConditioningSetSelection, LearnSkeleton from dodiscover.context import Context -from dodiscover.context_builder import make_context from dodiscover.typing import Column, SeparatingSet from .._protocol import EquivalenceClass @@ -46,8 +45,6 @@ class BaseConstraintDiscovery: Whether or not to apply orientation rules given the learned skeleton graph and separating set per pair of variables. If ``True`` (default), will apply orientation rules for specific algorithm. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. Attributes ---------- @@ -69,13 +66,11 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, - **ci_estimator_kwargs, ): self.alpha = alpha self.ci_estimator = ci_estimator - self.ci_estimator_kwargs = ci_estimator_kwargs self.apply_orientations = apply_orientations self.skeleton_method = skeleton_method @@ -152,17 +147,14 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: Control over the constraints imposed by the algorithm can be passed into the class constructor. """ - self.context_ = make_context(context).build() - - # create a reference to the underlying data to be used - self.X_ = data + self.context_ = context.copy() # initialize graph object to apply learning self.separating_sets_ = self._initialize_sep_sets(self.context_.init_graph) # learn skeleton graph and the separating sets per variable graph, self.separating_sets_ = self.learn_skeleton( - self.X_, self.context_, self.separating_sets_ + data, self.context_, self.separating_sets_ ) # convert networkx.Graph to relevant causal graph object @@ -203,7 +195,7 @@ def evaluate_edge( """ if Z is None: Z = set() - test_stat, pvalue = self.ci_estimator.test(data, {X}, {Y}, Z, **self.ci_estimator_kwargs) + test_stat, pvalue = self.ci_estimator.test(data, {X}, {Y}, Z) return test_stat, pvalue def learn_skeleton( @@ -257,7 +249,6 @@ def learn_skeleton( max_combinations=self.max_combinations, skeleton_method=self.skeleton_method, keep_sorted=False, - **self.ci_estimator_kwargs, ) skel_alg.fit(data, context) diff --git a/dodiscover/constraint/config.py b/dodiscover/constraint/config.py index b78c335d2..ca3f07ed2 100644 --- a/dodiscover/constraint/config.py +++ b/dodiscover/constraint/config.py @@ -16,18 +16,39 @@ def __contains__(cls, item): return True -class SkeletonMethods(Enum, metaclass=MetaEnum): - """Available methods for learning a skeleton from data. +class ConditioningSetSelection(Enum, metaclass=MetaEnum): + """Available methods for selecting the conditioning sets when learning a skeleton. + + Given a pair of nodes in a graph, (X, Y), this enumeration selects a strategy + for choosing conditioning sets to be checked for conditional independence. Notes ----- Allows 'contains' checks because of the metaclass. For example, - one can do ``is 'complete' in SkeletonMethods``, which would - return True. + one can run ``"complete" in SkeletonMethods``, which would + return `True`. """ COMPLETE = "complete" + """Considers all possible combinations of nodes in the graph that are + not (X,Y). + """ + NBRS = "neighbors" + """Considers all current neighbors of (X,Y) in the graph. + """ + NBRS_PATH = "neighbors_path" + """Considers all neighbors of (X,Y) in the graph that are on a simple + path between the two nodes. + """ + PDS = "pds" + """Considers all potentially d-separating sets for (X,Y) in the graph. + This requires some initial collider information in the graph. + """ + PDS_PATH = "pds_path" + """Considers all PDS sets for (X,Y) in the graph that lie on a path + between the two nodes. + """ diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 3c0971317..de752d948 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -6,7 +6,7 @@ import pandas as pd from dodiscover.ci.base import BaseConditionalIndependenceTest -from dodiscover.constraint.config import SkeletonMethods +from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.skeleton import LearnSemiMarkovianSkeleton from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet @@ -67,8 +67,6 @@ class FCI(BaseConstraintDiscovery): pds_skeleton_method : SkeletonMethods The method to use for learning the skeleton using PDS. Must be one of ('pds', 'pds_path'). See Notes for more details. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. References ---------- @@ -91,13 +89,12 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, max_iter: int = 1000, max_path_length: Optional[int] = None, selection_bias: bool = True, - pds_skeleton_method: SkeletonMethods = SkeletonMethods.PDS, - **ci_estimator_kwargs, + pds_skeleton_method: ConditioningSetSelection = ConditioningSetSelection.PDS, ): super().__init__( ci_estimator, @@ -106,7 +103,6 @@ def __init__( max_cond_set_size=max_cond_set_size, max_combinations=max_combinations, skeleton_method=skeleton_method, - **ci_estimator_kwargs, ) self.max_iter = max_iter self.apply_orientations = apply_orientations @@ -747,7 +743,7 @@ def _apply_rule10( return added_arrows, a_to_u_path, a_to_v_path - def _apply_rules_1to10(self, graph: EquivalenceClass, sep_set: SeparatingSet): + def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingSet): idx = 0 finished = False while idx < self.max_iter and not finished: @@ -757,6 +753,7 @@ def _apply_rules_1to10(self, graph: EquivalenceClass, sep_set: SeparatingSet): for u in graph.nodes: for (a, c) in permutations(graph.neighbors(u), 2): logger.debug(f"Check {u} {a} {c}") + # apply R1-3 to orient triples and arrowheads r1_add = self._apply_rule1(graph, u, a, c) r2_add = self._apply_rule2(graph, u, a, c) @@ -797,22 +794,6 @@ def _apply_rules_1to10(self, graph: EquivalenceClass, sep_set: SeparatingSet): r9_add, r10_add, ] - if all(x in [u, a, c] for x in ["x6", "x4"]) and any(all_flags): - print(u, a, c) - print( - [ - r1_add, - r2_add, - r3_add, - r4_add, - r5_add, - r6_add, - r7_add, - r8_add, - r9_add, - r10_add, - ] - ) if any(all_flags) and not change_flag: logger.info(f"{change_flag} with " f"{all_flags}") change_flag = True @@ -842,7 +823,6 @@ def learn_skeleton( second_stage_skeleton_method=self.pds_skeleton_method, keep_sorted=False, max_path_length=self.max_path_length, - **self.ci_estimator_kwargs, ) skel_alg.fit(data, context) @@ -851,16 +831,13 @@ def learn_skeleton( self.n_ci_tests += skel_alg.n_ci_tests return skel_graph, sep_set - def fit(self, data: pd.DataFrame, context: Context) -> None: - super().fit(data, context) - def orient_edges(self, graph: EquivalenceClass): # orient colliders again self.orient_unshielded_triples(graph, self.separating_sets_) # run the rest of the rules to orient as many edges # as possible - self._apply_rules_1to10(graph, self.separating_sets_) + self._apply_orientation_rules(graph, self.separating_sets_) def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: import pywhy_graphs as pgraph diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index 4ed6f1c18..d44d4f8fd 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -1,4 +1,6 @@ -from typing import List, Optional, Tuple +import logging +from itertools import permutations +from typing import Any, Dict, FrozenSet, List, Optional, Tuple import networkx as nx import pandas as pd @@ -6,11 +8,14 @@ from dodiscover._protocol import EquivalenceClass from dodiscover.cd import BaseConditionalDiscrepancyTest from dodiscover.ci import BaseConditionalIndependenceTest -from dodiscover.constraint import LearnInterventionSkeleton, SkeletonMethods from dodiscover.context import Context -from dodiscover.typing import SeparatingSet +from dodiscover.typing import Column, SeparatingSet +from .config import ConditioningSetSelection from .fcialg import FCI +from .skeleton import LearnInterventionSkeleton + +logger = logging.getLogger() class PsiFCI(FCI): @@ -73,10 +78,6 @@ class PsiFCI(FCI): known_intervention_targets : bool, optional If `True`, then will run the I-FCI algorithm. If `False`, will run the Psi-FCI algorithm. By default False. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. - cd_estimator_kwargs : dict - Keyword arguments for the ``cd_estimator`` function. Notes ----- @@ -91,14 +92,12 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, max_iter: int = 1000, max_path_length: Optional[int] = None, - pds_skeleton_method: SkeletonMethods = SkeletonMethods.PDS, + pds_skeleton_method: ConditioningSetSelection = ConditioningSetSelection.PDS, known_intervention_targets: bool = False, - ci_estimator_kwargs=None, - cd_estimator_kwargs=None, ): super().__init__( ci_estimator, @@ -112,17 +111,15 @@ def __init__( max_path_length=max_path_length, selection_bias=False, pds_skeleton_method=pds_skeleton_method, - ci_estimator_kwargs=ci_estimator_kwargs, ) self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets - self.cd_estimator_kwargs = cd_estimator_kwargs def learn_skeleton( self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None ) -> Tuple[nx.Graph, SeparatingSet]: # now compute all possibly d-separating sets and learn a better skeleton - skel_alg = LearnInterventionSkeleton( + self.skeleton_learner_ = LearnInterventionSkeleton( self.ci_estimator, self.cd_estimator, sep_set=sep_set, @@ -134,14 +131,13 @@ def learn_skeleton( second_stage_skeleton_method=self.pds_skeleton_method, keep_sorted=False, max_path_length=self.max_path_length, - ci_estimator_kwargs=self.ci_estimator_kwargs, - cd_estimator_kwargs=self.cd_estimator_kwargs, ) - skel_alg.fit(data, context) + print(context) + self.skeleton_learner_.fit(data, context) - skel_graph = skel_alg.adj_graph_ - sep_set = skel_alg.sep_set_ - self.n_ci_tests += skel_alg.n_ci_tests + skel_graph = self.skeleton_learner_.adj_graph_ + sep_set = self.skeleton_learner_.sep_set_ + self.n_ci_tests += self.skeleton_learner_.n_ci_tests return skel_graph, sep_set def fit(self, data: List[pd.DataFrame], context: Context): @@ -168,19 +164,175 @@ def fit(self, data: List[pd.DataFrame], context: Context): raise RuntimeError("The input datasets must be in a Python list.") n_datasets = len(data) - intervention_targets = context.intervention_targets + n_distributions = context.num_distributions - if n_datasets - 1 != len(intervention_targets): + if n_datasets != n_distributions: raise RuntimeError( - f"There are {n_datasets} passed in, but {len(intervention_targets)} " - f"intervention targets. There must be a matching (number of datasets - 1) and " - f"intervention targets." + f"There are {n_datasets} passed in, but {n_distributions} " + f"total assumed distributions. There must be a matching number of datasets and " + f"'context.num_distributions'." ) super().fit(data, context) - def orient_edges(self, graph: EquivalenceClass): - return super().orient_edges(graph) + def _apply_rule11(self, graph: EquivalenceClass, f_nodes: List) -> Tuple[bool, List]: + """Apply "Rule 8" in I-FCI algorithm, which we call Rule 11. + + This orients all edges out of F-nodes. So patterns of the form + + ``('F', 0) *-* 'x'`` will become ``('F', 0) -> 'x'``. + + For original details of the rule, see :footcite:`Kocaoglu2019characterization`. + + Parameters + ---------- + graph : EquivalenceClass + The causal graph to apply rules to. + f_nodes : list + The list of f-nodes within the graph. + + Returns + ------- + added_arrows : bool + Whether or not arrows were added. + oriented_edges : List + A list of oriented edges. + + References + ---------- + .. footbibliography:: + """ + oriented_edges = [] + added_arrows = True + for node in f_nodes: + for nbr in graph.neighbors(node): + if nbr in f_nodes: + continue + + # remove all edges between node and nbr and orient this out + graph.remove_edge(node, nbr) + graph.remove_edge(nbr, node) + graph.add_edge(node, nbr, graph.directed_edge_name) + oriented_edges.append((node, nbr)) + return added_arrows, oriented_edges + + def _apply_rule12( + self, + graph: EquivalenceClass, + u: Column, + a: Column, + c: Column, + f_nodes: List, + symmetric_diff_map: Dict[Any, FrozenSet], + ) -> bool: + """Apply "Rule 9" of the I-FCI algorithm. + + Checks for inducing paths where 'u' is the F-node, and 'a' and 'c' are connected: + + 'u' -> 'a' *-* 'c' with 'u' -> 'c', then orient 'a' -> 'c'. + + For original details of the rule, see :footcite:`Kocaoglu2019characterization`. + + Parameters + ---------- + graph : EquivalenceClass + The causal graph. + u : Column + The candidate F-node + a : Column + Neighbors of the F-node. + c : Column + Neighbors of the F-node. + symmetric_diff_map : dict + A mapping from the F-nodes to the symmetric difference of the pair of + intervention targets each F-node represents. I.e. if F-node, F1 represents + the pair of intervention distributions with targets {'x'}, and {'x', 'y'}, + then F1 maps to {'y'} in the symmetric diff map. + + Returns + ------- + added_arrows : bool + Whether or not an orientation was made. + + References + ---------- + .. footbibliography:: + """ + added_arrows = False + if u in f_nodes and self.known_intervention_targets: + # get sigma map to map F-node to its symmetric difference target + S_set: FrozenSet = symmetric_diff_map.get(u, frozenset()) + + # check a *-* c + if ( + len(S_set) == 1 + and a in S_set + and (graph.has_edge(a, c) or graph.has_edge(c, a)) + and graph.has_edge(u, a) + and graph.has_edge(u, c) + ): + # remove all edges between a and c + graph.remove_edge(a, c) + graph.remove_edge(c, a) + + # then orient X -> Y + graph.add_edge(a, c, graph.directed_edge_name) + + added_arrows = True + return added_arrows + + def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingSet): + idx = 0 + finished = False + + # apply R11, which is called R8 in I-FCI / Psi-FCI orienting all F-nodes + f_nodes = self.context_.f_nodes + symmetric_diff_map = self.context_.symmetric_diff_map + _ = self._apply_rule11(graph, f_nodes) + + while idx < self.max_iter and not finished: + change_flag = False + logger.info(f"Running R1-10 for iteration {idx}") + + for u in graph.nodes: + for (a, c) in permutations(graph.neighbors(u), 2): + logger.debug(f"Check {u} {a} {c}") + + # apply R1-3 to orient triples and arrowheads + r1_add = self._apply_rule1(graph, u, a, c) + r2_add = self._apply_rule2(graph, u, a, c) + r3_add = self._apply_rule3(graph, u, a, c) + + # apply R4, orienting discriminating paths + r4_add, _ = self._apply_rule4(graph, u, a, c, sep_set) + + # apply R8 to orient more tails + r8_add = self._apply_rule8(graph, u, a, c) + + # apply R9-10 to orient uncovered potentially directed paths + r9_add, _ = self._apply_rule9(graph, a, u, c) + + # a and c are neighbors of u, so u is the endpoint desired + r10_add, _, _ = self._apply_rule10(graph, a, c, u) + + # apply R12, called R9 in I-FCI when we know the intervention targets + r12_add = self._apply_rule12(graph, u, a, c, f_nodes, symmetric_diff_map) + + # see if there was a change flag + all_flags = [r1_add, r2_add, r3_add, r4_add, r8_add, r9_add, r10_add, r12_add] + if any(all_flags) and not change_flag: + logger.info(f"{change_flag} with {all_flags}") + change_flag = True + + # check if we should continue or not + if not change_flag: + finished = True + if not self.selection_bias: + logger.info(f"Finished applying R1-4, and R8-10 with {idx} iterations") + if self.selection_bias: + logger.info(f"Finished applying R1-10 with {idx} iterations") + break + idx += 1 def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: import pywhy_graphs as pgraph diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index ec9e60201..6a7688b61 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -5,7 +5,7 @@ import networkx as nx from dodiscover.ci.base import BaseConditionalIndependenceTest -from dodiscover.constraint.config import SkeletonMethods +from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet @@ -56,8 +56,6 @@ class PC(BaseConstraintDiscovery): max_iter : int The maximum number of iterations through the graph to apply orientation rules. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. Attributes ---------- @@ -83,10 +81,9 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, max_iter: int = 1000, - **ci_estimator_kwargs, ): super().__init__( ci_estimator, @@ -95,7 +92,6 @@ def __init__( max_cond_set_size=max_cond_set_size, max_combinations=max_combinations, skeleton_method=skeleton_method, - **ci_estimator_kwargs, ) self.max_iter = max_iter self.apply_orientations = apply_orientations diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index a2d331a1c..17027e76e 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -11,7 +11,7 @@ from dodiscover.cd import BaseConditionalDiscrepancyTest from dodiscover.ci import BaseConditionalIndependenceTest, Oracle -from dodiscover.constraint.config import SkeletonMethods +from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet @@ -143,8 +143,6 @@ class LearnSkeleton: by its dependencies from strongest to weakest (i.e. largest CI test statistic value to lowest). This can be used in conjunction with ``max_combinations`` parameter to only test the "strongest" dependences. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. Attributes ---------- @@ -236,14 +234,12 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, keep_sorted: bool = False, - ci_estimator_kwargs=None, ) -> None: self.ci_estimator = ci_estimator self.sep_set = sep_set self.alpha = alpha - self.ci_estimator_kwargs = ci_estimator_kwargs self.skeleton_method = skeleton_method # control of the conditioning set @@ -266,9 +262,10 @@ def _initialize_params(self) -> None: if self.max_combinations is not None and self.max_combinations <= 0: raise RuntimeError(f"Max combinations must be at least 1, not {self.max_combinations}") - if self.skeleton_method not in SkeletonMethods: + if self.skeleton_method not in ConditioningSetSelection: raise ValueError( - f"Skeleton method must be one of {SkeletonMethods}, not {self.skeleton_method}." + f"Skeleton method must be one of {ConditioningSetSelection}, not " + f"{self.skeleton_method}." ) if self.sep_set is None and not hasattr(self, "sep_set_"): @@ -291,9 +288,6 @@ def _initialize_params(self) -> None: else: self.max_combinations_ = self.max_combinations - if self.ci_estimator_kwargs is None: - self.ci_estimator_kwargs = dict() - def evaluate_edge( self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None ) -> Tuple[float, float]: @@ -319,7 +313,7 @@ def evaluate_edge( """ if Z is None: Z = set() - test_stat, pvalue = self.ci_estimator.test(data, {X}, {Y}, Z, **self.ci_estimator_kwargs) + test_stat, pvalue = self.ci_estimator.test(data, {X}, {Y}, Z) self.n_ci_tests += 1 return test_stat, pvalue @@ -515,12 +509,12 @@ def _compute_candidate_conditioning_sets( """ skeleton_method = self.skeleton_method - if skeleton_method == SkeletonMethods.COMPLETE: + if skeleton_method == ConditioningSetSelection.COMPLETE: possible_variables = set(adj_graph.nodes) - elif skeleton_method == SkeletonMethods.NBRS: + elif skeleton_method == ConditioningSetSelection.NBRS: possible_variables = set(adj_graph.neighbors(x_var)) # possible_adjacencies.copy() - elif skeleton_method == SkeletonMethods.NBRS_PATH: + elif skeleton_method == ConditioningSetSelection.NBRS_PATH: # constrain adjacency set to ones with a path from x_var to y_var possible_variables = _find_neighbors_along_path(adj_graph, start=x_var, end=y_var) @@ -615,8 +609,6 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): to only test the "strongest" dependences. max_path_length : int, optional The maximum length of any discriminating path, or None if unlimited. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. Attributes ---------- @@ -680,11 +672,12 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, - second_stage_skeleton_method: Optional[SkeletonMethods] = SkeletonMethods.PDS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + second_stage_skeleton_method: Optional[ + ConditioningSetSelection + ] = ConditioningSetSelection.PDS, keep_sorted: bool = False, max_path_length: Optional[int] = None, - ci_estimator_kwargs=None, ) -> None: super().__init__( ci_estimator, @@ -695,7 +688,6 @@ def __init__( max_combinations, skeleton_method, keep_sorted, - ci_estimator_kwargs=ci_estimator_kwargs, ) self.second_stage_skeleton_method = second_stage_skeleton_method @@ -743,13 +735,13 @@ def _compute_candidate_conditioning_sets( raise RuntimeError("wtf..") skeleton_method = self.second_stage_skeleton_method - if skeleton_method == SkeletonMethods.PDS: + if skeleton_method == ConditioningSetSelection.PDS: # determine how we want to construct the candidates for separating nodes # perform conditioning independence testing on all combinations possible_variables = pgraph.pds( pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore ) - elif skeleton_method == SkeletonMethods.PDS_PATH: + elif skeleton_method == ConditioningSetSelection.PDS_PATH: # determine how we want to construct the candidates for separating nodes # perform conditioning independence testing on all combinations possible_variables = pgraph.pds_path( @@ -861,10 +853,6 @@ class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): to only test the "strongest" dependences. max_path_length : int, optional The maximum length of any discriminating path, or None if unlimited. - ci_estimator_kwargs : dict - Keyword arguments for the ``ci_estimator`` function. - cd_estimator_kwargs : dict - Keyword arguments for the ``cd_estimator`` function. Notes ----- @@ -890,13 +878,11 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: SkeletonMethods = SkeletonMethods.NBRS, - second_stage_skeleton_method: SkeletonMethods = SkeletonMethods.PDS, + skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + second_stage_skeleton_method: ConditioningSetSelection = ConditioningSetSelection.PDS, keep_sorted: bool = False, max_path_length: Optional[int] = None, known_intervention_targets: bool = False, - ci_estimator_kwargs=None, - cd_estimator_kwargs=None, ) -> None: super().__init__( ci_estimator, @@ -909,12 +895,10 @@ def __init__( second_stage_skeleton_method, keep_sorted, max_path_length, - ci_estimator_kwargs, ) self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets - self.cd_estimator_kwargs = cd_estimator_kwargs def evaluate_fnode_edge( self, @@ -965,14 +949,10 @@ def evaluate_fnode_edge( # indicates which distribution data came from if isinstance(self.cd_estimator, Oracle): # test graphically if Y is d-separated from F-node given Z - test_stat, pvalue = self.cd_estimator.test( - data, {group_col}, Y, Z, **self.cd_estimator_kwargs - ) + test_stat, pvalue = self.cd_estimator.test(data, {group_col}, Y, Z) else: # test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test( - data, Z, Y, group_col, **self.cd_estimator_kwargs - ) + test_stat, pvalue = self.cd_estimator.test(data, Z, Y, group_col) self.n_ci_tests += 1 return test_stat, pvalue @@ -1017,8 +997,6 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co adj_graph = self.context_.init_graph f_nodes = self.context_.f_nodes - print("Starting learning int skeleton: ", f_nodes) - # the size of the conditioning set will start off at the minimum size_cond_set = self.min_cond_set_size_ @@ -1058,22 +1036,6 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) continue - # TODO: allow ignoring fixed edges - # if self.context_.included_edges.has_edge(x_var, y_var): - # continue - # if self.context_.excluded_edges.has_edge(x_var, y_var): - # pvalue = 1.0 - # test_stat = 0.0 - - # # post-process the CI test results - # removed_edge = self._postprocess_ci_test( - # adj_graph, x_var, y_var, {}, test_stat, pvalue - # ) - - # # summarize the comparison of XY - # self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) - # continue - # compute the possible variables used in the conditioning set possible_variables = self._compute_candidate_conditioning_sets( adj_graph, @@ -1179,8 +1141,9 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: context : Context Context object. """ - if self.cd_estimator_kwargs is None: - self.cd_estimator_kwargs = dict() + # ensure data is a list + if isinstance(data, pd.DataFrame): + data = [data] # error-check the datasets passed in match the intervention contexts if len(data) != context.num_distributions: @@ -1188,7 +1151,8 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: f"The number of datasets does not match the number of interventions. " f"You passed in {len(data)} different datasets, whereas " f"there are {len(context.intervention_targets)} different interventions " - f"specified. It is assumed that the first dataset is observational, " + f"specified and {context.num_distributions} distributions assumed. " + f"It is assumed that the first dataset is observational, " f"while the rest are interventional." ) diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index 057a47744..0cfb2d186 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -1,7 +1,8 @@ import types from copy import copy from itertools import combinations -from typing import Any, Callable, Dict, List, Optional, Set, Tuple, cast +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union, cast +from warnings import warn import networkx as nx import numpy as np @@ -397,7 +398,7 @@ def build(self) -> Context: if self._observed_variables is None: raise ValueError("Could not infer variables from data or given arguments.") if self._num_distributions is None: - raise ValueError( + warn( "There is no intervention context set. Are you sure you are using " "the right contextbuilder? If you only have observational data " "use `ContextBuilder` instead of `InterventionContextBuilder`." @@ -407,6 +408,12 @@ def build(self) -> Context: f_nodes, sigma_map, symmetric_diff_map = self._create_augmented_nodes() graph_variables = set(self._observed_variables).union(set(f_nodes)) + # infer number of distributions + if self._num_distributions is None: + num_distributions = int(self._obs_distribution) + else: + num_distributions = self._num_distributions + empty_graph = self._empty_graph_func(graph_variables) return Context( init_graph=self._interpolate_graph(graph_variables), @@ -420,7 +427,7 @@ def build(self) -> Context: sigma_map=sigma_map, symmetric_diff_map=symmetric_diff_map, obs_distribution=self._obs_distribution, - num_distributions=self._num_distributions, + num_distributions=num_distributions, ) def _create_augmented_nodes(self) -> Tuple[List, Dict, Dict]: @@ -495,7 +502,9 @@ def _interpolate_graph(self, graph_variables) -> nx.Graph: return init_graph -def make_context(context: Optional[Context] = None, create_using=ContextBuilder) -> ContextBuilder: +def make_context( + context: Optional[Context] = None, create_using=ContextBuilder +) -> Union[ContextBuilder, InterventionalContextBuilder]: """Create a new ContextBuilder instance. Returns diff --git a/tests/unit_tests/conditional/ci/test_g_test.py b/tests/unit_tests/conditional/ci/test_g_test.py index 841544c91..ca92ed297 100644 --- a/tests/unit_tests/conditional/ci/test_g_test.py +++ b/tests/unit_tests/conditional/ci/test_g_test.py @@ -17,8 +17,8 @@ def test_g_error(): sets = [[], [2], [2, 3], [3, 4], [2, 3, 4]] df = pd.DataFrame.from_records(dm) with pytest.raises(ValueError, match="data_type"): - ci_estimator = GSquareCITest(data_type="auto") - ci_estimator.test(df, {x}, {y}, set(sets[0]), [3, 2, 3, 4, 2]) + ci_estimator = GSquareCITest(data_type="auto", levels=[3, 2, 3, 4, 2]) + ci_estimator.test(df, {x}, {y}, set(sets[0])) def test_g_discrete(): @@ -26,12 +26,12 @@ def test_g_discrete(): dm = np.array([testdata.dis_data]).reshape((10000, 5)) x = 0 y = 1 - ci_estimator = GSquareCITest(data_type="discrete") + ci_estimator = GSquareCITest(data_type="discrete", levels=[3, 2, 3, 4, 2]) df = pd.DataFrame.from_records(dm) sets = [[], [2], [2, 3], [3, 4], [2, 3, 4]] for idx in range(len(sets)): - _, p = ci_estimator.test(df, {x}, {y}, set(sets[idx]), [3, 2, 3, 4, 2]) + _, p = ci_estimator.test(df, {x}, {y}, set(sets[idx])) fr_p = frexp(p) fr_a = frexp(testdata.dis_answer[idx]) @@ -45,9 +45,10 @@ def test_g_discrete(): dm = np.array([testdata.dis_data]).reshape((2000, 25)) df = pd.DataFrame.from_records(dm) levels = np.ones((25,)) * 3 + ci_estimator = GSquareCITest(data_type="discrete", levels=levels) sets = [[2, 3, 4, 5, 6, 7]] with pytest.raises(RuntimeError, match="Not enough samples"): - ci_estimator.test(df, {x}, {y}, set(sets[0]), levels) + ci_estimator.test(df, {x}, {y}, set(sets[0])) def test_g_binary(): diff --git a/tests/unit_tests/constraint/__init__.py b/tests/unit_tests/constraint/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/constraint/test_fcialg.py b/tests/unit_tests/constraint/test_fcialg.py index 64c84ad4f..dfb55f9e7 100644 --- a/tests/unit_tests/constraint/test_fcialg.py +++ b/tests/unit_tests/constraint/test_fcialg.py @@ -9,7 +9,7 @@ from dodiscover import FCI, make_context from dodiscover.ci import Oracle -from dodiscover.constraint.config import SkeletonMethods +from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import dummy_sample np.random.seed(12345) @@ -23,19 +23,20 @@ def setup_method(self): oracle = Oracle(G) fci = FCI(ci_estimator=oracle) + self.context_func = make_context self.G = G self.ci_estimator = oracle self.alg = fci def test_fci_skel_graph(self): sample = dummy_sample(self.G) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() skel_graph, _ = self.alg.learn_skeleton(sample, context) assert nx.is_isomorphic(skel_graph, self.G.to_undirected()) def test_fci_basic_collider(self): sample = dummy_sample(self.G) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() skel_graph, sep_set = self.alg.learn_skeleton(sample, context) graph = PAG(incoming_circle_edges=skel_graph) self.alg.orient_unshielded_triples(graph, sep_set) @@ -425,6 +426,9 @@ def test_fci_rule8_without_selection_bias(self): assert not self.alg._apply_rule8(G, "u", "A", "C") def test_fci_rule8_with_selection_bias(self): + if not self.alg.selection_bias: + pytest.skip(reason="No selection bias for this algorithm") + # If A -o u -> C and A o-> C then orient A o-> C as A -> C G = PAG() @@ -565,7 +569,7 @@ def test_fci_unobserved_confounder(self): latent_edge_list = [("x1", "x2")] G = ADMG(edge_list, incoming_bidirected_edges=latent_edge_list) sample = dummy_sample(G) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() oracle = Oracle(G) ci_estimator = oracle @@ -602,7 +606,7 @@ def test_fci_spirtes_example(self): graph = ADMG(edge_list, latent_edge_list) alg = FCI(ci_estimator=Oracle(graph)) sample = dummy_sample(graph) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() alg.fit(sample, context) pag = alg.graph_ skel_graph = alg.graph_ @@ -636,8 +640,17 @@ def test_fci_spirtes_example(self): assert nx.is_isomorphic(skel_graph.to_undirected(), expected_pag.to_undirected()) assert set(expected_pag.edges()) == set(pag.edges()) - @pytest.mark.parametrize("skeleton_method", [SkeletonMethods.NBRS, SkeletonMethods.NBRS_PATH, SkeletonMethods.COMPLETE]) - @pytest.mark.parametrize("pds_skeleton_method", [SkeletonMethods.PDS, SkeletonMethods.PDS_PATH]) + @pytest.mark.parametrize( + "skeleton_method", + [ + ConditioningSetSelection.NBRS, + ConditioningSetSelection.NBRS_PATH, + ConditioningSetSelection.COMPLETE, + ], + ) + @pytest.mark.parametrize( + "pds_skeleton_method", [ConditioningSetSelection.PDS, ConditioningSetSelection.PDS_PATH] + ) @pytest.mark.parametrize("selection_bias", [True, False]) def test_fci_complex(self, skeleton_method, pds_skeleton_method, selection_bias): """ @@ -662,7 +675,7 @@ def test_fci_complex(self, skeleton_method, pds_skeleton_method, selection_bias) latent_edge_list = [("x1", "x2"), ("x4", "x5")] G = ADMG(edge_list, latent_edge_list) sample = dummy_sample(G) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() oracle = Oracle(G) ci_estimator = oracle fci = FCI( @@ -721,7 +734,7 @@ def test_fci_fig6(self): assert pywhy_graphs.networkx.m_separated(G, {"A"}, {"D"}, {"B", "C"}) sample = dummy_sample(G) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() oracle = Oracle(G) ci_estimator = oracle fci = FCI(ci_estimator=ci_estimator, max_iter=np.inf, selection_bias=False) @@ -764,7 +777,7 @@ def test_fci_selection_bias(self): G._edge_graphs.pop("circle") sample = dummy_sample(G) - context = make_context().variables(data=sample).build() + context = self.context_func().variables(data=sample).build() oracle = Oracle(G) ci_estimator = oracle fci = FCI(ci_estimator=ci_estimator, max_iter=np.inf, selection_bias=True) diff --git a/tests/unit_tests/constraint/test_intervene_skeleton.py b/tests/unit_tests/constraint/test_intervene_skeleton.py index 52457e986..d0797741d 100644 --- a/tests/unit_tests/constraint/test_intervene_skeleton.py +++ b/tests/unit_tests/constraint/test_intervene_skeleton.py @@ -1,4 +1,5 @@ import networkx as nx +import pytest import pywhy_graphs as pgraphs from dodiscover import InterventionalContextBuilder, make_context @@ -7,7 +8,7 @@ from dodiscover.constraint.utils import dummy_sample -def test_fnode_skeleton(): +def test_fnode_skeleton_known_targets(): """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`.""" # first create the oracle directed_edges = [ @@ -58,5 +59,85 @@ def test_fnode_skeleton(): assert nx.is_isomorphic(expected_skeleton, skel_graph) +def test_fnode_skeleton_unknown_targets(): + """Test learning the skeleton for Figure 2 in :footcite:`Jaber2020causal`.""" + # first create the oracle + directed_edges = [ + ("x", "w"), + ("x", "y"), + ("y", "w"), + ("z", "y"), + ("z", "x"), + ] + bidirected_edges = [("x", "w")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x", "w"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "w"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("z", "w"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = LearnInterventionSkeleton( + ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=False + ) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .num_distributions(2) + .build() + ) + learner.fit(data, context) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph") + + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + def test_fnode_skeleton_errors(): - pass + # define the learner and the context + directed_edges = [ + ("x", "w"), + ("w", "y"), + ("z", "y"), + ] + bidirected_edges = [("x", "z"), ("z", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x"}) + oracle = Oracle(graph) + + data = [dummy_sample(non_f_graph)] + learner = LearnInterventionSkeleton( + ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True + ) + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .intervention_targets([("x",)]) + .build() + ) + + with pytest.raises(RuntimeError, match="The number of datasets does not match"): + learner.fit(data, context) diff --git a/tests/unit_tests/constraint/test_pcalg.py b/tests/unit_tests/constraint/test_pcalg.py index 66d028c51..5c963b190 100644 --- a/tests/unit_tests/constraint/test_pcalg.py +++ b/tests/unit_tests/constraint/test_pcalg.py @@ -8,7 +8,7 @@ from dodiscover import make_context from dodiscover.ci import GSquareCITest, Oracle from dodiscover.constraint import PC -from dodiscover.constraint.config import SkeletonMethods +from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import dummy_sample from dodiscover.metrics import confusion_matrix_networks from dodiscover.testdata.testdata import bin_data, dis_data @@ -22,7 +22,7 @@ "max_cond_set_size": 3, "max_combinations": 10, "max_iter": 10, - "skeleton_method": SkeletonMethods.NBRS_PATH, + "skeleton_method": ConditioningSetSelection.NBRS_PATH, }, {}, ], diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py new file mode 100644 index 000000000..1736a5641 --- /dev/null +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -0,0 +1,243 @@ +from itertools import permutations + +import networkx as nx +import numpy as np +import pytest +import pywhy_graphs as pgraphs +from pywhy_graphs import IPAG, PsiPAG + +from dodiscover import InterventionalContextBuilder, PsiFCI, make_context +from dodiscover.ci import Oracle +from dodiscover.constraint.utils import dummy_sample + +from .test_fcialg import Test_FCI + +np.random.seed(12345) + + +@pytest.mark.filterwarnings("ignore:There is no intervention context set.") +class Test_IFCI(Test_FCI): + def setup_method(self): + # construct a causal graph that will result in + # x -> y <- z + G = nx.DiGraph([("x", "y"), ("z", "y")]) + oracle = Oracle(G) + alg = PsiFCI(known_intervention_targets=True, ci_estimator=oracle, cd_estimator=oracle) + + self.context_func = lambda: make_context(create_using=InterventionalContextBuilder) + self.G = G + self.ci_estimator = oracle + self.alg = alg + + def test_rule11(self): + """Test that all F-nodes are oriented outwards properly.""" + # create a complete graph + sub_dir_graph = nx.complete_graph( + [("F", 0), ("F", 1), "a", "b", "c", "d"], create_using=nx.DiGraph + ) + G = IPAG(incoming_circle_edges=sub_dir_graph) + + # there must only be one kind of edge from F-nodes to its nbrs + f_nodes = [("F", 0), ("F", 1)] + self.alg._apply_rule11(G, f_nodes) + for f_node in f_nodes: + for nbr in G.neighbors(f_node): + if nbr in f_nodes: + continue + assert G.has_edge(f_node, nbr, G.directed_edge_name) + assert not G.has_edge(nbr, f_node) + + def test_rule12(self): + """Test rule "9" in the I-FCI paper from Figure 3.""" + # create a complete graph + directed_edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + ("z", "x"), + ("z", "y"), + ("x", "y"), + ("x", "w"), + ("w", "y"), + ] + circle_edges = [("y", "x"), ("x", "z"), ("y", "z"), ("y", "w")] + G = IPAG(incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges) + G.graph["F-nodes"][("F", 0)] = ["x"] + f_nodes = G.f_nodes + + # there must only be one kind of edge from F-nodes to its nbrs + symmetric_diff_map = { + ("F", 0): ["x"], + } + + # no arrows should be added if we are not operating over a F-node + for x, y, z in permutations(G.non_f_nodes, 3): + added_arrows = self.alg._apply_rule12(G, x, y, z, f_nodes, symmetric_diff_map) + assert not added_arrows + + # no arrows should be added if the conditions of the rule are not met + added_arrows = self.alg._apply_rule12(G, ("F", 0), "x", "z", f_nodes, symmetric_diff_map) + assert not added_arrows + + added_arrows = self.alg._apply_rule12(G, ("F", 0), "x", "y", f_nodes, symmetric_diff_map) + if self.alg.known_intervention_targets: + assert added_arrows + assert G.has_edge("x", "y", G.directed_edge_name) + assert not G.has_edge("y", "x") + else: + assert not added_arrows + assert G.has_edge("y", "x") + + def test_ifci_figure3(self): + """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`.""" + # first create the oracle + directed_edges = [ + ("x", "w"), + ("w", "y"), + ("z", "y"), + ] + bidirected_edges = [("x", "z"), ("z", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = PsiFCI(ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .intervention_targets([("x",)]) + .build() + ) + learner.fit(data, context) + + # first check the observational skeleton + skel_graph = learner.skeleton_learner_.adj_graph_ + obs_skel_graph = learner.skeleton_learner_.context_.state_variable("obs_skel_graph") + + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + # now check the end graph + directed_edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + ("z", "x"), + ("z", "y"), + ("x", "y"), + ("x", "w"), + ("w", "y"), + ] + circle_edges = [("x", "z"), ("y", "z"), ("y", "w")] + expected_G = IPAG( + incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges + ) + expected_G.graph["F-nodes"][("F", 0)] = ["x"] + + learned_graph = learner.graph_ + for edge_type, subgraph in expected_G.get_graphs().items(): + assert nx.is_isomorphic(subgraph, learned_graph.get_graphs(edge_type)) + + +@pytest.mark.filterwarnings("ignore:There is no intervention context set.") +class Test_PsiFCI(Test_IFCI): + def setup_method(self): + # construct a causal graph that will result in + # x -> y <- z + G = nx.DiGraph([("x", "y"), ("z", "y")]) + oracle = Oracle(G) + alg = PsiFCI(known_intervention_targets=False, ci_estimator=oracle, cd_estimator=oracle) + + self.context_func = lambda: make_context(create_using=InterventionalContextBuilder) + self.G = G + self.ci_estimator = oracle + self.alg = alg + + def test_figure2_skeleton(self): + """Test learning the graph for Figure 2 in :footcite:`Jaber2020causal`.""" + # first create the oracle + directed_edges = [ + ("x", "w"), + ("x", "y"), + ("y", "w"), + ("z", "y"), + ("z", "x"), + ] + bidirected_edges = [("x", "w")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x", "w"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "w"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("z", "w"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = PsiFCI(ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=False) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .num_distributions(2) + .build() + ) + learner.fit(data, context) + + # first check the observational skeleton + skel_graph = learner.skeleton_learner_.adj_graph_ + obs_skel_graph = learner.skeleton_learner_.context_.state_variable("obs_skel_graph") + + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + # now check the end graph + directed_edges = [ + (("F", 0), "x"), + (("F", 0), "w"), + ("z", "x"), + ("z", "y"), + ("z", "w"), + ("x", "y"), + ("x", "w"), + ("y", "w"), + ] + circle_edges = [("x", "z"), ("w", "x"), ("w", "z"), ("w", "y")] + expected_G = PsiPAG( + incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges + ) + expected_G.graph["F-nodes"][("F", 0)] = ["x"] + + learned_graph = learner.graph_ + for edge_type, subgraph in expected_G.get_graphs().items(): + assert nx.is_isomorphic(subgraph, learned_graph.get_graphs(edge_type)) diff --git a/tests/unit_tests/test_context_builder.py b/tests/unit_tests/test_context_builder.py index a970ef92b..503ed447a 100644 --- a/tests/unit_tests/test_context_builder.py +++ b/tests/unit_tests/test_context_builder.py @@ -175,10 +175,8 @@ def test_context_interventions(): df = make_df() # check InterventionalContextBuilder errors that should be raised - with pytest.raises(ValueError, match="There is no intervention context set"): - copy(ctx_builder).variables(data=df).init_graph( - nx.empty_graph(df.columns + ["blah"]) - ).build() + with pytest.warns(UserWarning, match="There is no intervention context set"): + copy(ctx_builder).variables(data=df).init_graph(nx.empty_graph(df.columns)).build() with pytest.raises(RuntimeError, match="Not all nodes"): copy(ctx_builder).variables(data=df).init_graph( From 1738b8c9d1f9817c7e7ded55cbbcdd01ebfc3d05 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 17 Feb 2023 17:21:28 -0500 Subject: [PATCH 07/61] Fix docs Signed-off-by: Adam Li --- doc/api.rst | 3 +++ doc/conf.py | 6 +++++- doc/constraint_causal_discovery.rst | 14 ++++++++------ doc/user_guide.rst | 11 ++++++----- dodiscover/__init__.py | 7 ++----- dodiscover/constraint/fcialg.py | 4 ++-- dodiscover/constraint/intervention.py | 15 +++++++-------- dodiscover/constraint/pcalg.py | 2 +- dodiscover/constraint/skeleton.py | 10 +++++----- dodiscover/context.py | 4 ++-- dodiscover/context_builder.py | 14 +++++++------- 11 files changed, 48 insertions(+), 42 deletions(-) diff --git a/doc/api.rst b/doc/api.rst index 5c7331419..aecbd94c0 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -34,6 +34,7 @@ See docs for ``Context`` and ``make_context`` for more information. make_context ContextBuilder + InterventionalContextBuilder context.Context @@ -46,9 +47,11 @@ Constraint-based structure learning LearnSkeleton LearnSemiMarkovianSkeleton + LearnInterventionSkeleton ConditioningSetSelection PC FCI + PsiFCI Comparing causal discovery algorithms ===================================== diff --git a/doc/conf.py b/doc/conf.py index dd98fab89..aba2f88fb 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -111,6 +111,7 @@ "CPDAG", "PAG", "ADMG", + "PsiFCI", # networkx "node", "nodes", @@ -148,6 +149,7 @@ "nx.Graph": "networkx.Graph", "nx.DiGraph": "networkx.DiGraph", "nx.MultiDiGraph": "networkx.MultiDiGraph", + "nx": "networkx", "pgmpy.models.BayesianNetwork": "pgmpy.models.BayesianNetwork", # dodiscover "ADMG": "dodiscover.ADMG", @@ -155,6 +157,8 @@ "CPDAG": "dodiscover.CPDAG", "DAG": "dodiscover.DAG", "BaseConditionalIndependenceTest": "dodiscover.ci.BaseConditionalIndependenceTest", + "BaseConditionalDiscrepancyTest": "dodiscover.cd.BaseConditionalDiscrepancyTest", + "ConditioningSetSelection": "dodiscover.constraint.ConditioningSetSelection", "Context": "dodiscover.context.Context", "PC": "dodiscover.PC", "EquivalenceClass": "dodiscover.EquivalenceClass", @@ -173,7 +177,7 @@ "column": "pandas.DataFrame.columns", } -default_role = "py:obj" +default_role = "literal" # Tell myst-parser to assign header anchors for h1-h3. # myst_heading_anchors = 3 diff --git a/doc/constraint_causal_discovery.rst b/doc/constraint_causal_discovery.rst index 23f751c88..c10f3ac0d 100644 --- a/doc/constraint_causal_discovery.rst +++ b/doc/constraint_causal_discovery.rst @@ -3,8 +3,10 @@ ================================== Constraint-based causal discovery ================================== - -.. currentmodule:: dodiscover.constraint +.. automodule:: dodiscover.constraint + :no-members: + :no-inherited-members: +.. currentmodule:: dodiscover The following are a set of methods intended for (non-parametric) structure learning of causal graphs (i.e. causal discovery) given observational and/or interventional data @@ -45,7 +47,7 @@ If one assumes that the underlying structural causal model (SCM) is Markovian, then the Peter and Clarke (PC) algorithm has been shown to be sound and complete for learning a completed partially directed acyclic graph (CPDAG) :footcite:`Meek1995`. -The :class:`dodiscover.PC` algorithm and its variants assume Markovianity, which is +The :class:`dodiscover.constraint.PC` algorithm and its variants assume Markovianity, which is also known as causal-sufficiency in the literature. In other words, it assumes a lack of latent confounders, where there is no latent variable that is a confounder of the observed data. @@ -80,7 +82,7 @@ graph (PAG) :footcite:`zhang2008ancestralgraphs,Zhang2008`. The FCI algorithm and its variants assume Semi-Markovianity, which assumes the possible presence of latent confounders and even selection bias in the observational data. -The :class:`dodiscover.FCI` algorithm follows the three stages of learning that the PC +The :class:`dodiscover.constraint.FCI` algorithm follows the three stages of learning that the PC algorithm does, but with a few minor modifications that we will outline here: 1. skeleton discovery: The skeleton discovery phase is now composed of two stages. The first @@ -110,7 +112,7 @@ distribution. In this case, one may apply the :math:`Psi`-FCI algorithm to learn .. autosummary:: :toctree: generated/ - PsiFCI + constraint.PsiFCI Choosing the conditioning sets ------------------------------ @@ -121,7 +123,7 @@ be the empty set. There are multiple strategies for choosing ``Z``. .. autosummary:: :toctree: generated/ - ConditioningSetSelection + constraint.ConditioningSetSelection Hyperparameters and controlling overfitting ------------------------------------------- diff --git a/doc/user_guide.rst b/doc/user_guide.rst index 7b7ecaaf8..97242c587 100644 --- a/doc/user_guide.rst +++ b/doc/user_guide.rst @@ -16,8 +16,9 @@ User Guide constraint_causal_discovery.rst conditional_independence.rst - .. scores_causal_discovery.rst - .. visualizations.rst - .. datasets.rst - .. computing.rst - .. common_pitfalls.rst + +.. scores_causal_discovery.rst +.. visualizations.rst +.. datasets.rst +.. computing.rst +.. common_pitfalls.rst diff --git a/dodiscover/__init__.py b/dodiscover/__init__.py index 1ca3fc985..0b34f2bbf 100644 --- a/dodiscover/__init__.py +++ b/dodiscover/__init__.py @@ -1,11 +1,8 @@ -""" -DoDiscover - a library for Python-based Causal Discovery -""" - - +from . import cd # noqa: F401 from . import ci # noqa: F401 from . import metrics # noqa: F401 from ._protocol import EquivalenceClass, Graph from ._version import __version__ # noqa: F401 from .constraint import FCI, PC, PsiFCI +from .context import Context from .context_builder import ContextBuilder, InterventionalContextBuilder, make_context diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index de752d948..049679ca7 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -48,7 +48,7 @@ class FCI(BaseConstraintDiscovery): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : SkeletonMethods + skeleton_method : ConditioningSetSelection The method to use for testing conditional independence. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool @@ -64,7 +64,7 @@ class FCI(BaseConstraintDiscovery): selection_bias : bool Whether or not to account for selection bias within the causal PAG. See :footcite:`Zhang2008`. - pds_skeleton_method : SkeletonMethods + pds_skeleton_method : ConditioningSetSelection The method to use for learning the skeleton using PDS. Must be one of ('pds', 'pds_path'). See Notes for more details. diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index d44d4f8fd..c5632aaeb 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -36,7 +36,7 @@ class PsiFCI(FCI): Parameters ---------- - ci_estimator : Callable + ci_estimator : BaseConditionalIndependenceTest The conditional independence test function. The arguments of the estimator should be data, node, node to compare, conditioning set of nodes, and any additional keyword arguments. @@ -59,7 +59,7 @@ class PsiFCI(FCI): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : SkeletonMethods + skeleton_method : ConditioningSetSelection The method to use for testing conditional independence. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool @@ -72,7 +72,7 @@ class PsiFCI(FCI): orientation rules. max_path_length : int, optional The maximum length of any discriminating path, or None if unlimited. - pds_skeleton_method : SkeletonMethods + pds_skeleton_method : ConditioningSetSelection The method to use for learning the skeleton using PDS. Must be one of ('pds', 'pds_path'). See Notes for more details. known_intervention_targets : bool, optional @@ -132,7 +132,6 @@ def learn_skeleton( keep_sorted=False, max_path_length=self.max_path_length, ) - print(context) self.skeleton_learner_.fit(data, context) skel_graph = self.skeleton_learner_.adj_graph_ @@ -153,12 +152,12 @@ def fit(self, data: List[pd.DataFrame], context: Context): environments. We assume the first dataset is always observational. context : Context - _description_ + The context with interventional assumptions. Returns ------- - _type_ - _description_ + self : PsiFCI + The fitted learner. """ if not isinstance(data, list): raise RuntimeError("The input datasets must be in a Python list.") @@ -173,7 +172,7 @@ def fit(self, data: List[pd.DataFrame], context: Context): f"'context.num_distributions'." ) - super().fit(data, context) + return super().fit(data, context) def _apply_rule11(self, graph: EquivalenceClass, f_nodes: List) -> Tuple[bool, List]: """Apply "Rule 8" in I-FCI algorithm, which we call Rule 11. diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index 6a7688b61..8d9dee092 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -45,7 +45,7 @@ class PC(BaseConstraintDiscovery): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : SkeletonMethods + skeleton_method : ConditioningSetSelection The method to use for testing conditional independence. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 17027e76e..12e072396 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -134,7 +134,7 @@ class LearnSkeleton: of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : SkeletonMethods + skeleton_method : ConditioningSetSelection The method to use for testing conditional independence. Must be one of ('complete', 'neighbors', 'neighbors_path'). See Notes for more details. keep_sorted : bool @@ -505,7 +505,7 @@ def _compute_candidate_conditioning_sets( Notes ----- The :attr:`skeleton_method` dictates how we choose the corresponding conditioning sets. - For more information, see :class:`SkeletonMethods`. + For more information, see :class:`ConditioningSetSelection`. """ skeleton_method = self.skeleton_method @@ -594,10 +594,10 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : SkeletonMethods + skeleton_method : ConditioningSetSelection The method to use for determining conditioning sets when testing conditional independence of the first stage. See :class:`LearnSkeleton` for details. - second_stage_skeleton_method : SkeletonMethods | None + second_stage_skeleton_method : ConditioningSetSelection | None The method to use for determining conditioning sets when testing conditional independence of the first stage. Must be one of ('pds', 'pds_path'). See Notes for more details. If `None`, then no second stage skeleton discovery phase will be run. @@ -842,7 +842,7 @@ class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : SkeletonMethods + skeleton_method : ConditioningSetSelection The method to use for testing conditional independence. Must be one of ('pds', 'pds_path'). See Notes for more details. keep_sorted : bool diff --git a/dodiscover/context.py b/dodiscover/context.py index 7df174669..61d542d21 100644 --- a/dodiscover/context.py +++ b/dodiscover/context.py @@ -58,8 +58,8 @@ class Context(BasePyWhy): Currently, testing for equality is done on all attributes that are not graphs. Defining equality among graphs is ill-defined, and as such, we leave testing of the internal graphs to users. Some checks of equality - for example can be :func:`networkx.is_isomorphic` for checking isomorphism - among two graphs. + for example can be :func:`networkx.algorithms.isomorphism.is_isomorphic` + for checking isomorphism among two graphs. """ observed_variables: Set[Column] diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index 0cfb2d186..30bba1762 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -319,12 +319,12 @@ class InterventionalContextBuilder(ContextBuilder): The context builder provides a way to capture assumptions, domain knowledge, and data. This should NOT be instantiated directly. One should instead use - `dodiscover.make_context` to build a Context data structure. + :func:`dodiscover.make_context` to build a Context data structure. Notes ----- The number of distributions and/or interventional targets must be set in order - to build the `dodiscover.Context` object here. + to build the :class:`~.context.Context` object here. """ _intervention_targets: List[Tuple[Column]] = [] @@ -367,7 +367,7 @@ def intervention_targets(self, targets: List[Tuple[Column]]): Parameters ---------- - interventions : List of tuples + interventions : List of tuple A list of tuples of nodes that are known intervention targets. Assumes that the order of the interventions marked are those of the passed in the data. @@ -509,7 +509,7 @@ def make_context( Returns ------- - result : ContextBuilder + result : ContextBuilder, InterventionalContextBuilder The new ContextBuilder instance Examples @@ -521,12 +521,12 @@ def make_context( Notes ----- - `dodiscover.Context` objects are dataclasses that creates a dictionary-like access - to causal context metadata. Copying relevant information from a `dodiscover.Context` + :class:`~.context.Context` objects are dataclasses that creates a dictionary-like access + to causal context metadata. Copying relevant information from a Context object into a `ContextBuilder` is all supported with the exception of state variables. State variables are not copied over. To set state variables again, one must build the Context and then call - :meth:`dodiscover.Context.state_variable`. + :py:meth:`~.context.Context.state_variable`. """ result = create_using() if context is not None: From eebc6a5cd9b4aa6491cf4d1cfe259b02651cccc7 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 17 Feb 2023 17:23:15 -0500 Subject: [PATCH 08/61] Do not add vscode settings Signed-off-by: Adam Li --- .gitignore | 1 + .vscode/settings.json | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 72a35bbeb..ef43177f6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ __pycache__/ *$py.class .DS_Store +.vscode # C extensions *.so diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index a7d0fc7b7..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "esbonio.sphinx.confDir": "" -} \ No newline at end of file From f8d13d09b96e3c8134d9653abe809924bcb52ecf Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 24 Feb 2023 12:52:17 -0800 Subject: [PATCH 09/61] Update Signed-off-by: Adam Li --- doc/conditional_independence.rst | 137 +++++++++++++- doc/references.bib | 205 +++++++++++++-------- dodiscover/cd/base.py | 18 +- dodiscover/cd/bregman.py | 6 +- dodiscover/cd/kernel_test.py | 11 +- dodiscover/ci/base.py | 4 +- dodiscover/constraint/_classes.py | 10 +- dodiscover/constraint/fcialg.py | 20 +- dodiscover/constraint/intervention.py | 20 +- dodiscover/constraint/pcalg.py | 8 +- dodiscover/constraint/skeleton.py | 65 ++++--- dodiscover/context_builder.py | 66 +++---- examples/ex_psifci_alg.py | 144 +++++++++++++++ examples/plot_pc_alg.py | 12 +- tests/unit_tests/conditional/cd/test_cd.py | 31 ++-- tests/unit_tests/test_context_builder.py | 2 +- 16 files changed, 555 insertions(+), 204 deletions(-) create mode 100644 examples/ex_psifci_alg.py diff --git a/doc/conditional_independence.rst b/doc/conditional_independence.rst index 026703a00..f1cb0e041 100644 --- a/doc/conditional_independence.rst +++ b/doc/conditional_independence.rst @@ -34,20 +34,147 @@ with certain assumptions on the underlying data distribution. Conditional Mutual Information ------------------------------ -TBD. +Conditional mutual information (CMI) is a general formulation of CI, where CMI is defined as +:math:: + + \\int log \frac{p(x, y | z)}{p(x | z) p(y | z)} + +As we can see, CMI is equal to 0, if and only if :math:`p(x, y | z) = p(x | z) p(y | z)`, which +is exactly the definition of CI. CMI is completely non-parametric and thus requires no assumptions +on the underlying distributions. Unfortunately, CMI is notoriously difficult to estimate. There are +various proposals in the literature for estimating CMI, which we summarize here: + +- The Kraskov, Stogbauer and Grassberger (KSG) estimate approach estimates mutual information + via k-NN statistics :footcite:`kraskov_estimating_2004`. It was generalized to CMI by :footcite:`frenzel_partial_2007`. + This class of estimators is asymptotically correct, meaning if we had an infinite amount of data + we would obtain the true value of the CMI. However, it relies on statistics generated from the k-NN, + which if we implement the naive approach using a KDTree, then it generally suffers in high-dimensions. + In our examples, we see it suffer with dimensionality > 4 or 5. + + Estimates of CMI can be converted into a CI hypothesis test by permutation testing :footcite:`Runge2018cmi`. + One can generate estimated samples from the null distribution by permuting samples in an intelligent manner + and then the CMI value generated from the actual observed data can be compared to the CMI values computed + on the permutated datasets to estimate a pvalue. + + It is worth noting that if one has "robust" estimates of k-NN using for example a model that + is effective in high-dimensions, then the KSG estimator for CMI may be quite good. For example, + one can use variants of Random Forests to generate adaptive nearest-neighbor estimates in high-dimensions + or on manifolds, such that the KSG estimator is still quite good. + +.. autosummary:: + :toctree: generated/ + + ci.CMITest + +- The Classifier Divergence approach estimates CMI using a classification model. + +.. autosummary:: + :toctree: generated/ + + ci.ClassifierCMITest + +- Direct posterior estimates can be implemented with a classification model by directly + estimating :math:`P(y|x)` and :math:`P(y|x,z)`, which can be used as plug-in estimates + to the equation for CMI. Partial (Pearson) Correlation ----------------------------- -TBD. +Partial correlation based on the Pearson correlation is equivalent to CMI in the setting +of normally distributed data. Computing partial correlation is fast and efficient and +thus attractive to use. However, this **relies on the assumption of multivariate Gaussianity**, +which may be unrealistic in certain datasets. + +.. autosummary:: + :toctree: generated/ + + ci.FisherZCITest Discrete, Categorical and Binary Data ------------------------------------- -TBD. +If one has discrete data, then the test to use is based on Chi-square tests. The :math:`G^2` +class of tests will construct a contingency table based on the number of levels across +each discrete variable. An exponential amount of data is needed for increasing levels +for a discrete variable. + +.. autosummary:: + :toctree: generated/ + + ci.GSquareCITest Kernel-Approaches ----------------- -TBD. +Kernel-based tests are attractive since they are semi-parametric and use kernel-based ideas +that have been shown to be robust in the machine-learning field. The Kernel CI test is a test +that computes a test statistic from kernels of the data and uses permutation testing to +generate samples from the null distribution :footcite:`Zhang2011`, which are then used to +estimate a pvalue. + +.. autosummary:: + :toctree: generated/ + + ci.KernelCITest Classifier-based Approaches --------------------------- -TBD. \ No newline at end of file +Another suite of approaches that rely on permutation testing is the classifier-based approach. +By shuffling data in an intelligent way, one can setup a hypothesis test for CI based on the +predicted probabilities from a classification-model. Intuitively, if the shuffled data is similar +to the unshuffled data, such that the classification-model achieves non-trivial performance +(e.g. >50\% accuracy on a balanced dataset), then one fails to reject the null hypothesis and would +state that the original data was in fact CI :footcite:`Sen2017model`. + +.. autosummary:: + :toctree: generated/ + + ci.ClassifierCITest + +======================= +Conditional Discrepancy +======================= + +.. currentmodule:: dodiscover.cd + +Conditional discrepancy (CD) is another form of conditional invariances that may be exhibited by data. The +general question is whether or not the following two distributions are equal: + +:math:`P_{i=j}(y|x) =? P_{i=k}(y|x)` + +where :math:`P_i(.)` denote the distribution that explicitly comes from +a different group, or environment, denoted by the discrete indices :math:`i`. This is also +known in some cases as conditional k-sample testing, if there are a finite k number of groups +for :math:`P_i`. CD testing is important because it detects other kinds of invariances besides +CI. + +Discrete, Categorical and Binary Data +------------------------------------- +If one has entirely discrete data, then the problem of CD can be converted into a CI test that +leverages the Chi-square class of tests. Since ``y`` and ``x`` are discrete and so are the +indices of the distribution, one can convert the CD test: + +:math:`P_{i=j}(y|x) =? P_{i=k}(y|x)` into the CI test :math:`P(y|x,i) = P(y|x)`, which can +be tested with the Chi-square CI tests. + +Kernel-Approaches +----------------- +Kernel-based tests are attractive since they are semi-parametric and use kernel-based ideas +that have been shown to be robust in the machine-learning field. The Kernel CD test is a test +that computes a test statistic from kernels of the data and uses a weighted permutation testing +based on the estimated propensity scores to generate samples from the null distribution +:footcite:`Park2021conditional`, which are then used to estimate a pvalue. + +.. autosummary:: + :toctree: generated/ + + cd.KernelCDTest + +Bregman-Divergences +------------------- +The Bregman CD test is a divergence-based test +that computes a test statistic from estimated Von-Neumann divergences of the data and uses a +weighted permutation testing based on the estimated propensity scores to generate samples from the null distribution +:footcite:`Yu2020Bregman`, which are then used to estimate a pvalue. + +.. autosummary:: + :toctree: generated/ + + cd.BregmanCDTest diff --git a/doc/references.bib b/doc/references.bib index c52d35d08..8f3c1c376 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -43,13 +43,6 @@ @article{Kocaoglu2019characterization year = {2019} } -@article{Lopez2016revisiting, - title = {Revisiting classifier two-sample tests}, - author = {Lopez-Paz, David and Oquab, Maxime}, - journal = {arXiv preprint arXiv:1610.06545}, - year = {2016} -} - @article{Meek1995, author = {Meek, Christopher}, year = {2013}, @@ -60,15 +53,6 @@ @article{Meek1995 journal = {Proceedings of Eleventh Conference on Uncertainty in Artificial Intelligence, Montreal, QU} } -@inproceedings{Mukherjee2020ccmi, - title = {CCMI: Classifier based conditional mutual information estimation}, - author = {Mukherjee, Sudipto and Asnani, Himanshu and Kannan, Sreeram}, - booktitle = {Uncertainty in artificial intelligence}, - pages = {1083--1093}, - year = {2020}, - organization = {PMLR} -} - @book{Neapolitan2003, author = {Neapolitan, Richard}, year = {2003}, @@ -80,40 +64,6 @@ @book{Neapolitan2003 doi = {10.1145/1327942.1327961} } - -@inproceedings{Park2021conditional, - title = {Conditional distributional treatment effect with kernel conditional mean embeddings and U-statistic regression}, - author = {Park, Junhyung and Shalit, Uri and Sch{\"o}lkopf, Bernhard and Muandet, Krikamol}, - booktitle = {International Conference on Machine Learning}, - pages = {8401--8412}, - year = {2021}, - organization = {PMLR} -} - - -@inproceedings{Runge2018cmi, - title = {Conditional independence testing based on a nearest-neighbor estimator of conditional mutual information}, - author = {Runge, Jakob}, - booktitle = {Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics}, - pages = {938--947}, - year = {2018}, - editor = {Storkey, Amos and Perez-Cruz, Fernando}, - volume = {84}, - series = {Proceedings of Machine Learning Research}, - month = {09--11 Apr}, - publisher = {PMLR}, - pdf = {http://proceedings.mlr.press/v84/runge18a/runge18a.pdf}, - url = {https://proceedings.mlr.press/v84/runge18a.html} -} - -@article{Sen2017model, - title = {Model-powered conditional independence test}, - author = {Sen, Rajat and Suresh, Ananda Theertha and Shanmugam, Karthikeyan and Dimakis, Alexandros G and Shakkottai, Sanjay}, - journal = {Advances in neural information processing systems}, - volume = {30}, - year = {2017} -} - @article{uhler2013geometry, title = {Geometry of the faithfulness assumption in causal inference}, author = {Uhler, Caroline and Raskutti, Garvesh and B{\"u}hlmann, Peter and Yu, Bin}, @@ -123,21 +73,6 @@ @article{uhler2013geometry publisher = {JSTOR} } -@inproceedings{Yu2020Bregman, - title = {Measuring the Discrepancy between Conditional Distributions: Methods, Properties and Applications}, - author = {Yu, Shujian and Shaker, Ammar and Alesiani, Francesco and Principe, Jose}, - booktitle = {Proceedings of the Twenty-Ninth International Joint Conference on - Artificial Intelligence, {IJCAI-20}}, - publisher = {International Joint Conferences on Artificial Intelligence Organization}, - editor = {Christian Bessiere}, - pages = {2777--2784}, - year = {2020}, - month = {7}, - note = {Main track}, - doi = {10.24963/ijcai.2020/385}, - url = {https://doi.org/10.24963/ijcai.2020/385} -} - @article{Zhang2008, title = {On the completeness of orientation rules for causal discovery in the presence of latent confounders and selection bias}, journal = {Artificial Intelligence}, @@ -163,20 +98,6 @@ @article{zhang2008ancestralgraphs url = {http://jmlr.org/papers/v9/zhang08a.html} } -@inproceedings{Zhang2011, - author = {Zhang, Kun and Peters, Jonas and Janzing, Dominik and Sch\"{o}lkopf, Bernhard}, - title = {Kernel-Based Conditional Independence Test and Application in Causal Discovery}, - year = {2011}, - isbn = {9780974903972}, - publisher = {AUAI Press}, - address = {Arlington, Virginia, USA}, - booktitle = {Proceedings of the Twenty-Seventh Conference on Uncertainty in Artificial Intelligence}, - pages = {804–813}, - numpages = {10}, - location = {Barcelona, Spain}, - series = {UAI'11} -} - # Books @book{Pearl_causality_2009, @@ -216,3 +137,129 @@ @article{dai2022independence journal = {arXiv preprint arXiv:2210.11021}, year = {2022} } + +% Conditional Testing + +@article{frenzel_partial_2007, + title = {Partial {Mutual} {Information} for {Coupling} {Analysis} of {Multivariate} {Time} {Series}}, + volume = {99}, + doi = {10.1103/PhysRevLett.99.204101}, + abstract = {We propose a method to discover couplings in multivariate time series, based on partial mutual information, an information-theoretic generalization of partial correlation. It represents the part of mutual information of two random quantities that is not contained in a third one. By suitable choice of the latter, we can differentiate between direct and indirect interactions and derive an appropriate graphical model. An efficient estimator for partial mutual information is presented as well.}, + journal = {Physical review letters}, + author = {Frenzel, Stefan and Pompe, Bernd}, + month = dec, + year = {2007}, + pages = {204101}, + file = {Full Text PDF:/Users/adam2392/Zotero/storage/8ICFXVZG/Frenzel and Pompe - 2007 - Partial Mutual Information for Coupling Analysis o.pdf:application/pdf} +} + +@article{kraskov_estimating_2004, + title = {Estimating mutual information}, + volume = {69}, + url = {https://link.aps.org/doi/10.1103/PhysRevE.69.066138}, + doi = {10.1103/PhysRevE.69.066138}, + abstract = {We present two classes of improved estimators for mutual information M(X,Y), from samples of random points distributed according to some joint probability density μ(x,y). In contrast to conventional estimators based on binnings, they are based on entropy estimates from k-nearest neighbor distances. This means that they are data efficient (with k=1 we resolve structures down to the smallest possible scales), adaptive (the resolution is higher where data are more numerous), and have minimal bias. Indeed, the bias of the underlying entropy estimates is mainly due to nonuniformity of the density at the smallest resolved scale, giving typically systematic errors which scale as functions of k∕N for N points. Numerically, we find that both families become exact for independent distributions, i.e. the estimator ˆM(X,Y) vanishes (up to statistical fluctuations) if μ(x,y)=μ(x)μ(y). This holds for all tested marginal distributions and for all dimensions of x and y. In addition, we give estimators for redundancies between more than two random variables. We compare our algorithms in detail with existing algorithms. Finally, we demonstrate the usefulness of our estimators for assessing the actual independence of components obtained from independent component analysis (ICA), for improving ICA, and for estimating the reliability of blind source separation., This article appears in the following collections:}, + number = {6}, + urldate = {2023-01-27}, + journal = {Physical Review E}, + author = {Kraskov, Alexander and Stögbauer, Harald and Grassberger, Peter}, + month = jun, + year = {2004}, + note = {Publisher: American Physical Society}, + pages = {066138}, + file = {APS Snapshot:/Users/adam2392/Zotero/storage/GRW23BYU/PhysRevE.69.html:text/html;Full Text PDF:/Users/adam2392/Zotero/storage/NJT9QCVA/Kraskov et al. - 2004 - Estimating mutual information.pdf:application/pdf} +} + +@article{Lopez2016revisiting, + title = {Revisiting classifier two-sample tests}, + author = {Lopez-Paz, David and Oquab, Maxime}, + journal = {arXiv preprint arXiv:1610.06545}, + year = {2016} +} + +@inproceedings{Mukherjee2020ccmi, + title = {CCMI: Classifier based conditional mutual information estimation}, + author = {Mukherjee, Sudipto and Asnani, Himanshu and Kannan, Sreeram}, + booktitle = {Uncertainty in artificial intelligence}, + pages = {1083--1093}, + year = {2020}, + organization = {PMLR} +} + +@inproceedings{Park2021conditional, + title = {Conditional distributional treatment effect with kernel conditional mean embeddings and U-statistic regression}, + author = {Park, Junhyung and Shalit, Uri and Sch{\"o}lkopf, Bernhard and Muandet, Krikamol}, + booktitle = {International Conference on Machine Learning}, + pages = {8401--8412}, + year = {2021}, + organization = {PMLR} +} + +@inproceedings{Runge2018cmi, + title = {Conditional independence testing based on a nearest-neighbor estimator of conditional mutual information}, + author = {Runge, Jakob}, + booktitle = {Proceedings of the Twenty-First International Conference on Artificial Intelligence and Statistics}, + pages = {938--947}, + year = {2018}, + editor = {Storkey, Amos and Perez-Cruz, Fernando}, + volume = {84}, + series = {Proceedings of Machine Learning Research}, + month = {09--11 Apr}, + publisher = {PMLR}, + pdf = {http://proceedings.mlr.press/v84/runge18a/runge18a.pdf}, + url = {https://proceedings.mlr.press/v84/runge18a.html} +} + +@article{Sen2017model, + title = {Model-powered conditional independence test}, + author = {Sen, Rajat and Suresh, Ananda Theertha and Shanmugam, Karthikeyan and Dimakis, Alexandros G and Shakkottai, Sanjay}, + journal = {Advances in neural information processing systems}, + volume = {30}, + year = {2017} +} + +@inproceedings{Yu2020Bregman, + title = {Measuring the Discrepancy between Conditional Distributions: Methods, Properties and Applications}, + author = {Yu, Shujian and Shaker, Ammar and Alesiani, Francesco and Principe, Jose}, + booktitle = {Proceedings of the Twenty-Ninth International Joint Conference on + Artificial Intelligence, {IJCAI-20}}, + publisher = {International Joint Conferences on Artificial Intelligence Organization}, + editor = {Christian Bessiere}, + pages = {2777--2784}, + year = {2020}, + month = {7}, + note = {Main track}, + doi = {10.24963/ijcai.2020/385}, + url = {https://doi.org/10.24963/ijcai.2020/385} +} + +@inproceedings{Zhang2011, + author = {Zhang, Kun and Peters, Jonas and Janzing, Dominik and Sch\"{o}lkopf, Bernhard}, + title = {Kernel-Based Conditional Independence Test and Application in Causal Discovery}, + year = {2011}, + isbn = {9780974903972}, + publisher = {AUAI Press}, + address = {Arlington, Virginia, USA}, + booktitle = {Proceedings of the Twenty-Seventh Conference on Uncertainty in Artificial Intelligence}, + pages = {804–813}, + numpages = {10}, + location = {Barcelona, Spain}, + series = {UAI'11} +} + +% Example refs + +@article{sachsdataset2005, + author = {Karen Sachs and Omar Perez and Dana Pe'er and Douglas A. Lauffenburger and Garry P. Nolan }, + title = {Causal Protein-Signaling Networks Derived from Multiparameter Single-Cell Data}, + journal = {Science}, + volume = {308}, + number = {5721}, + pages = {523-529}, + year = {2005}, + doi = {10.1126/science.1105809}, + url = {https://www.science.org/doi/abs/10.1126/science.1105809}, + eprint = {https://www.science.org/doi/pdf/10.1126/science.1105809}, + abstract = {Machine learning was applied for the automated derivation of causal influences in cellular signaling networks. This derivation relied on the simultaneous measurement of multiple phosphorylated protein and phospholipid components in thousands of individual primary human immune system cells. Perturbing these cells with molecular interventions drove the ordering of connections between pathway components, wherein Bayesian network computational methods automatically elucidated most of the traditionally reported signaling relationships and predicted novel interpathway network causalities, which we verified experimentally. Reconstruction of network models from physiologically relevant primary single cells might be applied to understanding native-state tissue signaling biology, complex drug actions, and dysfunctional signaling in diseased cells.} +} + diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index 2537cb1df..a28679e4d 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -55,21 +55,33 @@ def _check_test_input( @abstractmethod def test( - self, df: pd.DataFrame, x_vars: Set[Column], y_vars: Set[Column], group_col: Column + self, + df: pd.DataFrame, + y_vars: Set[Column], + group_col: Column, + x_vars: Optional[Set[Column]], ) -> Tuple[float, float]: """Abstract method for all conditional discrepancy tests. + Tests the null hypothesis: :math:`P(Y | X, group) = P(Y | X)`, where + we are trying to determine if Y is (conditionally) independent from + the group denoting the distribution, given X. + + Another way of viewing this test is testing whether or not :math:`P_i(Y|X) = P_j(Y|X)`, + where :math:`P_i(.)` and :math:`P_j(.)` denote distributions from different groups + or environments denoted by the group_col. + Parameters ---------- df : pd.DataFrame The dataframe containing the dataset. - x_vars : Set of column - A column in ``df``. y_vars : Set of column A column in ``df``. group_col : column A column in ``df`` that indicates which group of distribution each sample belongs to with a '0', or '1'. + x_vars : Set of column, optional + A column in ``df``. Returns ------- diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index a2d6c61e3..ee8e29b8c 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -74,7 +74,11 @@ def __init__( self.propensity_est = propensity_est def test( - self, df: pd.DataFrame, x_vars: Set[Column], y_vars: Set[Column], group_col: Column + self, + df: pd.DataFrame, + y_vars: Set[Column], + group_col: Column, + x_vars: Optional[Set[Column]], ) -> Tuple[float, float]: # check test input self._check_test_input(df, x_vars, y_vars, group_col) diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index 5f0e53726..ff4b0c3dc 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -1,4 +1,4 @@ -from typing import Set, Tuple +from typing import Optional, Set, Tuple import numpy as np import pandas as pd @@ -92,9 +92,9 @@ def __init__( def test( self, df: pd.DataFrame, - x_vars: Set[Column], y_vars: Set[Column], group_col: Column, + x_vars: Optional[Set[Column]], ) -> Tuple[float, float]: """Compute k-sample test statistic and pvalue. @@ -103,7 +103,12 @@ def test( H_0: P(Y|X) = P'(Y|X) where the different distributions arise from the different datasets - collected denoted by the ``group_col`` parameter. + collected denoted by the ``group_col`` parameter. It can also be written + as:: + + H_0: P(Y|X,T) = P(Y|X) + + meaning that :math:`Y \\perp X | T`, where T is the group indicator. Parameters ---------- diff --git a/dodiscover/ci/base.py b/dodiscover/ci/base.py index d307ae8f9..7fb5eb986 100644 --- a/dodiscover/ci/base.py +++ b/dodiscover/ci/base.py @@ -34,7 +34,9 @@ def _check_test_input( if any(col not in df.columns for col in y_vars): raise ValueError(f"The y variables {y_vars} are not all in the DataFrame.") if z_covariates is not None and any(col not in df.columns for col in z_covariates): - raise ValueError("The z conditioning set variables are not all in the DataFrame.") + raise ValueError( + f"The z conditioning set variables {z_covariates} are not all in the DataFrame with {df.columns}." + ) if not self._allow_multivariate_input and (len(x_vars) > 1 or len(y_vars) > 1): raise RuntimeError(f"{self.__class__} does not support multivariate input for X and Y.") diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index 764330104..f8b81879a 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -38,8 +38,8 @@ class BaseConstraintDiscovery: parents still, by default None. If None, then will not be used. If set, then the conditioning set will be chosen lexographically based on the sorted test statistic values of 'ith Pa(X) -> X', for each possible parent node of 'X'. - skeleton_method : SkeletonMethods - The method to use for testing conditional independence. Must be one of + condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning sets. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool Whether or not to apply orientation rules given the learned skeleton graph @@ -66,13 +66,13 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, ): self.alpha = alpha self.ci_estimator = ci_estimator self.apply_orientations = apply_orientations - self.skeleton_method = skeleton_method + self.condsel_method = condsel_method # constraining the conditional independence tests if max_cond_set_size is None: @@ -247,7 +247,7 @@ def learn_skeleton( min_cond_set_size=self.min_cond_set_size, max_cond_set_size=self.max_cond_set_size, max_combinations=self.max_combinations, - skeleton_method=self.skeleton_method, + condsel_method=self.condsel_method, keep_sorted=False, ) skel_alg.fit(data, context) diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 049679ca7..f926c3b34 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -48,8 +48,8 @@ class FCI(BaseConstraintDiscovery): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : ConditioningSetSelection - The method to use for testing conditional independence. Must be one of + condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning sets. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool Whether or not to apply orientation rules given the learned skeleton graph @@ -64,8 +64,8 @@ class FCI(BaseConstraintDiscovery): selection_bias : bool Whether or not to account for selection bias within the causal PAG. See :footcite:`Zhang2008`. - pds_skeleton_method : ConditioningSetSelection - The method to use for learning the skeleton using PDS. Must be one of + pds_condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning sets using PDS. Must be one of ('pds', 'pds_path'). See Notes for more details. References @@ -89,12 +89,12 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, max_iter: int = 1000, max_path_length: Optional[int] = None, selection_bias: bool = True, - pds_skeleton_method: ConditioningSetSelection = ConditioningSetSelection.PDS, + pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, ): super().__init__( ci_estimator, @@ -102,13 +102,13 @@ def __init__( min_cond_set_size=min_cond_set_size, max_cond_set_size=max_cond_set_size, max_combinations=max_combinations, - skeleton_method=skeleton_method, + condsel_method=condsel_method, ) self.max_iter = max_iter self.apply_orientations = apply_orientations self.max_path_length = max_path_length self.selection_bias = selection_bias - self.pds_skeleton_method = pds_skeleton_method + self.pds_condsel_method = pds_condsel_method def orient_unshielded_triples(self, graph: EquivalenceClass, sep_set: SeparatingSet) -> None: """Orient colliders given a graph and separation set. @@ -819,8 +819,8 @@ def learn_skeleton( min_cond_set_size=self.min_cond_set_size, max_cond_set_size=self.max_cond_set_size, max_combinations=self.max_combinations, - skeleton_method=self.skeleton_method, - second_stage_skeleton_method=self.pds_skeleton_method, + condsel_method=self.condsel_method, + second_stage_condsel_method=self.pds_condsel_method, keep_sorted=False, max_path_length=self.max_path_length, ) diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index c5632aaeb..e06aa0802 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -59,8 +59,8 @@ class PsiFCI(FCI): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : ConditioningSetSelection - The method to use for testing conditional independence. Must be one of + condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning sets. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool Whether or not to apply orientation rules given the learned skeleton graph @@ -72,8 +72,8 @@ class PsiFCI(FCI): orientation rules. max_path_length : int, optional The maximum length of any discriminating path, or None if unlimited. - pds_skeleton_method : ConditioningSetSelection - The method to use for learning the skeleton using PDS. Must be one of + pds_condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning sets using PDS. Must be one of ('pds', 'pds_path'). See Notes for more details. known_intervention_targets : bool, optional If `True`, then will run the I-FCI algorithm. If `False`, will run the @@ -92,11 +92,11 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, max_iter: int = 1000, max_path_length: Optional[int] = None, - pds_skeleton_method: ConditioningSetSelection = ConditioningSetSelection.PDS, + pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, known_intervention_targets: bool = False, ): super().__init__( @@ -105,12 +105,12 @@ def __init__( min_cond_set_size, max_cond_set_size, max_combinations, - skeleton_method, + condsel_method, apply_orientations, max_iter=max_iter, max_path_length=max_path_length, selection_bias=False, - pds_skeleton_method=pds_skeleton_method, + pds_condsel_method=pds_condsel_method, ) self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets @@ -127,8 +127,8 @@ def learn_skeleton( min_cond_set_size=self.min_cond_set_size, max_cond_set_size=self.max_cond_set_size, max_combinations=self.max_combinations, - skeleton_method=self.skeleton_method, - second_stage_skeleton_method=self.pds_skeleton_method, + condsel_method=self.condsel_method, + second_stage_condsel_method=self.pds_condsel_method, keep_sorted=False, max_path_length=self.max_path_length, ) diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index 8d9dee092..9468eaf2d 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -45,8 +45,8 @@ class PC(BaseConstraintDiscovery): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : ConditioningSetSelection - The method to use for testing conditional independence. Must be one of + condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning set. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. apply_orientations : bool Whether or not to apply orientation rules given the learned skeleton graph @@ -81,7 +81,7 @@ def __init__( min_cond_set_size: Optional[int] = None, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, max_iter: int = 1000, ): @@ -91,7 +91,7 @@ def __init__( min_cond_set_size=min_cond_set_size, max_cond_set_size=max_cond_set_size, max_combinations=max_combinations, - skeleton_method=skeleton_method, + condsel_method=condsel_method, ) self.max_iter = max_iter self.apply_orientations = apply_orientations diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 12e072396..6a8d73ccc 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -134,8 +134,8 @@ class LearnSkeleton: of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : ConditioningSetSelection - The method to use for testing conditional independence. Must be one of + condsel_method : ConditioningSetSelection + The method to use for selecting the conditioning set. Must be one of ('complete', 'neighbors', 'neighbors_path'). See Notes for more details. keep_sorted : bool Whether or not to keep the considered conditioning set variables in sorted @@ -205,7 +205,7 @@ class LearnSkeleton: Different methods for learning the skeleton: There are different ways to learn the skeleton that are valid under various - assumptions. The value of ``skeleton_method`` completely defines how one + assumptions. The value of ``condsel_method`` completely defines how one selects the conditioning set. - 'complete': This exhaustively conditions on all combinations of variables in @@ -234,13 +234,13 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, keep_sorted: bool = False, ) -> None: self.ci_estimator = ci_estimator self.sep_set = sep_set self.alpha = alpha - self.skeleton_method = skeleton_method + self.condsel_method = condsel_method # control of the conditioning set self.min_cond_set_size = min_cond_set_size @@ -262,10 +262,10 @@ def _initialize_params(self) -> None: if self.max_combinations is not None and self.max_combinations <= 0: raise RuntimeError(f"Max combinations must be at least 1, not {self.max_combinations}") - if self.skeleton_method not in ConditioningSetSelection: + if self.condsel_method not in ConditioningSetSelection: raise ValueError( f"Skeleton method must be one of {ConditioningSetSelection}, not " - f"{self.skeleton_method}." + f"{self.condsel_method}." ) if self.sep_set is None and not hasattr(self, "sep_set_"): @@ -504,17 +504,17 @@ def _compute_candidate_conditioning_sets( Notes ----- - The :attr:`skeleton_method` dictates how we choose the corresponding conditioning sets. + The :attr:`condsel_method` dictates how we choose the corresponding conditioning sets. For more information, see :class:`ConditioningSetSelection`. """ - skeleton_method = self.skeleton_method + condsel_method = self.condsel_method - if skeleton_method == ConditioningSetSelection.COMPLETE: + if condsel_method == ConditioningSetSelection.COMPLETE: possible_variables = set(adj_graph.nodes) - elif skeleton_method == ConditioningSetSelection.NBRS: + elif condsel_method == ConditioningSetSelection.NBRS: possible_variables = set(adj_graph.neighbors(x_var)) # possible_adjacencies.copy() - elif skeleton_method == ConditioningSetSelection.NBRS_PATH: + elif condsel_method == ConditioningSetSelection.NBRS_PATH: # constrain adjacency set to ones with a path from x_var to y_var possible_variables = _find_neighbors_along_path(adj_graph, start=x_var, end=y_var) @@ -594,10 +594,10 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : ConditioningSetSelection + condsel_method : ConditioningSetSelection The method to use for determining conditioning sets when testing conditional independence of the first stage. See :class:`LearnSkeleton` for details. - second_stage_skeleton_method : ConditioningSetSelection | None + second_stage_condsel_method : ConditioningSetSelection | None The method to use for determining conditioning sets when testing conditional independence of the first stage. Must be one of ('pds', 'pds_path'). See Notes for more details. If `None`, then no second stage skeleton discovery phase will be run. @@ -649,7 +649,7 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): Different methods for learning the skeleton: There are different ways to learn the skeleton that are valid under various - assumptions. The value of ``skeleton_method`` completely defines how one + assumptions. The value of ``condsel_method`` completely defines how one selects the conditioning set. - 'pds': This conditions on the PDS set of 'x_var'. Note, this definition does @@ -672,8 +672,8 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, - second_stage_skeleton_method: Optional[ + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + second_stage_condsel_method: Optional[ ConditioningSetSelection ] = ConditioningSetSelection.PDS, keep_sorted: bool = False, @@ -686,11 +686,11 @@ def __init__( min_cond_set_size, max_cond_set_size, max_combinations, - skeleton_method, + condsel_method, keep_sorted, ) - self.second_stage_skeleton_method = second_stage_skeleton_method + self.second_stage_condsel_method = second_stage_condsel_method self.max_path_length = max_path_length def _orient_unshielded_triples(self, graph: EquivalenceClass, sep_set: SeparatingSet) -> None: @@ -733,15 +733,15 @@ def _compute_candidate_conditioning_sets( else: if not all(x in pag.nodes for x in [x_var, y_var]): raise RuntimeError("wtf..") - skeleton_method = self.second_stage_skeleton_method + condsel_method = self.second_stage_condsel_method - if skeleton_method == ConditioningSetSelection.PDS: + if condsel_method == ConditioningSetSelection.PDS: # determine how we want to construct the candidates for separating nodes # perform conditioning independence testing on all combinations possible_variables = pgraph.pds( pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore ) - elif skeleton_method == ConditioningSetSelection.PDS_PATH: + elif condsel_method == ConditioningSetSelection.PDS_PATH: # determine how we want to construct the candidates for separating nodes # perform conditioning independence testing on all combinations possible_variables = pgraph.pds_path( @@ -777,7 +777,7 @@ def fit(self, data: pd.DataFrame, context: Context): # if there is no second stage skeleton method to be run, then we # will stop with the skeleton here - if self.second_stage_skeleton_method is None: + if self.second_stage_condsel_method is None: return self # convert the undirected skeleton graph to a PAG, where @@ -842,7 +842,7 @@ class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used in conjunction with ``keep_sorted`` parameter to only test the "strongest" dependences. - skeleton_method : ConditioningSetSelection + condsel_method : ConditioningSetSelection The method to use for testing conditional independence. Must be one of ('pds', 'pds_path'). See Notes for more details. keep_sorted : bool @@ -878,8 +878,8 @@ def __init__( min_cond_set_size: int = 0, max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, - skeleton_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, - second_stage_skeleton_method: ConditioningSetSelection = ConditioningSetSelection.PDS, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + second_stage_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, keep_sorted: bool = False, max_path_length: Optional[int] = None, known_intervention_targets: bool = False, @@ -891,8 +891,8 @@ def __init__( min_cond_set_size, max_cond_set_size, max_combinations, - skeleton_method, - second_stage_skeleton_method, + condsel_method, + second_stage_condsel_method, keep_sorted, max_path_length, ) @@ -947,12 +947,9 @@ def evaluate_fnode_edge( # compare conditional distributions P(Y | X) vs P'(Y | X), where 'group_col' # indicates which distribution data came from - if isinstance(self.cd_estimator, Oracle): - # test graphically if Y is d-separated from F-node given Z - test_stat, pvalue = self.cd_estimator.test(data, {group_col}, Y, Z) - else: - # test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, Z, Y, group_col) + # test graphically if Y is d-separated from F-node given Z + # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) + test_stat, pvalue = self.cd_estimator.test(data, {group_col}, Y, Z) self.n_ci_tests += 1 return test_stat, pvalue diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index 30bba1762..82434c2ec 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -327,12 +327,15 @@ class InterventionalContextBuilder(ContextBuilder): to build the :class:`~.context.Context` object here. """ - _intervention_targets: List[Tuple[Column]] = [] + _intervention_targets: Optional[List[Tuple[Column]]] = None _num_distributions: Optional[int] = None _obs_distribution: bool = True def obs_distribution(self, has_obs_distrib: bool): - """Whether or not we have access to the observational distribution.""" + """Whether or not we have access to the observational distribution. + + By default, this is True and assumed to be the first distribution. + """ self._obs_distribution = has_obs_distrib return self @@ -349,13 +352,6 @@ def num_distributions(self, num_distribs: int): Number of distributions we will have access to. Will set the number of distributions to be ``num_distribs + 1`` if ``_obs_distribution is True`` (default). """ - if len(self._intervention_targets) > 0 and ( - len(self._intervention_targets) + int(self._obs_distribution) != num_distribs - ): - raise RuntimeError( - f"Setting the number of distributions {num_distribs} does not match the number of " - f"intervention targets {len(self._intervention_targets)}." - ) self._num_distributions = num_distribs return self @@ -374,17 +370,7 @@ def intervention_targets(self, targets: List[Tuple[Column]]): If intervention targets are unknown, then this is not necessary. """ - if ( - self._num_distributions is not None - and len(targets) + int(self._obs_distribution) != self._num_distributions - ): - raise RuntimeError( - f"Setting the number of intervention targets {targets} does not match the " - f"number of distributions set {self._num_distributions} (it is assumed " - f"there are {int(self._obs_distribution)} observational distributions)." - ) self._intervention_targets = targets - self._num_distributions = len(targets) + int(self._obs_distribution) return self def build(self) -> Context: @@ -404,16 +390,30 @@ def build(self) -> Context: "use `ContextBuilder` instead of `InterventionContextBuilder`." ) - # get F-nodes and sigma-map - f_nodes, sigma_map, symmetric_diff_map = self._create_augmented_nodes() - graph_variables = set(self._observed_variables).union(set(f_nodes)) - - # infer number of distributions + # infer intervention targets and number of distributions + if self._intervention_targets is None: + intervention_targets = [] + else: + intervention_targets = self._intervention_targets if self._num_distributions is None: - num_distributions = int(self._obs_distribution) + num_distributions = int(self._obs_distribution) + len(intervention_targets) else: num_distributions = self._num_distributions + # error-check if intervention targets was set that it matches the distributions + if len(intervention_targets) > 0: + if len(intervention_targets) + int(self._obs_distribution) != num_distributions: + raise RuntimeError( + f"Setting the number of distributions {num_distributions} does not match the number of " + f"intervention targets {len(intervention_targets)}." + ) + + # get F-nodes and sigma-map + f_nodes, sigma_map, symmetric_diff_map = self._create_augmented_nodes( + intervention_targets, num_distributions + ) + graph_variables = set(self._observed_variables).union(set(f_nodes)) + empty_graph = self._empty_graph_func(graph_variables) return Context( init_graph=self._interpolate_graph(graph_variables), @@ -422,7 +422,7 @@ def build(self) -> Context: observed_variables=self._observed_variables, latent_variables=self._latent_variables or set(), state_variables=self._state_variables, - intervention_targets=self._intervention_targets, + intervention_targets=intervention_targets, f_nodes=f_nodes, sigma_map=sigma_map, symmetric_diff_map=symmetric_diff_map, @@ -430,7 +430,9 @@ def build(self) -> Context: num_distributions=num_distributions, ) - def _create_augmented_nodes(self) -> Tuple[List, Dict, Dict]: + def _create_augmented_nodes( + self, intervention_targets, num_distributions + ) -> Tuple[List, Dict, Dict]: """Create augmented nodes, sigma map and optionally a symmetric difference map. Given a number of distributions attributed to interventions, one constructs @@ -462,16 +464,17 @@ def _create_augmented_nodes(self) -> Tuple[List, Dict, Dict]: distribution_targets_idx = [] # now map all distribution targets to their indexed distribution - int_dist_idx = np.arange(int(self._obs_distribution), self._num_distributions).tolist() + int_dist_idx = np.arange(int(self._obs_distribution), num_distributions).tolist() distribution_targets_idx.extend(int_dist_idx) # store known-targets, which are sets of nodes targets = [] - if len(self._intervention_targets) > 0: + if len(intervention_targets) > 0: if self._obs_distribution: targets.append(()) - targets.extend(copy(list(self._intervention_targets))) # type: ignore + targets.extend(copy(list(intervention_targets))) # type: ignore + # create F-nodes, their symmetric difference mapping and sigma-mapping to intervention targets for idx, (jdx, kdx) in enumerate(combinations(distribution_targets_idx, 2)): if jdx == kdx: continue @@ -480,8 +483,7 @@ def _create_augmented_nodes(self) -> Tuple[List, Dict, Dict]: sigma_map[f_node] = (jdx, kdx) # if we additionally know the intervention targets - if len(self._intervention_targets) > 0: - print(jdx, kdx, len(targets), distribution_targets_idx) + if len(intervention_targets) > 0: i_target: Set = set(targets[jdx]) j_target: Set = set(targets[kdx]) diff --git a/examples/ex_psifci_alg.py b/examples/ex_psifci_alg.py new file mode 100644 index 000000000..7539d4b0f --- /dev/null +++ b/examples/ex_psifci_alg.py @@ -0,0 +1,144 @@ +""" +.. _ex-psifci-algorithm: + +========================================= +Causal discovery with interventional data +========================================= + +We will simulate some observational data from a Structural Causal Model (SCM) and +demonstrate how we will use the PC algorithm. + +The PC algorithm works on observational data when there are no unobserved latent +confounders. That means for any observed set of variables, there is no common causes +that are unobserved. In other words, all exogenous variables then are assumed to be +independent. + +In this example, we will introduce the main abstractions and concepts used in +dodiscover for causal discovery: + +- learner: Any causal discovery algorithm that has a similar scikit-learn API. +- context: Causal assumptions. + +.. currentmodule:: dodiscover +""" + + +# %% +# Authors: Adam Li +# +# License: BSD (3-clause) + +from pywhy_graphs.viz import draw +from dodiscover.ci import GSquareCITest, Oracle +from dodiscover import PsiFCI, Context, make_context, InterventionalContextBuilder + +import pandas as pd +import bnlearn + +import pooch + +# %% +# Pull in the Sachs Dataset +# ------------------------- +# The Sachs dataset is a famous dataset in causal discovery because of its real-life +# applicability and access to experimental data that analyzed the causal network of +# 11 proteins using knockouts and spikings :footcite:`sachsdataset2005`. The pathways +# for those proteins are already known, so it is an ideal dataset for benchmarking +# causal discovery algorithms. +# +# We will download a preprocessed version of the dataset from the following +# url: https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz +# +# Ref: https://erdogant.github.io/bnlearn/pages/html/bnlearn.bnlearn.html#bnlearn.bnlearn.import_example +df = bnlearn.import_example("sachs", n=2000) + +# use pooch to download robustly from a url +url = "https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz" +file_path = pooch.retrieve( + url=url, + known_hash="md5:39ee257f7eeb94cb60e6177cf80c9544", +) + +df = pd.read_csv(file_path, delimiter=" ") + +# the ground-truth dag is shown here +ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) +fig = bnlearn.plot(ground_truth_dag) + +# .. note:: +# The Sachs dataset has previously been preprocessed, and the steps are described +# in bnlearn, at the web-page https://www.bnlearn.com/research/sachs05/. +print(df.head()) +print(df.shape) + +# %% +# Preprocess the dataset +# ---------------------- +# Since the data is one dataframe, we need to process it into a form +# that is acceptable by dodiscover's :class:`PsiFCI`` algorithm. We +# will form a list of separate dataframes. +unique_ints = df["INT"].unique() + +# get the list of intervention targets and list of dataframe associated with each intervention +intervention_targets = [df.columns[idx] for idx in unique_ints] +data_cols = [col for col in df.columns if col != "INT"] +data = [] +for interv_idx in unique_ints: + _data = df[df["INT"] == interv_idx][data_cols] + data.append(_data) + +print(len(data), len(intervention_targets)) +# %% +# Setup constraint-based learner +# ------------------------------ +# Since we have access to interventional data, the causal discovery algorithm +# we will use that leverages CI and CD tests to estimate causal constraints +# is the Psi-FCI algorithm :footcite:`Jaber2020causal`. + +# Our dataset is comprised of discrete valued data, so we will utilize the +# G^2 (Chi-square) CI test. +ci_estimator = GSquareCITest(data_type="discrete") + +# Since our data is entirely discrete, we can also use the G^2 test as our +# CD test. +cd_estimator = GSquareCITest(data_type="discrete") + +alpha = 0.05 + +learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha) + +# create context with information about the interventions +ctx_builder = make_context(create_using=InterventionalContextBuilder) +ctx: Context = ( + ctx_builder.variables(data=data[0]) + .intervention_targets(intervention_targets) + .obs_distribution(False) + .build() +) + +# %% +# Run the learning process +# ------------------------ +# We have setup our causal context and causal discovery learner, so we will now +# run the algorithm using the :meth:`PsiFCI.fit` API, which is similar to scikit-learn's +# `fit` design. All fitted attributes contain an underscore at the end. +learner = learner.fit(data, ctx) + +# %% +# Visualize the results +# --------------------- +# Now that we have learned the graph, we will show it here. Note differences and similarities +# to the ground-truth DAG that is "assumed". Moreover, note that this reproduces Supplementary +# Figure 8 in :footcite:`Jaber2020causal`. +est_pag = learner.graph_ + +# draw the full graph +draw(est_pag, direction="LR") + +# if we do not want to visualize the F-nodes, then we can view the subgraph +est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes()) +draw(est_pag_no_fnodes, direction="LR") + +# References +# ---------- +# .. footbibliography:: diff --git a/examples/plot_pc_alg.py b/examples/plot_pc_alg.py index e6b303fcb..f86fe4ddc 100644 --- a/examples/plot_pc_alg.py +++ b/examples/plot_pc_alg.py @@ -1,9 +1,9 @@ """ .. _ex-pc-algorithm: -==================================================================================== -PC algorithm for causal discovery from observational data without latent confounders -==================================================================================== +============================================================= +Basic causal discovery with DoDiscover using the PC algorithm +============================================================= We will simulate some observational data from a Structural Causal Model (SCM) and demonstrate how we will use the PC algorithm. @@ -13,6 +13,12 @@ that are unobserved. In other words, all exogenous variables then are assumed to be independent. +In this example, we will introduce the main abstractions and concepts used in +dodiscover for causal discovery: + +- learner: Any causal discovery algorithm that has a similar scikit-learn API. +- context: Causal assumptions. + .. currentmodule:: dodiscover """ # %% diff --git a/tests/unit_tests/conditional/cd/test_cd.py b/tests/unit_tests/conditional/cd/test_cd.py index 8dbd58f65..a22b017dc 100644 --- a/tests/unit_tests/conditional/cd/test_cd.py +++ b/tests/unit_tests/conditional/cd/test_cd.py @@ -54,33 +54,33 @@ def test_cd_tests_error(cd_func): sample_df = single_env_scm(n_samples=10) cd_estimator = cd_func() with pytest.raises(ValueError, match="The group col"): - cd_estimator.test(sample_df, {x}, {y}, group_col="blah") + cd_estimator.test(sample_df, {y}, group_col="blah", x_vars={x}) with pytest.raises(ValueError, match="The x variables are not all"): - cd_estimator.test(sample_df, {"blah"}, y_vars={y}, group_col="group") + cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={"blah"}) with pytest.raises(ValueError, match="The y variables are not all"): - cd_estimator.test(sample_df, {x}, y_vars={"blah"}, group_col="group") + cd_estimator.test(sample_df, y_vars={"blah"}, group_col="group", x_vars={x}) # all the group indicators have different values now from 0/1 sample_df["group"] = sample_df["group"] + 3 with pytest.raises(RuntimeError, match="Group indications in"): - cd_estimator.test(sample_df, {x}, {y}, group_col="group") + cd_estimator.test(sample_df, {y}, group_col="group", x_vars={x}) # test pre-fit propensity scores, or custom propensity model with pytest.raises( ValueError, match="Both propensity model and propensity estimates are specified" ): cd_estimator = cd_func(propensity_model=RandomForestClassifier(), propensity_est=[0.5, 0.5]) - cd_estimator.test(sample_df, {x}, y_vars={y}, group_col="group") + cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={x}) with pytest.raises(ValueError, match="There are 3 group pre-defined estimates"): cd_estimator = cd_func(propensity_est=np.ones((10, 3)) * 0.5) - cd_estimator.test(sample_df, {x}, y_vars={y}, group_col="group") + cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={x}) with pytest.raises(ValueError, match="There are 100 pre-defined estimates"): cd_estimator = cd_func(propensity_est=np.ones((100, 2)) * 0.5) - cd_estimator.test(sample_df, {x}, y_vars={y}, group_col="group") + cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={x}) @pytest.mark.parametrize( @@ -112,16 +112,21 @@ def test_cd_simulation(cd_func, df, env_type, cd_kwargs): alpha = 0.1 if env_type == "single": - _, pvalue = cd_estimator.test(df, {"x"}, {"x1"}, group_col=group_col) + _, pvalue = cd_estimator.test( + df, + {"x1"}, + group_col, + {"x"}, + ) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" - _, pvalue = cd_estimator.test(df, {"x"}, {"z"}, group_col=group_col) + _, pvalue = cd_estimator.test(df, {"z"}, group_col, {"x"}) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" - _, pvalue = cd_estimator.test(df, {"x"}, {"y"}, group_col=group_col) + _, pvalue = cd_estimator.test(df, {"y"}, group_col, {"x"}) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" elif env_type == "multi": - _, pvalue = cd_estimator.test(df, {"x"}, {"z"}, group_col=group_col) + _, pvalue = cd_estimator.test(df, {"z"}, group_col, {"x"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - _, pvalue = cd_estimator.test(df, {"x"}, {"y"}, group_col=group_col) + _, pvalue = cd_estimator.test(df, {"y"}, group_col, {"x"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - _, pvalue = cd_estimator.test(df, {"x1"}, {"z"}, group_col=group_col) + _, pvalue = cd_estimator.test(df, {"z"}, group_col, {"x1"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" diff --git a/tests/unit_tests/test_context_builder.py b/tests/unit_tests/test_context_builder.py index 503ed447a..b8495c5d4 100644 --- a/tests/unit_tests/test_context_builder.py +++ b/tests/unit_tests/test_context_builder.py @@ -188,7 +188,7 @@ def test_context_interventions(): 5 ).build() - with pytest.raises(RuntimeError, match="Setting the number of intervention targets"): + with pytest.raises(RuntimeError, match="Setting the number of distribution"): copy(ctx_builder).variables(data=df).num_distributions(5).intervention_targets( [("x",)] ).build() From 997619c733bcc0922f696d4cc987413fc3aa85b4 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 27 Feb 2023 11:25:18 -1000 Subject: [PATCH 10/61] Add example Signed-off-by: Adam Li --- dodiscover/ci/g_test.py | 12 +++++++--- dodiscover/constraint/_classes.py | 1 + dodiscover/constraint/skeleton.py | 39 +++++++++++++++++-------------- examples/ex_psifci_alg.py | 3 +++ 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/dodiscover/ci/g_test.py b/dodiscover/ci/g_test.py index 6bb42a7c7..0942447f9 100644 --- a/dodiscover/ci/g_test.py +++ b/dodiscover/ci/g_test.py @@ -68,10 +68,16 @@ def _calculate_contingency_tble( else: # discrete case if zidx == 0: - kdx += data[z][row_idx] # data[row_idx, z] + # print(zidx, z, row_idx, data.shape) + row = data.iloc[row_idx] + kdx += row[z] # data[row_idx, z] else: lprod = np.prod(list(map(lambda x: levels[x], sep_set[:zidx]))) # type: ignore - kdx += data[z][row_idx] * lprod + row = data.iloc[row_idx] + kdx += row[z] * lprod + + if np.isnan(kdx): + print(kdx, zidx, z, data[z][row_idx], lprod) # increment the co-occurrence found contingency_tble[idx, jdx, kdx] += 1 @@ -337,7 +343,7 @@ def g_square_discrete( ) if levels is None: - levels = np.amax(data, axis=0) + 1 + levels = (np.amax(data, axis=0) + 1).astype(int) n_samples = data.shape[0] s_size = len(sep_set) dof = (levels[x] - 1) * (levels[y] - 1) * np.prod(list(map(lambda x: levels[x], sep_set))) diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index f8b81879a..897957943 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -169,6 +169,7 @@ def fit(self, data: pd.DataFrame, context: Context) -> None: # store resulting data structures self.graph_ = graph + return self def evaluate_edge( self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 6a8d73ccc..00605023b 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -937,8 +937,8 @@ def evaluate_fnode_edge( distribution_idx = self.context_.sigma_map[group_col] # get the distributions across the two distributions - data_i = data[distribution_idx[0]] - data_j = data[distribution_idx[1]] + data_i = data[distribution_idx[0]].copy() + data_j = data[distribution_idx[1]].copy() # name the group column the F-node, so Oracle works as expected data_i[group_col] = 0 @@ -984,7 +984,7 @@ def _compute_candidate_conditioning_sets( raise RuntimeError("This should not be the case") # get only neighboring sets of Y-vars, or PDS that depend on Y - possible_variables = set(adj_graph.neighbors(y_var)) + possible_variables = set(adj_graph.neighbors(y_var)) - set(f_nodes) return possible_variables def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): @@ -1000,6 +1000,25 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co # track progress of the algorithm for which edges to remove to ensure stability self.remove_edges = set() + # first remove all connections among f-nodes + for x_var in f_nodes: + for y_var in f_nodes: + if x_var == y_var: + continue + + pvalue = 1.0 + test_stat = 0.0 + + # post-process the CI test results + removed_edge = self._postprocess_ci_test( + adj_graph, x_var, y_var, set(), test_stat, pvalue + ) + + # summarize the comparison of XY + self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + # Remove edges + adj_graph.remove_edges_from(self.remove_edges) + # Outer loop: iterate over 'size_cond_set' until stopping criterion is met # - 'size_cond_set' > 'max_cond_set_size' or # - All (X, Y) pairs have candidate conditioning sets of size < 'size_cond_set' @@ -1019,20 +1038,6 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co if y_var == x_var: continue - # if Y is also a F-node, then they are automatically assumed d-separated - if y_var in f_nodes: - pvalue = 1.0 - test_stat = 0.0 - - # post-process the CI test results - removed_edge = self._postprocess_ci_test( - adj_graph, x_var, y_var, set(), test_stat, pvalue - ) - - # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) - continue - # compute the possible variables used in the conditioning set possible_variables = self._compute_candidate_conditioning_sets( adj_graph, diff --git a/examples/ex_psifci_alg.py b/examples/ex_psifci_alg.py index 7539d4b0f..7a0c8acc2 100644 --- a/examples/ex_psifci_alg.py +++ b/examples/ex_psifci_alg.py @@ -116,6 +116,9 @@ .build() ) +print(ctx.init_graph) +print(ctx.f_nodes) + # %% # Run the learning process # ------------------------ From 8ee328ede4eec30b7292740ff39b3d549dd3ee44 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 27 Feb 2023 11:29:13 -1000 Subject: [PATCH 11/61] Add example Signed-off-by: Adam Li --- dodiscover/ci/base.py | 3 ++- dodiscover/constraint/skeleton.py | 2 +- dodiscover/context_builder.py | 7 ++++--- examples/ex_psifci_alg.py | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dodiscover/ci/base.py b/dodiscover/ci/base.py index 7fb5eb986..a2209e24e 100644 --- a/dodiscover/ci/base.py +++ b/dodiscover/ci/base.py @@ -35,7 +35,8 @@ def _check_test_input( raise ValueError(f"The y variables {y_vars} are not all in the DataFrame.") if z_covariates is not None and any(col not in df.columns for col in z_covariates): raise ValueError( - f"The z conditioning set variables {z_covariates} are not all in the DataFrame with {df.columns}." + f"The z conditioning set variables {z_covariates} are not all in the " + f"DataFrame with {df.columns}." ) if not self._allow_multivariate_input and (len(x_vars) > 1 or len(y_vars) > 1): diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 00605023b..78129997d 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -10,7 +10,7 @@ import pandas as pd from dodiscover.cd import BaseConditionalDiscrepancyTest -from dodiscover.ci import BaseConditionalIndependenceTest, Oracle +from dodiscover.ci import BaseConditionalIndependenceTest from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index 82434c2ec..326631687 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -404,8 +404,8 @@ def build(self) -> Context: if len(intervention_targets) > 0: if len(intervention_targets) + int(self._obs_distribution) != num_distributions: raise RuntimeError( - f"Setting the number of distributions {num_distributions} does not match the number of " - f"intervention targets {len(intervention_targets)}." + f"Setting the number of distributions {num_distributions} does not match the " + f"number of intervention targets {len(intervention_targets)}." ) # get F-nodes and sigma-map @@ -474,7 +474,8 @@ def _create_augmented_nodes( targets.append(()) targets.extend(copy(list(intervention_targets))) # type: ignore - # create F-nodes, their symmetric difference mapping and sigma-mapping to intervention targets + # create F-nodes, their symmetric difference mapping and sigma-mapping to + # intervention targets for idx, (jdx, kdx) in enumerate(combinations(distribution_targets_idx, 2)): if jdx == kdx: continue diff --git a/examples/ex_psifci_alg.py b/examples/ex_psifci_alg.py index 7a0c8acc2..223b5c335 100644 --- a/examples/ex_psifci_alg.py +++ b/examples/ex_psifci_alg.py @@ -29,7 +29,7 @@ # License: BSD (3-clause) from pywhy_graphs.viz import draw -from dodiscover.ci import GSquareCITest, Oracle +from dodiscover.ci import GSquareCITest from dodiscover import PsiFCI, Context, make_context, InterventionalContextBuilder import pandas as pd @@ -49,7 +49,7 @@ # We will download a preprocessed version of the dataset from the following # url: https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz # -# Ref: https://erdogant.github.io/bnlearn/pages/html/bnlearn.bnlearn.html#bnlearn.bnlearn.import_example +# Ref: https://erdogant.github.io/bnlearn/pages/html/bnlearn.bnlearn.html#bnlearn.bnlearn.import_example # noqa df = bnlearn.import_example("sachs", n=2000) # use pooch to download robustly from a url From f281fa169b9d25347dc85b601d58e22490a98506 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 27 Feb 2023 16:37:56 -1000 Subject: [PATCH 12/61] Add example Signed-off-by: Adam Li --- doc/conditional_independence.rst | 16 ++++++++-------- examples/ex_psifci_alg.py | 11 +++++++---- pyproject.toml | 1 + 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/doc/conditional_independence.rst b/doc/conditional_independence.rst index f1cb0e041..6143a3ae1 100644 --- a/doc/conditional_independence.rst +++ b/doc/conditional_independence.rst @@ -64,14 +64,14 @@ various proposals in the literature for estimating CMI, which we summarize here: .. autosummary:: :toctree: generated/ - ci.CMITest + CMITest - The Classifier Divergence approach estimates CMI using a classification model. .. autosummary:: :toctree: generated/ - ci.ClassifierCMITest + ClassifierCMITest - Direct posterior estimates can be implemented with a classification model by directly estimating :math:`P(y|x)` and :math:`P(y|x,z)`, which can be used as plug-in estimates @@ -87,7 +87,7 @@ which may be unrealistic in certain datasets. .. autosummary:: :toctree: generated/ - ci.FisherZCITest + FisherZCITest Discrete, Categorical and Binary Data ------------------------------------- @@ -99,7 +99,7 @@ for a discrete variable. .. autosummary:: :toctree: generated/ - ci.GSquareCITest + GSquareCITest Kernel-Approaches ----------------- @@ -112,7 +112,7 @@ estimate a pvalue. .. autosummary:: :toctree: generated/ - ci.KernelCITest + KernelCITest Classifier-based Approaches --------------------------- @@ -126,7 +126,7 @@ state that the original data was in fact CI :footcite:`Sen2017model`. .. autosummary:: :toctree: generated/ - ci.ClassifierCITest + ClassifierCITest ======================= Conditional Discrepancy @@ -165,7 +165,7 @@ based on the estimated propensity scores to generate samples from the null distr .. autosummary:: :toctree: generated/ - cd.KernelCDTest + KernelCDTest Bregman-Divergences ------------------- @@ -177,4 +177,4 @@ weighted permutation testing based on the estimated propensity scores to generat .. autosummary:: :toctree: generated/ - cd.BregmanCDTest + BregmanCDTest diff --git a/examples/ex_psifci_alg.py b/examples/ex_psifci_alg.py index 223b5c335..a8c8cf26a 100644 --- a/examples/ex_psifci_alg.py +++ b/examples/ex_psifci_alg.py @@ -75,7 +75,7 @@ # Preprocess the dataset # ---------------------- # Since the data is one dataframe, we need to process it into a form -# that is acceptable by dodiscover's :class:`PsiFCI`` algorithm. We +# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We # will form a list of separate dataframes. unique_ints = df["INT"].unique() @@ -123,7 +123,7 @@ # Run the learning process # ------------------------ # We have setup our causal context and causal discovery learner, so we will now -# run the algorithm using the :meth:`PsiFCI.fit` API, which is similar to scikit-learn's +# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's # `fit` design. All fitted attributes contain an underscore at the end. learner = learner.fit(data, ctx) @@ -136,11 +136,14 @@ est_pag = learner.graph_ # draw the full graph -draw(est_pag, direction="LR") +dot_graph = draw(est_pag, direction="LR") +dot_graph.render(outfile="psi_pag_full.png", view=True) # if we do not want to visualize the F-nodes, then we can view the subgraph est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes()) -draw(est_pag_no_fnodes, direction="LR") +dot_graph = draw(est_pag_no_fnodes, direction="LR") +dot_graph.render(outfile="psi_pag.png", view=True) + # References # ---------- diff --git a/pyproject.toml b/pyproject.toml index 77b093856..91b928566 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -146,6 +146,7 @@ type_check = 'mypy -p dodiscover -p tests --config-file pyproject.toml' unit_test = 'pytest tests/unit_tests --cov=dodiscover --cov-report=xml --cov-config=pyproject.toml' integration_test = 'pytest tests/integration_tests' build_docs = 'make -C doc clean html' +build_docs_noplot = 'make -C doc clean html-noplot' [[tool.poe.tasks.clean]] sequence = ['_clean_cache', '_clean_pyc', '_clean_so', '_clean_build', '_clean_ctags', '_clean_test'] From cebb60e994b101335d05e5c52f5ad8b2f975b158 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 28 Feb 2023 15:50:01 -1000 Subject: [PATCH 13/61] Run poetry update to add pooch Signed-off-by: Adam Li --- poetry.lock | 56 +++++++++++++++++++++++++------------------------- pyproject.toml | 1 + 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/poetry.lock b/poetry.lock index 69c546d90..5e5f75a56 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1500,7 +1500,6 @@ category = "dev" optional = false python-versions = "*" files = [ - {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, ] @@ -2381,20 +2380,6 @@ category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, - {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, - {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, - {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, - {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, - {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, - {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, - {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, - {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, - {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, - {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, - {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, - {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, - {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, @@ -2527,6 +2512,28 @@ tomli = ">=1.2.2" [package.extras] poetry-plugin = ["poetry (>=1.0,<2.0)"] +[[package]] +name = "pooch" +version = "1.7.0" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, + {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + [[package]] name = "portray" version = "1.8.0" @@ -2981,7 +2988,7 @@ viz = ["pygraphviz"] [package.source] type = "git" url = "https://github.com/py-why/pywhy-graphs.git" -reference = 'main' +reference = "main" resolved_reference = "ba73b32a987e51fe01d6478d649938c2b72834ba" [[package]] @@ -3023,13 +3030,6 @@ files = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -3660,8 +3660,8 @@ scipy = {version = ">=1.3", markers = "(python_version > \"3.7\" or platform_sys [package.extras] build = ["cython (>=0.29.32)"] -develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] -docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] +develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools_scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] [[package]] name = "statsmodels" @@ -3707,8 +3707,8 @@ scipy = {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_sys [package.extras] build = ["cython (>=0.29.32)"] -develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] -docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] +develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools_scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] [[package]] name = "statsmodels" @@ -4177,4 +4177,4 @@ viz = ["pygraphviz"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "07dc28f742cc74f0541e30f2ddee2613b3c17aae72bd9388cd4d9ecfbe71402a" +content-hash = "d43c687f97b3232a1a5107b49689226195007840b2439ed363ebc7f333c9c03c" diff --git a/pyproject.toml b/pyproject.toml index 91b928566..e1df9ac83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,6 +100,7 @@ dowhy = { version = "^0.8" } typing-extensions = { version = "*" } # needed in dowhy's package joblib = { version = "^1.1.0" } # needed in dowhy's package tqdm = { version = "^4.64.0" } # needed in dowhy's package +pooch = "^1.7.0" [tool.poetry.extras] graph_func = ['pywhy-graphs'] From 9b771e5613b567cdc2f3d4646642304952a40fec Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 28 Feb 2023 15:56:02 -1000 Subject: [PATCH 14/61] Fix erorrs raised by typecheck Signed-off-by: Adam Li --- dodiscover/cd/base.py | 4 ++-- dodiscover/cd/bregman.py | 10 +++++++--- dodiscover/cd/kernel_test.py | 14 +++++++++----- dodiscover/constraint/_classes.py | 2 +- dodiscover/constraint/skeleton.py | 2 +- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index a28679e4d..91beed5c4 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -26,11 +26,11 @@ class interface is expected to be very lightweight to enable anyone to convert def _check_test_input( self, df: pd.DataFrame, - x_vars: Set[Column], y_vars: Set[Column], group_col: Column, + x_vars: Optional[Set[Column]], ): - if any(col not in df.columns for col in x_vars): + if x_vars is not None and any(col not in df.columns for col in x_vars): raise ValueError("The x variables are not all in the DataFrame.") if any(col not in df.columns for col in y_vars): raise ValueError("The y variables are not all in the DataFrame.") diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index ee8e29b8c..b42f69f4f 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -78,12 +78,16 @@ def test( df: pd.DataFrame, y_vars: Set[Column], group_col: Column, - x_vars: Optional[Set[Column]], + x_vars: Optional[Set[Column]] = None, ) -> Tuple[float, float]: # check test input - self._check_test_input(df, x_vars, y_vars, group_col) + self._check_test_input(df, y_vars, group_col, x_vars) + + if x_vars is not None: + x_cols = list(x_vars) + else: + x_cols = None - x_cols = list(x_vars) y_cols = list(y_vars) group_ind = df[group_col].to_numpy() if set(np.unique(group_ind)) != {0, 1}: diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index ff4b0c3dc..36f30204a 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -94,7 +94,7 @@ def test( df: pd.DataFrame, y_vars: Set[Column], group_col: Column, - x_vars: Optional[Set[Column]], + x_vars: Optional[Set[Column]] = None, ) -> Tuple[float, float]: """Compute k-sample test statistic and pvalue. @@ -115,13 +115,13 @@ def test( df : pd.DataFrame The dataset containing the columns denoted by ``x_vars``, ``y_vars``, and the ``group_col``. - x_vars : Set[Column] - Set of X variables. y_vars : Set[Column] Set of Y variables. group_col : Column The column denoting, which group (i.e. environment) each sample belongs to. This is typically the F-node. Must be binary. + x_vars : Set[Column] + Set of X variables. Returns ------- @@ -131,9 +131,13 @@ def test( The computed p-value. """ # check test input - self._check_test_input(df, x_vars, y_vars, group_col) + self._check_test_input(df, y_vars, group_col, x_vars) + + if x_vars is not None: + x_cols = list(x_vars) + else: + x_cols = None - x_cols = list(x_vars) y_cols = list(y_vars) group_ind = df[group_col].to_numpy() diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index 897957943..7c11e94a5 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -123,7 +123,7 @@ def orient_edges(self, graph: EquivalenceClass) -> None: "skeleton graph given a separating set." ) - def fit(self, data: pd.DataFrame, context: Context) -> None: + def fit(self, data: pd.DataFrame, context: Context): """Fit constraint-based discovery algorithm on dataset 'X'. Parameters diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 78129997d..09e3886ad 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -949,7 +949,7 @@ def evaluate_fnode_edge( # indicates which distribution data came from # test graphically if Y is d-separated from F-node given Z # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, {group_col}, Y, Z) + test_stat, pvalue = self.cd_estimator.test(data, Y, group_col, Z) self.n_ci_tests += 1 return test_stat, pvalue From de979cc2d35ae76685bf52ff8591a738e5427b0d Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 28 Feb 2023 16:06:00 -1000 Subject: [PATCH 15/61] Remove verbosity Signed-off-by: Adam Li --- examples/ex_psifci_alg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ex_psifci_alg.py b/examples/ex_psifci_alg.py index a8c8cf26a..258b15058 100644 --- a/examples/ex_psifci_alg.py +++ b/examples/ex_psifci_alg.py @@ -50,7 +50,7 @@ # url: https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz # # Ref: https://erdogant.github.io/bnlearn/pages/html/bnlearn.bnlearn.html#bnlearn.bnlearn.import_example # noqa -df = bnlearn.import_example("sachs", n=2000) +df = bnlearn.import_example("sachs", n=2000, verbose=False) # use pooch to download robustly from a url url = "https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz" From 33f6a04bbe555b6065da1fd67f8a693a7a17458f Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 2 Mar 2023 15:02:56 -0800 Subject: [PATCH 16/61] Change exmaple name Signed-off-by: Adam Li --- .../{ex_psifci_alg.py => plot_psifci_alg.py} | 0 poetry.lock | 292 +++++++++--------- 2 files changed, 146 insertions(+), 146 deletions(-) rename examples/{ex_psifci_alg.py => plot_psifci_alg.py} (100%) diff --git a/examples/ex_psifci_alg.py b/examples/plot_psifci_alg.py similarity index 100% rename from examples/ex_psifci_alg.py rename to examples/plot_psifci_alg.py diff --git a/poetry.lock b/poetry.lock index 5e5f75a56..0f91c6915 100644 --- a/poetry.lock +++ b/poetry.lock @@ -45,18 +45,18 @@ tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy [[package]] name = "babel" -version = "2.11.0" +version = "2.12.1" description = "Internationalization utilities" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, - {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, ] [package.dependencies] -pytz = ">=2015.7" +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "backcall" @@ -564,63 +564,63 @@ test-no-images = ["pytest"] [[package]] name = "coverage" -version = "7.1.0" +version = "7.2.1" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf"}, - {file = "coverage-7.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801"}, - {file = "coverage-7.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75"}, - {file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c"}, - {file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada"}, - {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f"}, - {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a"}, - {file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c"}, - {file = "coverage-7.1.0-cp310-cp310-win32.whl", hash = "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352"}, - {file = "coverage-7.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038"}, - {file = "coverage-7.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040"}, - {file = "coverage-7.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a"}, - {file = "coverage-7.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f"}, - {file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222"}, - {file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146"}, - {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b"}, - {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2"}, - {file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e"}, - {file = "coverage-7.1.0-cp311-cp311-win32.whl", hash = "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7"}, - {file = "coverage-7.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c"}, - {file = "coverage-7.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d"}, - {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a"}, - {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8"}, - {file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050"}, - {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c"}, - {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d"}, - {file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3"}, - {file = "coverage-7.1.0-cp37-cp37m-win32.whl", hash = "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73"}, - {file = "coverage-7.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5"}, - {file = "coverage-7.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06"}, - {file = "coverage-7.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52"}, - {file = "coverage-7.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851"}, - {file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d"}, - {file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0"}, - {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912"}, - {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8"}, - {file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0"}, - {file = "coverage-7.1.0-cp38-cp38-win32.whl", hash = "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab"}, - {file = "coverage-7.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c"}, - {file = "coverage-7.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6"}, - {file = "coverage-7.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa"}, - {file = "coverage-7.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc"}, - {file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311"}, - {file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063"}, - {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09"}, - {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8"}, - {file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c"}, - {file = "coverage-7.1.0-cp39-cp39-win32.whl", hash = "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4"}, - {file = "coverage-7.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3"}, - {file = "coverage-7.1.0-pp37.pp38.pp39-none-any.whl", hash = "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda"}, - {file = "coverage-7.1.0.tar.gz", hash = "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265"}, + {file = "coverage-7.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8"}, + {file = "coverage-7.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03"}, + {file = "coverage-7.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339"}, + {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a"}, + {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820"}, + {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4"}, + {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6"}, + {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833"}, + {file = "coverage-7.2.1-cp310-cp310-win32.whl", hash = "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4"}, + {file = "coverage-7.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6"}, + {file = "coverage-7.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6"}, + {file = "coverage-7.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9"}, + {file = "coverage-7.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b"}, + {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319"}, + {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508"}, + {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed"}, + {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e"}, + {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b"}, + {file = "coverage-7.2.1-cp311-cp311-win32.whl", hash = "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80"}, + {file = "coverage-7.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273"}, + {file = "coverage-7.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97"}, + {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84"}, + {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd"}, + {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc"}, + {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e"}, + {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54"}, + {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5"}, + {file = "coverage-7.2.1-cp37-cp37m-win32.whl", hash = "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae"}, + {file = "coverage-7.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff"}, + {file = "coverage-7.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657"}, + {file = "coverage-7.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1"}, + {file = "coverage-7.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3"}, + {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99"}, + {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384"}, + {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa"}, + {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec"}, + {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2"}, + {file = "coverage-7.2.1-cp38-cp38-win32.whl", hash = "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0"}, + {file = "coverage-7.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb"}, + {file = "coverage-7.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef"}, + {file = "coverage-7.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454"}, + {file = "coverage-7.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993"}, + {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6"}, + {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63"}, + {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58"}, + {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e"}, + {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431"}, + {file = "coverage-7.2.1-cp39-cp39-win32.whl", hash = "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8"}, + {file = "coverage-7.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a"}, + {file = "coverage-7.2.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616"}, + {file = "coverage-7.2.1.tar.gz", hash = "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242"}, ] [package.dependencies] @@ -813,14 +813,14 @@ files = [ [[package]] name = "fastjsonschema" -version = "2.16.2" +version = "2.16.3" description = "Fastest Python implementation of JSON schema" category = "dev" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.16.2-py3-none-any.whl", hash = "sha256:21f918e8d9a1a4ba9c22e09574ba72267a6762d47822db9add95f6454e51cc1c"}, - {file = "fastjsonschema-2.16.2.tar.gz", hash = "sha256:01e366f25d9047816fe3d288cbfc3e10541daf0af2044763f3d0ade42476da18"}, + {file = "fastjsonschema-2.16.3-py3-none-any.whl", hash = "sha256:04fbecc94300436f628517b05741b7ea009506ce8f946d40996567c669318490"}, + {file = "fastjsonschema-2.16.3.tar.gz", hash = "sha256:4a30d6315a68c253cfa8f963b9697246315aa3db89f98b97235e345dedfb0b8e"}, ] [package.extras] @@ -979,14 +979,14 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.30" -description = "GitPython is a python library used to interact with Git repositories" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.30-py3-none-any.whl", hash = "sha256:cd455b0000615c60e286208ba540271af9fe531fa6a87cc590a7298785ab2882"}, - {file = "GitPython-3.1.30.tar.gz", hash = "sha256:769c2d83e13f5d938b7688479da374c4e3d49f71549aaf462b646db9602ea6f8"}, + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, ] [package.dependencies] @@ -1086,14 +1086,14 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag [[package]] name = "importlib-resources" -version = "5.10.2" +version = "5.12.0" description = "Read resources from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, - {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"}, + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, ] [package.dependencies] @@ -1332,14 +1332,14 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jupyter-client" -version = "8.0.2" +version = "8.0.3" description = "Jupyter protocol implementation and client libraries" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.0.2-py3-none-any.whl", hash = "sha256:c53731eb590b68839b0ce04bf46ff8c4f03278f5d9fe5c3b0f268a57cc2bd97e"}, - {file = "jupyter_client-8.0.2.tar.gz", hash = "sha256:47ac9f586dbcff4d79387ec264faf0fdeb5f14845fa7345fd7d1e378f8096011"}, + {file = "jupyter_client-8.0.3-py3-none-any.whl", hash = "sha256:be48ac6bd659cbbddb7a674cf06b3b8afbf53f228253cf58bde604c03bd487b0"}, + {file = "jupyter_client-8.0.3.tar.gz", hash = "sha256:ed65498bea6d876ef9d8da3e0db3dd33c5d129f5b2645f56ae03993782966bd0"}, ] [package.dependencies] @@ -2559,14 +2559,14 @@ yaspin = ">=0.15.0,<3" [[package]] name = "pre-commit" -version = "3.0.4" +version = "3.1.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pre_commit-3.0.4-py2.py3-none-any.whl", hash = "sha256:9e3255edb0c9e7fe9b4f328cb3dc86069f8fdc38026f1bf521018a05eaf4d67b"}, - {file = "pre_commit-3.0.4.tar.gz", hash = "sha256:bc4687478d55578c4ac37272fe96df66f73d9b5cf81be6f28627d4e712e752d5"}, + {file = "pre_commit-3.1.1-py2.py3-none-any.whl", hash = "sha256:b80254e60668e1dd1f5c03a1c9e0413941d61f568a57d745add265945f65bfe8"}, + {file = "pre_commit-3.1.1.tar.gz", hash = "sha256:d63e6537f9252d99f65755ae5b79c989b462d511ebbc481b561db6a297e1e865"}, ] [package.dependencies] @@ -2578,14 +2578,14 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.36" +version = "3.0.38" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, - {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, ] [package.dependencies] @@ -2951,13 +2951,13 @@ files = [ [[package]] name = "pyvis" -version = "0.3.1" +version = "0.3.2" description = "A Python network graph visualization library" category = "dev" optional = false python-versions = ">3.6" files = [ - {file = "pyvis-0.3.1.tar.gz", hash = "sha256:aa817caac54afc9a4df38ada6f46636b842a8bd57197bb6aca5084699da04307"}, + {file = "pyvis-0.3.2-py3-none-any.whl", hash = "sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555"}, ] [package.dependencies] @@ -2968,7 +2968,7 @@ networkx = ">=1.11" [[package]] name = "pywhy-graphs" -version = "0.0.0.post82.dev0+8e0b2d1" +version = "0.0.0" description = "Causal Graphs for Python" category = "main" optional = true @@ -2988,8 +2988,8 @@ viz = ["pygraphviz"] [package.source] type = "git" url = "https://github.com/py-why/pywhy-graphs.git" -reference = "main" -resolved_reference = "ba73b32a987e51fe01d6478d649938c2b72834ba" +reference = 'main' +resolved_reference = "953ecdb58cd544fce6f7db14ec8f1df601cf9043" [[package]] name = "pywin32" @@ -3230,33 +3230,33 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( [[package]] name = "scipy" -version = "1.10.0" +version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ - {file = "scipy-1.10.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b901b423c91281a974f6cd1c36f5c6c523e665b5a6d5e80fcb2334e14670eefd"}, - {file = "scipy-1.10.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16ba05d3d1b9f2141004f3f36888e05894a525960b07f4c2bfc0456b955a00be"}, - {file = "scipy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:151f066fe7d6653c3ffefd489497b8fa66d7316e3e0d0c0f7ff6acca1b802809"}, - {file = "scipy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9ea0a37aca111a407cb98aa4e8dfde6e5d9333bae06dfa5d938d14c80bb5c3"}, - {file = "scipy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:27e548276b5a88b51212b61f6dda49a24acf5d770dff940bd372b3f7ced8c6c2"}, - {file = "scipy-1.10.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:42ab8b9e7dc1ebe248e55f54eea5307b6ab15011a7883367af48dd781d1312e4"}, - {file = "scipy-1.10.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e096b062d2efdea57f972d232358cb068413dc54eec4f24158bcbb5cb8bddfd8"}, - {file = "scipy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df25a28bd22c990b22129d3c637fd5c3be4b7c94f975dca909d8bab3309b694"}, - {file = "scipy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad449db4e0820e4b42baccefc98ec772ad7818dcbc9e28b85aa05a536b0f1a2"}, - {file = "scipy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:6faf86ef7717891195ae0537e48da7524d30bc3b828b30c9b115d04ea42f076f"}, - {file = "scipy-1.10.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:4bd0e3278126bc882d10414436e58fa3f1eca0aa88b534fcbf80ed47e854f46c"}, - {file = "scipy-1.10.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:38bfbd18dcc69eeb589811e77fae552fa923067fdfbb2e171c9eac749885f210"}, - {file = "scipy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ab2a58064836632e2cec31ca197d3695c86b066bc4818052b3f5381bfd2a728"}, - {file = "scipy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd7a30970c29d9768a7164f564d1fbf2842bfc77b7d114a99bc32703ce0bf48"}, - {file = "scipy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:9b878c671655864af59c108c20e4da1e796154bd78c0ed6bb02bc41c84625686"}, - {file = "scipy-1.10.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:3afcbddb4488ac950ce1147e7580178b333a29cd43524c689b2e3543a080a2c8"}, - {file = "scipy-1.10.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:6e4497e5142f325a5423ff5fda2fff5b5d953da028637ff7c704378c8c284ea7"}, - {file = "scipy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:441cab2166607c82e6d7a8683779cb89ba0f475b983c7e4ab88f3668e268c143"}, - {file = "scipy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0490dc499fe23e4be35b8b6dd1e60a4a34f0c4adb30ac671e6332446b3cbbb5a"}, - {file = "scipy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:954ff69d2d1bf666b794c1d7216e0a746c9d9289096a64ab3355a17c7c59db54"}, - {file = "scipy-1.10.0.tar.gz", hash = "sha256:c8b3cbc636a87a89b770c6afc999baa6bcbb01691b5ccbbc1b1791c7c0a07540"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, ] [package.dependencies] @@ -3269,14 +3269,14 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "setuptools" -version = "67.3.1" +version = "67.4.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.3.1-py3-none-any.whl", hash = "sha256:23c86b4e44432bfd8899384afc08872ec166a24f48a3f99f293b0a557e6a6b5d"}, - {file = "setuptools-67.3.1.tar.gz", hash = "sha256:daec07fd848d80676694d6bf69c009d28910aeece68a38dbe88b7e1bb6dba12e"}, + {file = "setuptools-67.4.0-py3-none-any.whl", hash = "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251"}, + {file = "setuptools-67.4.0.tar.gz", hash = "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330"}, ] [package.extras] @@ -3988,14 +3988,14 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, ] [[package]] @@ -4017,14 +4017,14 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.19.0" +version = "20.20.0" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, - {file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, + {file = "virtualenv-20.20.0-py3-none-any.whl", hash = "sha256:3c22fa5a7c7aa106ced59934d2c20a2ecb7f49b4130b8bf444178a16b880fa45"}, + {file = "virtualenv-20.20.0.tar.gz", hash = "sha256:a8a4b8ca1e28f864b7514a253f98c1d62b64e31e77325ba279248c65fb4fcef4"}, ] [package.dependencies] @@ -4038,40 +4038,40 @@ test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess [[package]] name = "watchdog" -version = "2.2.1" +version = "2.3.1" description = "Filesystem events monitoring" category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a09483249d25cbdb4c268e020cb861c51baab2d1affd9a6affc68ffe6a231260"}, - {file = "watchdog-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5100eae58133355d3ca6c1083a33b81355c4f452afa474c2633bd2fbbba398b3"}, - {file = "watchdog-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e618a4863726bc7a3c64f95c218437f3349fb9d909eb9ea3a1ed3b567417c661"}, - {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:102a60093090fc3ff76c983367b19849b7cc24ec414a43c0333680106e62aae1"}, - {file = "watchdog-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:748ca797ff59962e83cc8e4b233f87113f3cf247c23e6be58b8a2885c7337aa3"}, - {file = "watchdog-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ccd8d84b9490a82b51b230740468116b8205822ea5fdc700a553d92661253a3"}, - {file = "watchdog-2.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6e01d699cd260d59b84da6bda019dce0a3353e3fcc774408ae767fe88ee096b7"}, - {file = "watchdog-2.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8586d98c494690482c963ffb24c49bf9c8c2fe0589cec4dc2f753b78d1ec301d"}, - {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:adaf2ece15f3afa33a6b45f76b333a7da9256e1360003032524d61bdb4c422ae"}, - {file = "watchdog-2.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83a7cead445008e880dbde833cb9e5cc7b9a0958edb697a96b936621975f15b9"}, - {file = "watchdog-2.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8ac23ff2c2df4471a61af6490f847633024e5aa120567e08d07af5718c9d092"}, - {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d0f29fd9f3f149a5277929de33b4f121a04cf84bb494634707cfa8ea8ae106a8"}, - {file = "watchdog-2.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:967636031fa4c4955f0f3f22da3c5c418aa65d50908d31b73b3b3ffd66d60640"}, - {file = "watchdog-2.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96cbeb494e6cbe3ae6aacc430e678ce4b4dd3ae5125035f72b6eb4e5e9eb4f4e"}, - {file = "watchdog-2.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61fdb8e9c57baf625e27e1420e7ca17f7d2023929cd0065eb79c83da1dfbeacd"}, - {file = "watchdog-2.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb5ecc332112017fbdb19ede78d92e29a8165c46b68a0b8ccbd0a154f196d5e"}, - {file = "watchdog-2.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a480d122740debf0afac4ddd583c6c0bb519c24f817b42ed6f850e2f6f9d64a8"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:978a1aed55de0b807913b7482d09943b23a2d634040b112bdf31811a422f6344"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:8c28c23972ec9c524967895ccb1954bc6f6d4a557d36e681a36e84368660c4ce"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_i686.whl", hash = "sha256:c27d8c1535fd4474e40a4b5e01f4ba6720bac58e6751c667895cbc5c8a7af33c"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d6b87477752bd86ac5392ecb9eeed92b416898c30bd40c7e2dd03c3146105646"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cece1aa596027ff56369f0b50a9de209920e1df9ac6d02c7f9e5d8162eb4f02b"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:8b5cde14e5c72b2df5d074774bdff69e9b55da77e102a91f36ef26ca35f9819c"}, - {file = "watchdog-2.2.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e038be858425c4f621900b8ff1a3a1330d9edcfeaa1c0468aeb7e330fb87693e"}, - {file = "watchdog-2.2.1-py3-none-win32.whl", hash = "sha256:bc43c1b24d2f86b6e1cc15f68635a959388219426109233e606517ff7d0a5a73"}, - {file = "watchdog-2.2.1-py3-none-win_amd64.whl", hash = "sha256:17f1708f7410af92ddf591e94ae71a27a13974559e72f7e9fde3ec174b26ba2e"}, - {file = "watchdog-2.2.1-py3-none-win_ia64.whl", hash = "sha256:195ab1d9d611a4c1e5311cbf42273bc541e18ea8c32712f2fb703cfc6ff006f9"}, - {file = "watchdog-2.2.1.tar.gz", hash = "sha256:cdcc23c9528601a8a293eb4369cbd14f6b4f34f07ae8769421252e9c22718b6f"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, + {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, + {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, + {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, + {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, + {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, + {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, + {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, + {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, + {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, ] [package.extras] @@ -4156,19 +4156,19 @@ termcolor = ">=2.2,<3.0" [[package]] name = "zipp" -version = "3.13.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "zipp-3.13.0-py3-none-any.whl", hash = "sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b"}, - {file = "zipp-3.13.0.tar.gz", hash = "sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] graph-func = ["pywhy-graphs"] From 5c777ef06e1157da272d5503d4bf3ad70a7af1f2 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 2 Mar 2023 15:49:19 -0800 Subject: [PATCH 17/61] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7625d5dc3..b5aae08a8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,10 +1,12 @@ version: 2.1 orbs: - python: circleci/python@2.0.3 + python: circleci/python@2.1.1 jobs: build_doc: + parameters: + tag: "3.10" executor: python/default steps: - restore_cache: @@ -62,6 +64,13 @@ jobs: echo "export DISPLAY=:99" >> $BASH_ENV echo "BASH_ENV:" cat $BASH_ENV + - run: + name: Install fonts needed for diagrams + command: | + mkdir -p $HOME/.fonts + curl https://codeload.github.com/adobe-fonts/source-code-pro/tar.gz/2.038R-ro/1.058R-it/1.018R-VAR | tar xz -C $HOME/.fonts + curl https://codeload.github.com/adobe-fonts/source-sans-pro/tar.gz/3.028R | tar xz -C $HOME/.fonts + fc-cache -f - run: name: Install pysal dependencies command: | From 1cac3f90fe76f84c8199fdb5b1417adaf45ad166 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 2 Mar 2023 16:15:22 -0800 Subject: [PATCH 18/61] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b5aae08a8..ee239c938 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,9 @@ orbs: jobs: build_doc: parameters: - tag: "3.10" + tag: + type: string + default: "3.10" executor: python/default steps: - restore_cache: From aed5dd7941e8059537b4ea21cfa7a1966a81c21f Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 2 Mar 2023 17:25:33 -0800 Subject: [PATCH 19/61] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ee239c938..04c0d73ff 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,11 +5,7 @@ orbs: jobs: build_doc: - parameters: - tag: - type: string - default: "3.10" - executor: python/default + executor: python/3.10 steps: - restore_cache: name: Restore .git From a04afb1b59812d036e7f52e78441395798d1dffe Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 3 Mar 2023 08:58:14 -0800 Subject: [PATCH 20/61] Fix Signed-off-by: Adam Li --- .circleci/config.yml | 2 +- examples/plot_psifci_alg.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 04c0d73ff..bf83f580b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ orbs: jobs: build_doc: - executor: python/3.10 + executor: python/default steps: - restore_cache: name: Restore .git diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 258b15058..49f0fc4eb 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -50,7 +50,6 @@ # url: https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz # # Ref: https://erdogant.github.io/bnlearn/pages/html/bnlearn.bnlearn.html#bnlearn.bnlearn.import_example # noqa -df = bnlearn.import_example("sachs", n=2000, verbose=False) # use pooch to download robustly from a url url = "https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz" From 220bdb6b67668532e046d128b556450ed269cc9b Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 3 Mar 2023 10:34:41 -0800 Subject: [PATCH 21/61] Fix unit tests and try ci Signed-off-by: Adam Li --- .circleci/config.yml | 12 ++++++------ tests/unit_tests/constraint/test_fcialg.py | 10 +++++----- tests/unit_tests/constraint/test_pcalg.py | 2 +- tests/unit_tests/constraint/test_skeleton.py | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bf83f580b..a8d65f1d6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -63,12 +63,12 @@ jobs: echo "BASH_ENV:" cat $BASH_ENV - run: - name: Install fonts needed for diagrams - command: | - mkdir -p $HOME/.fonts - curl https://codeload.github.com/adobe-fonts/source-code-pro/tar.gz/2.038R-ro/1.058R-it/1.018R-VAR | tar xz -C $HOME/.fonts - curl https://codeload.github.com/adobe-fonts/source-sans-pro/tar.gz/3.028R | tar xz -C $HOME/.fonts - fc-cache -f + name: Install fonts needed for diagrams + command: | + mkdir -p $HOME/.fonts + curl https://codeload.github.com/adobe-fonts/source-code-pro/tar.gz/2.038R-ro/1.058R-it/1.018R-VAR | tar xz -C $HOME/.fonts + curl https://codeload.github.com/adobe-fonts/source-sans-pro/tar.gz/3.028R | tar xz -C $HOME/.fonts + fc-cache -f - run: name: Install pysal dependencies command: | diff --git a/tests/unit_tests/constraint/test_fcialg.py b/tests/unit_tests/constraint/test_fcialg.py index dfb55f9e7..5acccd8c8 100644 --- a/tests/unit_tests/constraint/test_fcialg.py +++ b/tests/unit_tests/constraint/test_fcialg.py @@ -641,7 +641,7 @@ def test_fci_spirtes_example(self): assert set(expected_pag.edges()) == set(pag.edges()) @pytest.mark.parametrize( - "skeleton_method", + "condsel_method", [ ConditioningSetSelection.NBRS, ConditioningSetSelection.NBRS_PATH, @@ -649,10 +649,10 @@ def test_fci_spirtes_example(self): ], ) @pytest.mark.parametrize( - "pds_skeleton_method", [ConditioningSetSelection.PDS, ConditioningSetSelection.PDS_PATH] + "pds_condsel_method", [ConditioningSetSelection.PDS, ConditioningSetSelection.PDS_PATH] ) @pytest.mark.parametrize("selection_bias", [True, False]) - def test_fci_complex(self, skeleton_method, pds_skeleton_method, selection_bias): + def test_fci_complex(self, condsel_method, pds_condsel_method, selection_bias): """ Test FCI algorithm with more complex graph. @@ -681,8 +681,8 @@ def test_fci_complex(self, skeleton_method, pds_skeleton_method, selection_bias) fci = FCI( ci_estimator=ci_estimator, max_iter=np.inf, - skeleton_method=skeleton_method, - pds_skeleton_method=pds_skeleton_method, + condsel_method=condsel_method, + pds_condsel_method=pds_condsel_method, selection_bias=selection_bias, ) fci.fit(sample, context) diff --git a/tests/unit_tests/constraint/test_pcalg.py b/tests/unit_tests/constraint/test_pcalg.py index 5c963b190..803cb2687 100644 --- a/tests/unit_tests/constraint/test_pcalg.py +++ b/tests/unit_tests/constraint/test_pcalg.py @@ -22,7 +22,7 @@ "max_cond_set_size": 3, "max_combinations": 10, "max_iter": 10, - "skeleton_method": ConditioningSetSelection.NBRS_PATH, + "condsel_method": ConditioningSetSelection.NBRS_PATH, }, {}, ], diff --git a/tests/unit_tests/constraint/test_skeleton.py b/tests/unit_tests/constraint/test_skeleton.py index dff8fe9e2..551dbb4d9 100644 --- a/tests/unit_tests/constraint/test_skeleton.py +++ b/tests/unit_tests/constraint/test_skeleton.py @@ -148,7 +148,7 @@ def test_learn_skeleton_pds_disabled_first_stage(): expected_skel = nx.Graph(edge_list) # learn the skeleton of the graph now with the first stage skeleton - alg = LearnSemiMarkovianSkeleton(ci_estimator=ci_estimator, second_stage_skeleton_method=None) + alg = LearnSemiMarkovianSkeleton(ci_estimator=ci_estimator, second_stage_condsel_method=None) alg.fit(sample, context) assert alg.context_.state_variable("PAG", on_missing="ignore") is None assert nx.is_isomorphic(expected_skel, alg.adj_graph_) From be5d05967dba34f6a950850c3774542debc0f753 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 3 Mar 2023 10:39:36 -0800 Subject: [PATCH 22/61] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a8d65f1d6..6b0e056a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -55,12 +55,12 @@ jobs: sudo apt update sudo apt-get update sudo apt install -qq graphviz optipng libxft2 graphviz-dev - echo "set -e" >> $BASH_ENV - echo "export OPENBLAS_NUM_THREADS=4" >> $BASH_ENV - echo "export XDG_RUNTIME_DIR=/tmp/runtime-circleci" >> $BASH_ENV - echo "export PATH=~/.local/bin/:$PATH" >> $BASH_ENV - echo "export DISPLAY=:99" >> $BASH_ENV - echo "BASH_ENV:" + echo 'set -e' >> $BASH_ENV + echo 'export OPENBLAS_NUM_THREADS=4' >> $BASH_ENV + echo 'export XDG_RUNTIME_DIR=/tmp/runtime-circleci' >> $BASH_ENV + echo 'export PATH=~/.local/bin/:$PATH' >> $BASH_ENV + echo 'export DISPLAY=:99' >> $BASH_ENV + echo 'BASH_ENV:' cat $BASH_ENV - run: name: Install fonts needed for diagrams From 74283c454df3ba6a2fcb6eb1cc3fcdf4f80f9c8e Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 3 Mar 2023 11:07:22 -0800 Subject: [PATCH 23/61] Comment out ground truth dag Signed-off-by: Adam Li --- .circleci/config.yml | 2 +- dodiscover/ci/base.py | 4 +++- dodiscover/constraint/skeleton.py | 4 ++-- examples/plot_psifci_alg.py | 6 +++--- poetry.lock | 6 +++--- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6b0e056a4..49aca977b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -76,7 +76,7 @@ jobs: - python/install-packages: pkg-manager: poetry args: "-E graph_func -E viz --with docs" - cache-version: "v1" # change to clear cache + cache-version: "v2" # change to clear cache - run: name: Check poetry package versions command: | diff --git a/dodiscover/ci/base.py b/dodiscover/ci/base.py index a2209e24e..b535fe1bf 100644 --- a/dodiscover/ci/base.py +++ b/dodiscover/ci/base.py @@ -32,7 +32,9 @@ def _check_test_input( if any(col not in df.columns for col in x_vars): raise ValueError(f"The x variables {x_vars} are not all in the DataFrame.") if any(col not in df.columns for col in y_vars): - raise ValueError(f"The y variables {y_vars} are not all in the DataFrame.") + raise ValueError( + f"The y variables {y_vars} are not all in the DataFrame: {df.columns}." + ) if z_covariates is not None and any(col not in df.columns for col in z_covariates): raise ValueError( f"The z conditioning set variables {z_covariates} are not all in the " diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 09e3886ad..2c5c6aae6 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -949,7 +949,7 @@ def evaluate_fnode_edge( # indicates which distribution data came from # test graphically if Y is d-separated from F-node given Z # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, Y, group_col, Z) + test_stat, pvalue = self.cd_estimator.test(data, Y, X, Z) self.n_ci_tests += 1 return test_stat, pvalue @@ -1082,7 +1082,7 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co # compute conditional independence test test_stat, pvalue = self.evaluate_fnode_edge( - interv_data, {x_var}, {y_var}, set(cond_set) + interv_data, set({x_var}), set({y_var}), set(cond_set) ) # if any "independence" is found through inability to reject diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 49f0fc4eb..cb2f973af 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -60,9 +60,9 @@ df = pd.read_csv(file_path, delimiter=" ") -# the ground-truth dag is shown here -ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) -fig = bnlearn.plot(ground_truth_dag) +# the ground-truth dag is shown here: XXX: comment in when errors are fixed +# ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) +# fig = bnlearn.plot(ground_truth_dag) # .. note:: # The Sachs dataset has previously been preprocessed, and the steps are described diff --git a/poetry.lock b/poetry.lock index 0f91c6915..4a37eee66 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2463,14 +2463,14 @@ files = [ [[package]] name = "platformdirs" -version = "3.0.0" +version = "3.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, - {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, + {file = "platformdirs-3.1.0-py3-none-any.whl", hash = "sha256:13b08a53ed71021350c9e300d4ea8668438fb0046ab3937ac9a29913a1a1350a"}, + {file = "platformdirs-3.1.0.tar.gz", hash = "sha256:accc3665857288317f32c7bebb5a8e482ba717b474f3fc1d18ca7f9214be0cef"}, ] [package.extras] From 31a42e93fd2733d80ba98e42dc36542a81e1f6e8 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 11:28:42 -0500 Subject: [PATCH 24/61] Merge main pywhygraphs Signed-off-by: Adam Li --- dodiscover/replearning/gin.py | 4 +- examples/plot_psifci_alg.py | 4 +- poetry.lock | 319 +++++++++--------- pyproject.toml | 2 +- .../constraint/test_fci_causal_learn.py | 4 +- .../constraint/test_pc_causal_learn.py | 6 +- 6 files changed, 162 insertions(+), 177 deletions(-) diff --git a/dodiscover/replearning/gin.py b/dodiscover/replearning/gin.py index 563009220..59dfe107f 100644 --- a/dodiscover/replearning/gin.py +++ b/dodiscover/replearning/gin.py @@ -3,7 +3,7 @@ """ from pandas import DataFrame -from pywhy_graphs.array.export import clearn_arr_to_graph +from pywhy_graphs.export import clearn_to_graph class GIN: @@ -94,4 +94,4 @@ def fit(self, data: DataFrame, context: DataFrame): self.causal_learn_graph_ = causal_learn_graph names = [n.name for n in causal_learn_graph.nodes] adj_mat = causal_learn_graph.graph - self.graph = clearn_arr_to_graph(adj_mat, names, "cpdag") + self.graph = clearn_to_graph(adj_mat, names, "cpdag") diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index cb2f973af..0e128962b 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -61,8 +61,8 @@ df = pd.read_csv(file_path, delimiter=" ") # the ground-truth dag is shown here: XXX: comment in when errors are fixed -# ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) -# fig = bnlearn.plot(ground_truth_dag) +ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) +fig = bnlearn.plot(ground_truth_dag) # .. note:: # The Sachs dataset has previously been preprocessed, and the steps are described diff --git a/poetry.lock b/poetry.lock index 4a37eee66..e019b0d1d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -171,14 +171,14 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "bnlearn" -version = "0.7.12" +version = "0.7.14" description = "Python package for learning the graphical structure of Bayesian networks, parameter learning, inference and sampling methods." category = "dev" optional = false python-versions = ">=3" files = [ - {file = "bnlearn-0.7.12-py3-none-any.whl", hash = "sha256:ed69fb1170fa6048c8fb0ea7b123e36db7eb51fc2840295717299c62e752b68a"}, - {file = "bnlearn-0.7.12.tar.gz", hash = "sha256:7eb04bcb0da8f527c0a8a1a80a92aab782cff69835ddb7580ab947f11a84edf5"}, + {file = "bnlearn-0.7.14-py3-none-any.whl", hash = "sha256:b0abcf73858cf4cd6460dc0dacd4fce03598de1e5ac15baeb613f970c4eec821"}, + {file = "bnlearn-0.7.14.tar.gz", hash = "sha256:8a015287dc3f30d3288fc56939bc484ba186a36d10aad178b6c834e6e9295f44"}, ] [package.dependencies] @@ -189,18 +189,18 @@ ipywidgets = "*" ismember = "*" matplotlib = ">=3.3.4" networkx = ">=2.7.1" -numpy = "*" +numpy = ">=1.24.1" packaging = "*" pandas = "*" pgmpy = ">=0.1.18" pypickle = "*" python-louvain = "*" pyvis = "*" +requests = "*" scikit-learn = "*" statsmodels = "*" tabulate = "*" tqdm = "*" -wget = "*" [[package]] name = "causal-learn" @@ -329,100 +329,87 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.0.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, - {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, - {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, - {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, - {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, - {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, - {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, - {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] [[package]] @@ -873,18 +860,18 @@ files = [ [[package]] name = "fonttools" -version = "4.38.0" +version = "4.39.0" description = "Tools to manipulate font files" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, - {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, + {file = "fonttools-4.39.0-py3-none-any.whl", hash = "sha256:f5e764e1fd6ad54dfc201ff32af0ba111bcfbe0d05b24540af74c63db4ed6390"}, + {file = "fonttools-4.39.0.zip", hash = "sha256:909c104558835eac27faeb56be5a4c32694192dca123d073bf746ce9254054af"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -894,19 +881,19 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] +unicode = ["unicodedata2 (>=15.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2023.1.0" +version = "2023.3.0" description = "File-system specification" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fsspec-2023.1.0-py3-none-any.whl", hash = "sha256:b833e2e541e9e8cde0ab549414187871243177feb3d344f9d27b25a93f5d8139"}, - {file = "fsspec-2023.1.0.tar.gz", hash = "sha256:fbae7f20ff801eb5f7d0bedf81f25c787c0dfac5e982d98fa3884a9cde2b5411"}, + {file = "fsspec-2023.3.0-py3-none-any.whl", hash = "sha256:bf57215e19dbfa4fe7edae53040cc1deef825e3b1605cca9a8d2c2fadd2328a0"}, + {file = "fsspec-2023.3.0.tar.gz", hash = "sha256:24e635549a590d74c6c18274ddd3ffab4753341753e923408b1904eaabafe04d"}, ] [package.extras] @@ -915,7 +902,6 @@ adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] -entrypoints = ["importlib-metadata"] fuse = ["fusepy"] gcs = ["gcsfs"] git = ["pygit2"] @@ -1117,14 +1103,14 @@ files = [ [[package]] name = "ipykernel" -version = "6.21.2" +version = "6.21.3" description = "IPython Kernel for Jupyter" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.21.2-py3-none-any.whl", hash = "sha256:430d00549b6aaf49bd0f5393150691edb1815afa62d457ee6b1a66b25cb17874"}, - {file = "ipykernel-6.21.2.tar.gz", hash = "sha256:6e9213484e4ce1fb14267ee435e18f23cc3a0634e635b9fb4ed4677b84e0fdf8"}, + {file = "ipykernel-6.21.3-py3-none-any.whl", hash = "sha256:24ebd9715e317c185e37156ab3a87382410185230dde7aeffce389d6c7d4428a"}, + {file = "ipykernel-6.21.3.tar.gz", hash = "sha256:c8ff581905d70e7299bc1473a2f7c113bec1744fb3746d58e5b4b93bd8ee7001"}, ] [package.dependencies] @@ -1607,53 +1593,53 @@ files = [ [[package]] name = "matplotlib" -version = "3.7.0" +version = "3.7.1" description = "Python plotting package" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:3da8b9618188346239e51f1ea6c0f8f05c6e218cfcc30b399dd7dd7f52e8bceb"}, - {file = "matplotlib-3.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c0592ba57217c22987b7322df10f75ef95bc44dce781692b4b7524085de66019"}, - {file = "matplotlib-3.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:21269450243d6928da81a9bed201f0909432a74e7d0d65db5545b9fa8a0d0223"}, - {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb2e76cd429058d8954121c334dddfcd11a6186c6975bca61f3f248c99031b05"}, - {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de20eb1247725a2f889173d391a6d9e7e0f2540feda24030748283108b0478ec"}, - {file = "matplotlib-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5465735eaaafd1cfaec3fed60aee776aeb3fd3992aa2e49f4635339c931d443"}, - {file = "matplotlib-3.7.0-cp310-cp310-win32.whl", hash = "sha256:092e6abc80cdf8a95f7d1813e16c0e99ceda8d5b195a3ab859c680f3487b80a2"}, - {file = "matplotlib-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:4f640534ec2760e270801056bc0d8a10777c48b30966eef78a7c35d8590915ba"}, - {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f336e7014889c38c59029ebacc35c59236a852e4b23836708cfd3f43d1eaeed5"}, - {file = "matplotlib-3.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a10428d4f8d1a478ceabd652e61a175b2fdeed4175ab48da4a7b8deb561e3fa"}, - {file = "matplotlib-3.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46ca923e980f76d34c1c633343a72bb042d6ba690ecc649aababf5317997171d"}, - {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c849aa94ff2a70fb71f318f48a61076d1205c6013b9d3885ade7f992093ac434"}, - {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:827e78239292e561cfb70abf356a9d7eaf5bf6a85c97877f254009f20b892f89"}, - {file = "matplotlib-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:691ef1f15360e439886186d0db77b5345b24da12cbc4fc57b26c4826db4d6cab"}, - {file = "matplotlib-3.7.0-cp311-cp311-win32.whl", hash = "sha256:21a8aeac39b4a795e697265d800ce52ab59bdeb6bb23082e2d971f3041074f02"}, - {file = "matplotlib-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:01681566e95b9423021b49dea6a2395c16fa054604eacb87f0f4c439750f9114"}, - {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cf119eee4e57389fba5ac8b816934e95c256535e55f0b21628b4205737d1de85"}, - {file = "matplotlib-3.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:21bd4033c40b95abd5b8453f036ed5aa70856e56ecbd887705c37dce007a4c21"}, - {file = "matplotlib-3.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:111ef351f28fd823ed7177632070a6badd6f475607122bc9002a526f2502a0b5"}, - {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f91d35b3ef51d29d9c661069b9e4ba431ce283ffc533b981506889e144b5b40e"}, - {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a776462a4a63c0bfc9df106c15a0897aa2dbab6795c693aa366e8e283958854"}, - {file = "matplotlib-3.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dfd4a0cbd151f6439e6d7f8dca5292839ca311e7e650596d073774847ca2e4f"}, - {file = "matplotlib-3.7.0-cp38-cp38-win32.whl", hash = "sha256:56b7b79488209041a9bf7ddc34f1b069274489ce69e34dc63ae241d0d6b4b736"}, - {file = "matplotlib-3.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:8665855f3919c80551f377bc16df618ceabf3ef65270bc14b60302dce88ca9ab"}, - {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:f910d924da8b9fb066b5beae0b85e34ed1b6293014892baadcf2a51da1c65807"}, - {file = "matplotlib-3.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cf6346644e8fe234dc847e6232145dac199a650d3d8025b3ef65107221584ba4"}, - {file = "matplotlib-3.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d1e52365d8d5af699f04581ca191112e1d1220a9ce4386b57d807124d8b55e6"}, - {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c869b646489c6a94375714032e5cec08e3aa8d3f7d4e8ef2b0fb50a52b317ce6"}, - {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4ddac5f59e78d04b20469bc43853a8e619bb6505c7eac8ffb343ff2c516d72f"}, - {file = "matplotlib-3.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb0304c1cd802e9a25743414c887e8a7cd51d96c9ec96d388625d2cd1c137ae3"}, - {file = "matplotlib-3.7.0-cp39-cp39-win32.whl", hash = "sha256:a06a6c9822e80f323549c6bc9da96d4f233178212ad9a5f4ab87fd153077a507"}, - {file = "matplotlib-3.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:cb52aa97b92acdee090edfb65d1cb84ea60ab38e871ba8321a10bbcebc2a3540"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3493b48e56468c39bd9c1532566dff3b8062952721b7521e1f394eb6791495f4"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d0dcd1a0bf8d56551e8617d6dc3881d8a1c7fb37d14e5ec12cbb293f3e6170a"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51fb664c37714cbaac69c16d6b3719f517a13c96c3f76f4caadd5a0aa7ed0329"}, - {file = "matplotlib-3.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4497d88c559b76da320b7759d64db442178beeea06a52dc0c629086982082dcd"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9d85355c48ef8b9994293eb7c00f44aa8a43cad7a297fbf0770a25cdb2244b91"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03eb2c8ff8d85da679b71e14c7c95d16d014c48e0c0bfa14db85f6cdc5c92aad"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71b751d06b2ed1fd017de512d7439c0259822864ea16731522b251a27c0b2ede"}, - {file = "matplotlib-3.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b51ab8a5d5d3bbd4527af633a638325f492e09e45e78afdf816ef55217a09664"}, - {file = "matplotlib-3.7.0.tar.gz", hash = "sha256:8f6efd313430d7ef70a38a3276281cb2e8646b3a22b3b21eb227da20e15e6813"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, ] [package.dependencies] @@ -2787,18 +2773,19 @@ files = [ [[package]] name = "pymdown-extensions" -version = "9.9.2" +version = "9.10" description = "Extension pack for Python Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-9.9.2-py3-none-any.whl", hash = "sha256:c3d804eb4a42b85bafb5f36436342a5ad38df03878bb24db8855a4aa8b08b765"}, - {file = "pymdown_extensions-9.9.2.tar.gz", hash = "sha256:ebb33069bafcb64d5f5988043331d4ea4929325dc678a6bcf247ddfcf96499f8"}, + {file = "pymdown_extensions-9.10-py3-none-any.whl", hash = "sha256:31eaa76ce6f96aabfcea98787c2fff2c5c0611b20a53a94213970cfbf05f02b8"}, + {file = "pymdown_extensions-9.10.tar.gz", hash = "sha256:562c38eee4ce3f101ce631b804bfc2177a8a76c7e4dc908871fb6741a90257a7"}, ] [package.dependencies] markdown = ">=3.2" +pyyaml = "*" [[package]] name = "pyparsing" @@ -2866,14 +2853,14 @@ files = [ [[package]] name = "pytest" -version = "7.2.1" +version = "7.2.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, - {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, + {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, + {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, ] [package.dependencies] @@ -2989,7 +2976,7 @@ viz = ["pygraphviz"] type = "git" url = "https://github.com/py-why/pywhy-graphs.git" reference = 'main' -resolved_reference = "953ecdb58cd544fce6f7db14ec8f1df601cf9043" +resolved_reference = "67858e2af4b466e8717f44b8c014252caccde74f" [[package]] name = "pywin32" @@ -3269,14 +3256,14 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "setuptools" -version = "67.4.0" +version = "67.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.4.0-py3-none-any.whl", hash = "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251"}, - {file = "setuptools-67.4.0.tar.gz", hash = "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330"}, + {file = "setuptools-67.5.1-py3-none-any.whl", hash = "sha256:1c39d42bda4cb89f7fdcad52b6762e3c309ec8f8715b27c684176b7d71283242"}, + {file = "setuptools-67.5.1.tar.gz", hash = "sha256:15136a251127da2d2e77ac7a1bc231eb504654f7e3346d93613a13f2e2787535"}, ] [package.extras] @@ -3951,14 +3938,14 @@ files = [ [[package]] name = "tqdm" -version = "4.64.1" +version = "4.65.0" description = "Fast, Extensible Progress Meter" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.7" files = [ - {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, - {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, ] [package.dependencies] @@ -4177,4 +4164,4 @@ viz = ["pygraphviz"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "d43c687f97b3232a1a5107b49689226195007840b2439ed363ebc7f333c9c03c" +content-hash = "7bdc45ff215348c0eb60dd63b13f6251fc592fb4286259704188543bac1887d0" diff --git a/pyproject.toml b/pyproject.toml index e1df9ac83..550e2dccd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,7 +71,7 @@ pytest-cov = "^3.0.0" memory_profiler = { version = "^0.60.0" } flaky = "^3.7.0" causal-learn = "^0.1.3.1" # these packages are only needed for integration testing -bnlearn = "^0.7.12" +bnlearn = "^0.7.14" dowhy = { version = "^0.8" } typing-extensions = { version = "*" } # needed in dowhy's package joblib = { version = "^1.1.0" } # needed in dowhy's package diff --git a/tests/integration_tests/constraint/test_fci_causal_learn.py b/tests/integration_tests/constraint/test_fci_causal_learn.py index 585e53cff..db8d167aa 100644 --- a/tests/integration_tests/constraint/test_fci_causal_learn.py +++ b/tests/integration_tests/constraint/test_fci_causal_learn.py @@ -4,7 +4,7 @@ from causallearn.search.ConstraintBased.FCI import fci from dowhy import gcm from dowhy.gcm.util.general import set_random_seed -from pywhy_graphs.array.export import clearn_arr_to_graph +from pywhy_graphs.export import clearn_to_graph from scipy import stats from dodiscover import FCI, make_context @@ -119,7 +119,7 @@ def test_fci_against_causallearn(): dodiscover_graph = fci_alg.graph_ # first compare the adjacency structure - clearn_graph = clearn_arr_to_graph(clearn_graph.graph, arr_idx=data.columns, graph_type="pag") + clearn_graph = clearn_to_graph(clearn_graph.graph, arr_idx=data.columns, graph_type="pag") cm = confusion_matrix_networks(dodiscover_graph, clearn_graph) dia = np.diag_indices(cm.shape[0]) # indices of diagonal elements diff --git a/tests/integration_tests/constraint/test_pc_causal_learn.py b/tests/integration_tests/constraint/test_pc_causal_learn.py index 6e277c753..ef7508613 100644 --- a/tests/integration_tests/constraint/test_pc_causal_learn.py +++ b/tests/integration_tests/constraint/test_pc_causal_learn.py @@ -2,7 +2,7 @@ import networkx as nx import pytest from causallearn.search.ConstraintBased.PC import pc_alg -from pywhy_graphs.array.export import clearn_arr_to_graph +from pywhy_graphs.export import clearn_to_graph from sklearn.preprocessing import LabelEncoder from dodiscover import PC, make_context @@ -132,9 +132,7 @@ def test_pc_against_causallearn(dataset, ci_estimator, clearn_test, col_names, c # convert to pywhy graph nodes = [node.get_name() for node in clearn_graph.G.nodes] - clearn_pywhy_graph = clearn_arr_to_graph( - clearn_graph.G.graph, arr_idx=nodes, graph_type="cpdag" - ) + clearn_pywhy_graph = clearn_to_graph(clearn_graph.G.graph, arr_idx=nodes, graph_type="cpdag") print(pywhy_graph) print(clearn_pywhy_graph) print(clearn_graph.G.graph) From 291ec90b3958afe0bd5307f48681593a04fd35d8 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 11:51:55 -0500 Subject: [PATCH 25/61] Try again Signed-off-by: Adam Li --- .circleci/config.yml | 3 +-- doc/_templates/docs-navbar.html | 2 +- doc/_templates/layout.html | 2 +- doc/_templates/version-switcher.html | 2 +- doc/conf.py | 3 +++ dodiscover/constraint/skeleton.py | 15 ++++++--------- examples/plot_psifci_alg.py | 2 ++ tests/unit_tests/conditional/ci/test_ci.py | 2 +- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 49aca977b..0de35ee79 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -94,8 +94,7 @@ jobs: - run: name: Build documentation command: | - cd doc - poetry run make html + poetry run poe build_docs # Save the example test results - store_test_results: path: doc/_build/test-results diff --git a/doc/_templates/docs-navbar.html b/doc/_templates/docs-navbar.html index 3ab07e687..a7d1f4a77 100644 --- a/doc/_templates/docs-navbar.html +++ b/doc/_templates/docs-navbar.html @@ -10,7 +10,7 @@ diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html index dbb4e67bb..790fefe1b 100755 --- a/doc/_templates/layout.html +++ b/doc/_templates/layout.html @@ -12,7 +12,7 @@ {% endblock %} {% block extrahead %} - + {{ super() }} diff --git a/doc/_templates/version-switcher.html b/doc/_templates/version-switcher.html index 13571117c..1626c1883 100644 --- a/doc/_templates/version-switcher.html +++ b/doc/_templates/version-switcher.html @@ -5,7 +5,7 @@ diff --git a/doc/conf.py b/doc/conf.py index aba2f88fb..ee35a1597 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -56,8 +56,11 @@ "numpydoc", "IPython.sphinxext.ipython_console_highlighting", "nbsphinx", + "sphinx.ext.graphviz", ] +graphviz_output_format = 'png' + # configure sphinx-copybutton copybutton_prompt_text = r">>> |\.\.\. |\$ " copybutton_prompt_is_regexp = True diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 2c5c6aae6..5e453a36f 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -903,7 +903,7 @@ def __init__( def evaluate_fnode_edge( self, data: List[pd.DataFrame], - X: Set[Column], + X: Column, Y: Set[Column], Z: Optional[Set[Column]] = None, ) -> Tuple[float, float]: @@ -930,26 +930,23 @@ def evaluate_fnode_edge( if Z is None: Z = set() - # extract the F-node name - group_col: Column = reduce(lambda x: x, X) # type: ignore - # get the sigma-map for this F-node - distribution_idx = self.context_.sigma_map[group_col] + distribution_idx = self.context_.sigma_map[X] # get the distributions across the two distributions data_i = data[distribution_idx[0]].copy() data_j = data[distribution_idx[1]].copy() # name the group column the F-node, so Oracle works as expected - data_i[group_col] = 0 - data_j[group_col] = 1 + data_i[X] = 0 + data_j[X] = 1 data = pd.concat((data_i, data_j), axis=0) # compare conditional distributions P(Y | X) vs P'(Y | X), where 'group_col' # indicates which distribution data came from # test graphically if Y is d-separated from F-node given Z # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, Y, X, Z) + test_stat, pvalue = self.cd_estimator.test(data, Y, {X}, Z) self.n_ci_tests += 1 return test_stat, pvalue @@ -1082,7 +1079,7 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co # compute conditional independence test test_stat, pvalue = self.evaluate_fnode_edge( - interv_data, set({x_var}), set({y_var}), set(cond_set) + interv_data, x_var, set({y_var}), set(cond_set) ) # if any "independence" is found through inability to reject diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 0e128962b..c31a2b65e 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -142,7 +142,9 @@ est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes()) dot_graph = draw(est_pag_no_fnodes, direction="LR") dot_graph.render(outfile="psi_pag.png", view=True) +dot_graph.render(outfile="psi_pag.dot", view=True) +# .. graphviz:: psi_pag.dot # References # ---------- diff --git a/tests/unit_tests/conditional/ci/test_ci.py b/tests/unit_tests/conditional/ci/test_ci.py index 2421734b8..195c2d840 100644 --- a/tests/unit_tests/conditional/ci/test_ci.py +++ b/tests/unit_tests/conditional/ci/test_ci.py @@ -25,7 +25,7 @@ def test_ci_tests(ci_estimator): x = "x" y = "y" - with pytest.raises(ValueError, match="The z conditioning set variables are not all"): + with pytest.raises(ValueError, match="The z conditioning set variables .* are not all"): ci_estimator.test(sample_df, {x}, {y}, z_covariates=["blah"]) with pytest.raises(ValueError, match="The x variables.*are not all"): From f7288c4317166bf1c68650faa49b5720f742b5f7 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 11:52:02 -0500 Subject: [PATCH 26/61] Try again Signed-off-by: Adam Li --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index ee35a1597..e9822656a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -59,7 +59,7 @@ "sphinx.ext.graphviz", ] -graphviz_output_format = 'png' +graphviz_output_format = "png" # configure sphinx-copybutton copybutton_prompt_text = r">>> |\.\.\. |\$ " From 3c5ad3eba09fb8cab52bd312330dd23d3cad4e1d Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 12:28:10 -0500 Subject: [PATCH 27/61] Adding scraper Signed-off-by: Adam Li --- doc/conf.py | 7 +++++++ dodiscover/cd/base.py | 9 +++++++-- dodiscover/cd/bregman.py | 7 ++++--- dodiscover/cd/kernel_test.py | 8 ++++---- dodiscover/constraint/skeleton.py | 1 - examples/plot_psifci_alg.py | 1 - 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index e9822656a..5e95e5c37 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -263,6 +263,13 @@ } scrapers = ("matplotlib",) +# Add pygraphviz png scraper, if available +try: + from pygraphviz.scraper import PNGScraper + + scrapers += (PNGScraper(),) +except ImportError: + pass sphinx_gallery_conf = { "doc_module": "dodiscover", diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index 91beed5c4..6f47f349c 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -27,7 +27,7 @@ def _check_test_input( self, df: pd.DataFrame, y_vars: Set[Column], - group_col: Column, + group_col: Set[Column], x_vars: Optional[Set[Column]], ): if x_vars is not None and any(col not in df.columns for col in x_vars): @@ -53,12 +53,17 @@ def _check_test_input( f"there are {len(df[group_col].unique())} samples." ) + if len(group_col) > 1: + raise RuntimeError( + f"Group column should be only one column (one node) in the data {group_col}." + ) + @abstractmethod def test( self, df: pd.DataFrame, y_vars: Set[Column], - group_col: Column, + group_col: Set[Column], x_vars: Optional[Set[Column]], ) -> Tuple[float, float]: """Abstract method for all conditional discrepancy tests. diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index b42f69f4f..854437cbd 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -77,11 +77,12 @@ def test( self, df: pd.DataFrame, y_vars: Set[Column], - group_col: Column, + group_col: Set[Column], x_vars: Optional[Set[Column]] = None, ) -> Tuple[float, float]: # check test input self._check_test_input(df, y_vars, group_col, x_vars) + group_col_var: Column = list(group_col)[0] if x_vars is not None: x_cols = list(x_vars) @@ -89,9 +90,9 @@ def test( x_cols = None y_cols = list(y_vars) - group_ind = df[group_col].to_numpy() + group_ind = df[group_col_var].to_numpy() if set(np.unique(group_ind)) != {0, 1}: - raise RuntimeError(f"Group indications in {group_col} column should be all 1 or 0.") + raise RuntimeError(f"Group indications in {group_col_var} column should be all 1 or 0.") # get the X and Y dataset X = df[x_cols].to_numpy() diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index 36f30204a..5a31ce5e2 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -93,7 +93,7 @@ def test( self, df: pd.DataFrame, y_vars: Set[Column], - group_col: Column, + group_col: Set[Column], x_vars: Optional[Set[Column]] = None, ) -> Tuple[float, float]: """Compute k-sample test statistic and pvalue. @@ -132,7 +132,7 @@ def test( """ # check test input self._check_test_input(df, y_vars, group_col, x_vars) - + group_col_var: Column = list(group_col)[0] if x_vars is not None: x_cols = list(x_vars) else: @@ -140,9 +140,9 @@ def test( y_cols = list(y_vars) - group_ind = df[group_col].to_numpy() + group_ind = df[group_col_var].to_numpy() if set(np.unique(group_ind)) != {0, 1}: - raise RuntimeError(f"Group indications in {group_col} column should be all 1 or 0.") + raise RuntimeError(f"Group indications in {group_col_var} column should be all 1 or 0.") # compute kernel for the X and Y data X = df[x_cols].to_numpy() diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 5e453a36f..dca688515 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1,7 +1,6 @@ import logging from collections import defaultdict from copy import deepcopy -from functools import reduce from itertools import chain, combinations from typing import Iterable, List, Optional, Set, SupportsFloat, Tuple, Union diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index c31a2b65e..b7a4bb21c 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -142,7 +142,6 @@ est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes()) dot_graph = draw(est_pag_no_fnodes, direction="LR") dot_graph.render(outfile="psi_pag.png", view=True) -dot_graph.render(outfile="psi_pag.dot", view=True) # .. graphviz:: psi_pag.dot From c9e185d139f3cbe8852366b9ae4d5c4073cdad05 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 13:43:51 -0500 Subject: [PATCH 28/61] Adding unit tests fix Signed-off-by: Adam Li --- dodiscover/cd/base.py | 23 +++++++++--------- tests/unit_tests/conditional/cd/test_cd.py | 27 ++++++++++++---------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index 6f47f349c..515459090 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -30,34 +30,35 @@ def _check_test_input( group_col: Set[Column], x_vars: Optional[Set[Column]], ): + if len(group_col) > 1: + raise ValueError( + f"Group column should be only one column (one node) in the data {group_col}." + ) + group_col_var: Column = list(group_col)[0] + if x_vars is not None and any(col not in df.columns for col in x_vars): raise ValueError("The x variables are not all in the DataFrame.") if any(col not in df.columns for col in y_vars): raise ValueError("The y variables are not all in the DataFrame.") - if group_col not in df.columns: - raise ValueError(f"The group column {group_col} is not in the DataFrame.") + if group_col_var not in df.columns: + raise ValueError(f"The group column {group_col_var} is not in the DataFrame.") if self.propensity_model is not None and self.propensity_est is not None: raise ValueError( "Both propensity model and propensity estimates are specified. Only one is allowed." ) if self.propensity_est is not None: - if self.propensity_est.shape[0] != len(df[group_col]): + if self.propensity_est.shape[0] != len(df[group_col_var]): raise ValueError( f"There are {self.propensity_est.shape[0]} pre-defined estimates, while " - f"there are {len(df[group_col])} unique groups." + f"there are {len(df[group_col_var])} unique groups." ) - if self.propensity_est.shape[1] != len(df[group_col].unique()): + if self.propensity_est.shape[1] != len(df[group_col_var].unique()): raise ValueError( f"There are {self.propensity_est.shape[1]} group pre-defined estimates, while " - f"there are {len(df[group_col].unique())} samples." + f"there are {len(df[group_col_var].unique())} samples." ) - if len(group_col) > 1: - raise RuntimeError( - f"Group column should be only one column (one node) in the data {group_col}." - ) - @abstractmethod def test( self, diff --git a/tests/unit_tests/conditional/cd/test_cd.py b/tests/unit_tests/conditional/cd/test_cd.py index a22b017dc..8cef4449f 100644 --- a/tests/unit_tests/conditional/cd/test_cd.py +++ b/tests/unit_tests/conditional/cd/test_cd.py @@ -54,33 +54,36 @@ def test_cd_tests_error(cd_func): sample_df = single_env_scm(n_samples=10) cd_estimator = cd_func() with pytest.raises(ValueError, match="The group col"): - cd_estimator.test(sample_df, {y}, group_col="blah", x_vars={x}) + cd_estimator.test(sample_df, {y}, group_col={"blah"}, x_vars={x}) with pytest.raises(ValueError, match="The x variables are not all"): - cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={"blah"}) + cd_estimator.test(sample_df, y_vars={y}, group_col={"group"}, x_vars={"blah"}) with pytest.raises(ValueError, match="The y variables are not all"): + cd_estimator.test(sample_df, y_vars={"blah"}, group_col={"group"}, x_vars={x}) + + with pytest.raises(ValueError, match="Group column should be only one column"): cd_estimator.test(sample_df, y_vars={"blah"}, group_col="group", x_vars={x}) # all the group indicators have different values now from 0/1 sample_df["group"] = sample_df["group"] + 3 with pytest.raises(RuntimeError, match="Group indications in"): - cd_estimator.test(sample_df, {y}, group_col="group", x_vars={x}) + cd_estimator.test(sample_df, {y}, group_col={"group"}, x_vars={x}) # test pre-fit propensity scores, or custom propensity model with pytest.raises( ValueError, match="Both propensity model and propensity estimates are specified" ): cd_estimator = cd_func(propensity_model=RandomForestClassifier(), propensity_est=[0.5, 0.5]) - cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={x}) + cd_estimator.test(sample_df, y_vars={y}, group_col={"group"}, x_vars={x}) with pytest.raises(ValueError, match="There are 3 group pre-defined estimates"): cd_estimator = cd_func(propensity_est=np.ones((10, 3)) * 0.5) - cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={x}) + cd_estimator.test(sample_df, y_vars={y}, group_col={"group"}, x_vars={x}) with pytest.raises(ValueError, match="There are 100 pre-defined estimates"): cd_estimator = cd_func(propensity_est=np.ones((100, 2)) * 0.5) - cd_estimator.test(sample_df, y_vars={y}, group_col="group", x_vars={x}) + cd_estimator.test(sample_df, y_vars={y}, group_col={"group"}, x_vars={x}) @pytest.mark.parametrize( @@ -115,18 +118,18 @@ def test_cd_simulation(cd_func, df, env_type, cd_kwargs): _, pvalue = cd_estimator.test( df, {"x1"}, - group_col, + {group_col}, {"x"}, ) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" - _, pvalue = cd_estimator.test(df, {"z"}, group_col, {"x"}) + _, pvalue = cd_estimator.test(df, {"z"}, {group_col}, {"x"}) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" - _, pvalue = cd_estimator.test(df, {"y"}, group_col, {"x"}) + _, pvalue = cd_estimator.test(df, {"y"}, {group_col}, {"x"}) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" elif env_type == "multi": - _, pvalue = cd_estimator.test(df, {"z"}, group_col, {"x"}) + _, pvalue = cd_estimator.test(df, {"z"}, {group_col}, {"x"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - _, pvalue = cd_estimator.test(df, {"y"}, group_col, {"x"}) + _, pvalue = cd_estimator.test(df, {"y"}, {group_col}, {"x"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - _, pvalue = cd_estimator.test(df, {"z"}, group_col, {"x1"}) + _, pvalue = cd_estimator.test(df, {"z"}, {group_col}, {"x1"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" From ea06719764dcb7f4b3a940a86c95d651b8980814 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 18:10:21 -0500 Subject: [PATCH 29/61] Fix psifci Signed-off-by: Adam Li --- dodiscover/cd/base.py | 2 +- dodiscover/cd/bregman.py | 8 +-- dodiscover/cd/kernel_test.py | 12 ++-- dodiscover/constraint/skeleton.py | 29 ++++++---- examples/plot_psifci_alg.py | 7 +-- pyproject.toml | 1 + tests/unit_tests/constraint/test_psifcialg.py | 57 ++++++++++++++++++- 7 files changed, 85 insertions(+), 31 deletions(-) diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index 515459090..20add5f82 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -65,7 +65,7 @@ def test( df: pd.DataFrame, y_vars: Set[Column], group_col: Set[Column], - x_vars: Optional[Set[Column]], + x_vars: Set[Column], ) -> Tuple[float, float]: """Abstract method for all conditional discrepancy tests. diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index 854437cbd..687969b38 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -78,17 +78,13 @@ def test( df: pd.DataFrame, y_vars: Set[Column], group_col: Set[Column], - x_vars: Optional[Set[Column]] = None, + x_vars: Set[Column], ) -> Tuple[float, float]: # check test input self._check_test_input(df, y_vars, group_col, x_vars) group_col_var: Column = list(group_col)[0] - if x_vars is not None: - x_cols = list(x_vars) - else: - x_cols = None - + x_cols = list(x_vars) y_cols = list(y_vars) group_ind = df[group_col_var].to_numpy() if set(np.unique(group_ind)) != {0, 1}: diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index 5a31ce5e2..a2d68e524 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -1,4 +1,4 @@ -from typing import Optional, Set, Tuple +from typing import Set, Tuple import numpy as np import pandas as pd @@ -94,7 +94,7 @@ def test( df: pd.DataFrame, y_vars: Set[Column], group_col: Set[Column], - x_vars: Optional[Set[Column]] = None, + x_vars: Set[Column], ) -> Tuple[float, float]: """Compute k-sample test statistic and pvalue. @@ -121,7 +121,7 @@ def test( The column denoting, which group (i.e. environment) each sample belongs to. This is typically the F-node. Must be binary. x_vars : Set[Column] - Set of X variables. + Set of X variables. Can be the empty set. Returns ------- @@ -133,11 +133,7 @@ def test( # check test input self._check_test_input(df, y_vars, group_col, x_vars) group_col_var: Column = list(group_col)[0] - if x_vars is not None: - x_cols = list(x_vars) - else: - x_cols = None - + x_cols = list(x_vars) y_cols = list(y_vars) group_ind = df[group_col_var].to_numpy() diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index dca688515..45991899b 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -904,7 +904,7 @@ def evaluate_fnode_edge( data: List[pd.DataFrame], X: Column, Y: Set[Column], - Z: Optional[Set[Column]] = None, + Z: Set[Column], ) -> Tuple[float, float]: """Test an edge from an F-node to a regular node for X || Y | Z. @@ -916,8 +916,8 @@ def evaluate_fnode_edge( A column in ``data``. This is assumed to be the F-node. Y : column A column in ``data``. - Z : set, optional - A list of columns in ``data``, by default None. + Z : set + A list of columns in ``data``. Can be the empty set. Returns ------- @@ -926,9 +926,6 @@ def evaluate_fnode_edge( pvalue : float The pvalue. """ - if Z is None: - Z = set() - # get the sigma-map for this F-node distribution_idx = self.context_.sigma_map[X] @@ -986,6 +983,9 @@ def _compute_candidate_conditioning_sets( def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): self.context_ = make_context(context, create_using=InterventionalContextBuilder).build() + # initialize learning parameters + self._initialize_params() + # get the initialized graph adj_graph = self.context_.init_graph f_nodes = self.context_.f_nodes @@ -1012,6 +1012,7 @@ def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], co # summarize the comparison of XY self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + # Remove edges adj_graph.remove_edges_from(self.remove_edges) @@ -1157,9 +1158,16 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: orig_context = context.copy() f_nodes = context.f_nodes - # it is fine to run the first stage of the FCI algorithm, as this will - # not result in removing any edges among the F-nodes - obs_data = data[0] + if context.obs_distribution: + # it is fine to run the first stage of the FCI algorithm, as this will + # not result in removing any edges among the F-nodes + obs_data = data[0] + else: + # if we explicitly do not have access to the observational distribution, + # then we should choose the experimental dataset with the most samples + largest_data_idx = np.argmax([len(df) for df in data]) + obs_data = data[largest_data_idx] + self._learn_skeleton_with_observations(obs_data, context) # keep track of the observational skeleton graph @@ -1169,7 +1177,6 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # i) augmented with all F-nodes, or # ii) augmented with all F-nodes except intervention index 'i' # R9 allows us to leverage F-nodes being not in separating sets to - # augment all separating sets that have non-empty sets with all # F-nodes to keep consistency with the algorithm for x_var, y_vars in self.sep_set_.items(): @@ -1180,7 +1187,7 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: self.sep_set_[x_var][y_var][idx].update(f_nodes) # index all datasets, where the first one may be observational - non_f_nodes = self.context_.get_non_f_nodes() + non_f_nodes = context.get_non_f_nodes() # reset the init graph and this time learn the skeleton using # interventional distributions diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index b7a4bb21c..966486a34 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -102,8 +102,7 @@ # CD test. cd_estimator = GSquareCITest(data_type="discrete") -alpha = 0.05 - +alpha = 0.1 learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha) # create context with information about the interventions @@ -134,6 +133,8 @@ # Figure 8 in :footcite:`Jaber2020causal`. est_pag = learner.graph_ +print(f"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG") + # draw the full graph dot_graph = draw(est_pag, direction="LR") dot_graph.render(outfile="psi_pag_full.png", view=True) @@ -143,8 +144,6 @@ dot_graph = draw(est_pag_no_fnodes, direction="LR") dot_graph.render(outfile="psi_pag.png", view=True) -# .. graphviz:: psi_pag.dot - # References # ---------- # .. footbibliography:: diff --git a/pyproject.toml b/pyproject.toml index 550e2dccd..4d7bbff0f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,6 +77,7 @@ typing-extensions = { version = "*" } # needed in dowhy's package joblib = { version = "^1.1.0" } # needed in dowhy's package tqdm = { version = "^4.64.0" } # needed in dowhy's package pre-commit = "^3.0.4" +pooch = "^1.7.0" [tool.poetry.group.docs] optional = true diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index 1736a5641..be7e549d3 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -1,13 +1,17 @@ from itertools import permutations +import bnlearn import networkx as nx import numpy as np +import pandas as pd +import pooch import pytest import pywhy_graphs as pgraphs from pywhy_graphs import IPAG, PsiPAG +from pywhy_graphs.export import numpy_to_graph from dodiscover import InterventionalContextBuilder, PsiFCI, make_context -from dodiscover.ci import Oracle +from dodiscover.ci import GSquareCITest, Oracle from dodiscover.constraint.utils import dummy_sample from .test_fcialg import Test_FCI @@ -241,3 +245,54 @@ def test_figure2_skeleton(self): learned_graph = learner.graph_ for edge_type, subgraph in expected_G.get_graphs().items(): assert nx.is_isomorphic(subgraph, learned_graph.get_graphs(edge_type)) + + +def test_psifci_withsachs(): + + bnlearn.import_DAG() + + # use pooch to download robustly from a url + url = "https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz" + file_path = pooch.retrieve( + url=url, + known_hash="md5:39ee257f7eeb94cb60e6177cf80c9544", + ) + + df = pd.read_csv(file_path, delimiter=" ") + + # only use the observational data + unique_ints = df["INT"].unique() + intervention_targets = [df.columns[idx] for idx in unique_ints] + + # get the list of intervention targets and list of dataframe associated with each intervention + data_cols = [col for col in df.columns if col != "INT"] + data = [] + for interv_idx in unique_ints: + _data = df[df["INT"] == interv_idx][data_cols] + data.append(_data) + + ci_estimator = GSquareCITest(data_type="discrete") + alpha = 0.05 + learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=ci_estimator, alpha=alpha) + ctx_builder = make_context(create_using=InterventionalContextBuilder) + ctx = ( + ctx_builder.variables(data=data) + .intervention_targets(intervention_targets) + .obs_distribution(False) + .build() + ) + # learner.fit(data, ctx) + + # first try it with the oracle + # the ground-truth dag + ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False)["adjmat"] + adjmat = ground_truth_dag.to_numpy() + arr_idx = ground_truth_dag.columns.tolist() + print(df) + print(df.columns) + print(adjmat) + print(adjmat.shape) + G = numpy_to_graph(adjmat, arr_idx=arr_idx, graph_type="dag") + print(len(G.edges())) + + assert False From 3504d681911236a4056f2cef6a8243e74353edef Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 18:46:18 -0500 Subject: [PATCH 30/61] Add PsiFCI working example Signed-off-by: Adam Li --- examples/plot_psifci_alg.py | 38 +++++++++---------- tests/unit_tests/constraint/test_psifcialg.py | 4 +- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 966486a34..872c0b921 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -1,23 +1,14 @@ """ .. _ex-psifci-algorithm: -========================================= -Causal discovery with interventional data -========================================= +========================================================= +Causal discovery with interventional data - Sachs dataset +========================================================= -We will simulate some observational data from a Structural Causal Model (SCM) and -demonstrate how we will use the PC algorithm. - -The PC algorithm works on observational data when there are no unobserved latent -confounders. That means for any observed set of variables, there is no common causes -that are unobserved. In other words, all exogenous variables then are assumed to be -independent. - -In this example, we will introduce the main abstractions and concepts used in -dodiscover for causal discovery: - -- learner: Any causal discovery algorithm that has a similar scikit-learn API. -- context: Causal assumptions. +We will analyze the Sachs dataset :footcite:`sachsdataset2005` and reproduce analyses +from the Supplemental Figure 8 in :footcite:`Jaber2020causal` demonstrating the +usage of the :class:`dodiscover.PsiFCI` algorithm for learning causal graphs +from observational and interventional data. .. currentmodule:: dodiscover """ @@ -126,8 +117,8 @@ learner = learner.fit(data, ctx) # %% -# Visualize the results -# --------------------- +# Analyze the results +# =================== # Now that we have learned the graph, we will show it here. Note differences and similarities # to the ground-truth DAG that is "assumed". Moreover, note that this reproduces Supplementary # Figure 8 in :footcite:`Jaber2020causal`. @@ -135,15 +126,22 @@ print(f"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG") -# draw the full graph +# %% +# Visualize the full graph including the F-node dot_graph = draw(est_pag, direction="LR") dot_graph.render(outfile="psi_pag_full.png", view=True) -# if we do not want to visualize the F-nodes, then we can view the subgraph +# %% +# Visualize the graph without the F-nodes est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes()) dot_graph = draw(est_pag_no_fnodes, direction="LR") dot_graph.render(outfile="psi_pag.png", view=True) +# Interpretation +# -------------- +# Looking at the supplemental figure 8b in :footcite:`Jaber2020causal`, we see that the +# learned PAG matches quite well. + # References # ---------- # .. footbibliography:: diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index be7e549d3..401c052f3 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -281,7 +281,7 @@ def test_psifci_withsachs(): .obs_distribution(False) .build() ) - # learner.fit(data, ctx) + learner.fit(data, ctx) # first try it with the oracle # the ground-truth dag @@ -294,5 +294,3 @@ def test_psifci_withsachs(): print(adjmat.shape) G = numpy_to_graph(adjmat, arr_idx=arr_idx, graph_type="dag") print(len(G.edges())) - - assert False From 868ae9570a18654f12fe3394ff717d5063bf1f76 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 7 Mar 2023 18:48:39 -0500 Subject: [PATCH 31/61] Add PsiFCI working example Signed-off-by: Adam Li --- examples/plot_psifci_alg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 872c0b921..79224edbb 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -93,7 +93,7 @@ # CD test. cd_estimator = GSquareCITest(data_type="discrete") -alpha = 0.1 +alpha = 0.05 learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha) # create context with information about the interventions From 3126d07d0c8faba87818bd4e244074b6d7055d9a Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 8 Mar 2023 14:21:28 -0500 Subject: [PATCH 32/61] Add covergae for tests and fix docs build Signed-off-by: Adam Li --- dodiscover/context_builder.py | 2 -- examples/plot_psifci_alg.py | 2 +- tests/unit_tests/test_context_builder.py | 3 +++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dodiscover/context_builder.py b/dodiscover/context_builder.py index 326631687..3ec7045f3 100644 --- a/dodiscover/context_builder.py +++ b/dodiscover/context_builder.py @@ -477,8 +477,6 @@ def _create_augmented_nodes( # create F-nodes, their symmetric difference mapping and sigma-mapping to # intervention targets for idx, (jdx, kdx) in enumerate(combinations(distribution_targets_idx, 2)): - if jdx == kdx: - continue f_node = ("F", idx) augmented_nodes.append(f_node) sigma_map[f_node] = (jdx, kdx) diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 79224edbb..fd56403e7 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -7,7 +7,7 @@ We will analyze the Sachs dataset :footcite:`sachsdataset2005` and reproduce analyses from the Supplemental Figure 8 in :footcite:`Jaber2020causal` demonstrating the -usage of the :class:`dodiscover.PsiFCI` algorithm for learning causal graphs +usage of the :class:`dodiscover.constraint.PsiFCI` algorithm for learning causal graphs from observational and interventional data. .. currentmodule:: dodiscover diff --git a/tests/unit_tests/test_context_builder.py b/tests/unit_tests/test_context_builder.py index b8495c5d4..29e50f249 100644 --- a/tests/unit_tests/test_context_builder.py +++ b/tests/unit_tests/test_context_builder.py @@ -235,6 +235,9 @@ def test_context_interventions(): assert ctx.symmetric_diff_map == dict() assert set(ctx.sigma_map.keys()) == set(ctx.f_nodes) + # test reverse sigma map + assert set(ctx.reverse_sigma_map().values()) == set(ctx.f_nodes) + def test_context_interventions_without_observational(): ctx_builder = make_context(create_using=InterventionalContextBuilder) From 6a58647694434414d76dc3c9a8d8a5c2397b4f02 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 16 Mar 2023 17:17:12 -0400 Subject: [PATCH 33/61] Adding updated fix Signed-off-by: Adam Li --- Untitled.ipynb | 1319 +++++++++++++++++ dodiscover/constraint/_classes.py | 99 +- dodiscover/constraint/fcialg.py | 14 +- dodiscover/constraint/intervention.py | 15 + dodiscover/constraint/pcalg.py | 69 +- dodiscover/constraint/skeleton.py | 947 +++++++----- examples/plot_psifci_alg.py | 3 +- tests/unit_tests/constraint/test_psifcialg.py | 3 +- 8 files changed, 2076 insertions(+), 393 deletions(-) create mode 100644 Untitled.ipynb diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 000000000..2a3a2f323 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,1319 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c742672f-1415-4035-af44-ac501d009785", + "metadata": {}, + "outputs": [], + "source": [ + "from pywhy_graphs.viz import draw\n", + "from dodiscover.ci import GSquareCITest\n", + "from dodiscover import PsiFCI, Context, make_context, InterventionalContextBuilder\n", + "import networkx as nx\n", + "import pandas as pd\n", + "import bnlearn\n", + "import numpy as np\n", + "from pprint import pprint\n", + "from itertools import combinations\n", + "import pooch\n", + "\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4c709a7c-1620-4d72-8905-f25306dc10d3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[bnlearn] >Set node properties.\n", + "[bnlearn] >Set edge properties.\n", + "[bnlearn] >Plot based on Bayesian model\n", + " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk INT\n", + "0 1 1 1 2 3 2 1 3 1 2 1 8\n", + "1 1 1 1 1 3 3 2 3 1 2 1 8\n", + "2 1 1 2 2 3 2 1 3 2 1 1 8\n", + "3 1 1 1 1 3 2 1 3 1 3 1 8\n", + "4 1 1 1 1 3 2 1 3 1 1 1 8\n", + "(5400, 12)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ4AAAMWCAYAAACwV0zRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZyO9f7H8dd933Pfsy9mGDuFhEJlKREyE6bIMpbMIZGQOi0qldOp8+uckEonhCa0KIRBUjM0o0gpWyj72mCGYbZ79nu7fn84TcdBBrNY3s/z8Ie5r+v7/dx3Y85j3o/P93OZDMMwEBERERERERERKWXmii5ARERERERERESuTgqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEV0ku8ng8pKSkEBgYiMlkKuuaRERERERERETkMmYYBjk5OdSoUQOz+dx9TSUKnlJSUqhdu3apFSciIiIiIiIiIle+w4cPU6tWrXO+XqLgKTAwsHixoKCg0qlMRERERERERESuSHa7ndq1axdnRudSouDp9+N1QUFBCp5ERERERERERATgvCOZNFxcRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEgicRERERERERESkTCp5ERERERERERKRMKHgSEREREREREZEyoeBJRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEgicRERERERERESkTCp5ERERERERERKRMKHgSEREREREREZEyoeBJRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEgicRERERERERESkTCp5ERERERERERKRMKHgSEREREREREZEyoeBJRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEx4VXQBUjIut5vk1HT2Hz5OZnYeDpcLs8mM1WqhWlgwDepUo1rlYEwmU0WXKiIiIiIiIiICKHi6rGXa81j5/Ta+37KH3QdTyS0owuFwnhYuGYaByWTC22YlNNifJvVr0en2JtzVohE+NmsFVi8iIiIiIiIi1zqTYRjG+S6y2+0EBweTnZ1NUFBQedR1Tdu+/whffLOZr9f9gj23AEzgY7Xi7W3F2+qF2Xz6CUmX202Rw0WRw4nD6cJkMlGtcgj3d7yN+zrcSvUqIRXzRkRERERERETkqlTSrEjB02UkJ6+Q2IVJLF21kYJCJ74+VgL9fbGYL2wUl9PlIju3AKfLTaUgf4b37UTviFZYLBrpJSIiIiIiIiKXTsHTFeanbft466OvOHAkDX8fbwL9fS55XpPHY5Bhz8Xj8dC6aQOeG3IfdapXLqWKRURERERERORaVdKsSC0wFcwwDD5d/j3PvvkpB4+mUSUkkKAA31IZEm42m6gcEkiQvy/rtuzlkVdmsuHX/aVQtYiIiIiIiIjI+Sl4qkCGYTBr8bdMnbcSj8egamgwXl6WUt/Hx9tG1bBgMu15vPD2fH74eU+p7yEiIiIiIiIi8r8UPFWgeV+tY9bib/GyWAgNDiiVLqdzMZtNhIcGkZNXyMvvLmLTjoNltpeIiIiIiIiICCh4qjCbth9k+meJmE0mQgL9ymVPk+lU+JSdm8+r0xeTnpVbLvuKiIiIiIiIyLVJwVMFyCso4o0Pl1NY5KBSkH+57m0ymagSEsTR45lM+XQFJZgtLyIiIiIiIiJyURQ8VYD3F61iX/JxwkICy/R43blYLGYC/X1Y+cM2vlm/o9z3FxEREREREZFrg4Kncrb3t2MsTtyAn48N60UOEk+aM46kOeMuqY4APx9cHg9T5q6kyOG6pLVERERERERERM5GwVM5W756M/mFDoL8fc/6+tZVC1g+7TlWzHoFt/vSA6EtSfNZPu058u0ZZ7wWGujP0eMZfLdp1yXvIyIiIiIiIiLyvxQ8lSN7XgEJa7fhY7Oe9Yidy1FIyr6tgAlnUT7HD/xapvVYrV4YwOffbCrTfURERERERETk2qTgqRwlrfuVjOzcc3Y7pezbitvloF7zu8BkInnn+jKvKdDPm593HmLvb8fKfC8RERERERERubZ4VXQB15L1v+7H4NRw77NJ3rkek9lM/Vs7Yk9P4eTRfeTnZOIXWKlE6x/YspodP3xJWM36tIoazOrPJlGQkwnAqk/GF18XWqMed/Z8FAA/H29y8rLZtOMgN9StdknvT0RERERERETkvyl4KieGYbB93xG8rWf/yHMyjpN1PJnwOo3w9gukVsMWnDyyj8M7N3Bj687nXXvnui85sGU11es349bIAZgtXlzf7C6O7NqAPT2V65u1w8t2qtPKL+iPIOv3I397DqWW0jsVERERERERETlFwVM5OXYym0x7Pt4261lfP/yfY3U1b2wBQLX6TbGsWcKRXRto2CoSk+nsXVIej5tt3yzkyO5N1L35Tm6+q0fxtfWa34X95NH/BE934RcUetY1vLwsbN935FLfooiIiIiIiIjIaTTjqZzsP3ycIocTn7METx63myN7NuFl86Ha9TcB4GX1plq9mynIzeLk4b1nXdPtdLDxqw85snsTDVt1pmn7XucMqP6Mj83KsfRssux5F3yviIiIiIiIiMi5KHgqJ1k5+XgM46zznY4d2o6jII/q9Zth8fojmKr1n+6n5J0bzrjH7XKybtl7pB3eTdMOvWnY6p6Lrs1iMeNye7DnFVz0GiIiIiIiIiIi/0vBUzlxOl2YzvHa78fsfg+afle5VgN8/IM5fmg7jsL8015zOYuwn0zB5uNHWM0Gl1Sb2WTCMAyKHK5LWkdERERERERE5L9pxlM5MZvPHjsV5GRx4vAeANYtnX7O+4/u2cz1zdoV/93bN4CmHaLZGP8h65bOoE2PEQRUCr+o2gwDTH9So4iIiIiIiIjIxVDHUznxtlkxOPUEuv92ePcGMAxCq19P7catz/jzx3G79WesGV7nRlrdOwSno4B1n79HbmbaGdf8PvPJMDznrM0wDEwmE7ZzPHFPRERERERERORiKGkoJ9Uqh2C1WHC63MUBj2EYHNm1ETDRvFN//IPDznpvXtZJMo//RlbaYULCa5/2WpXaDWl97xDWf/UB6z6fQZseI0/rfLL6+AFQkJuNf3Dls67vcLrwtnkRHhpcCu9UREREREREROQUdTyVk/q1q+Jts1Lk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tm3bpb49EREREREREbmKKHi6xnh7e9OnTx8cjj+emufxeHA4HAQGBlKrVi1mzpzJlClT2Lp1K48++uhpIdV/8/PzY/To0cyZMwebzcbQoUMZN24cdru9HN+RiIiIiIiIiFyudNTuGrRnzx66du2K1WolICCAlJQUqlWrxrhx47BYLHTu3BmAXbt28cQTTxAYGMjUqVOpXr36Odf0eDwsWrSIqVOn4uPjw+jRo+nSpYuGj4uIiIiIiIhchTTjSf5U3759Wbt2LWazmaCgIGbPnk2bNm3OuO7w4cM8/vjjOBwOpk6dSv369f903RMnTvDWW2+RmJjI7bffzgsvvEDt2rXL6m2IiIiIiIiISAXQjCf5U/369cMwDHx8fJg0adJZQyeA2rVrM3v2bCpVqsSwYcPYsmXLn65bpUoVJkyYwDvvvMPhw4fp378/s2bNwuFwlMG7EBEREREREZHLmYKna1TXrl1p0aIFr732GlFRUX96bVhYGLGxsdxwww2MGjWKNWvWnHf9tm3bsmDBAgYMGEBsbCwxMTFs3ry5tMoXERERERERkSuAjtpdwwzDuKAZTA6Hg5deeolvv/2Wl156ifvvv79E9+3bt49x48axbds27r//fp544glCQkIusmoRERERERERqWia8SRlwuPxMGHCBBYvXszjjz/O4MGDSxReeTweli5dypQpUzCbzTz99NPcd999Gj4uIiIiIiIicgVS8CRlxjAMYmNjef/994mJieGpp57CbC7Zqc2MjAzefvtt4uPjadGiBS+++CLXXXdd2RYsIiIiIiIiIqVKw8WlzJhMJkaMGMHzzz/PvHnzePnll3E6nSW6NzQ0lH/+85+8++67pKWl8cADDzBjxgwNHxcRERERERG5Cil4kovWt29fxo8fT1JSEqNHjyY/P7/E995+++189tlnPPTQQ3z44Yf079+f9evXl2G1IiIiIiIiIlLeFDzJJYmMjGTy5Mls3bqVRx99lKysrBLfa7PZGDlyJPPmzaNKlSqMGjWKv//972RkZJRdwSIiIiIiIiJSbhQ8ySVr1aoVsbGxpKam8vDDD5OamnpB919//fW89957vPLKK/zwww9ER0ezePFiPB5PGVUsIiIiIiIiIuVBwZOUikaNGjFr1ixcLhdDhw5l//79F3S/yWSie/fuxMXFcffddzNu3DiGDRt2weuIiIiIiIiIyOVDwZOUmtq1azN79mwqVarEsGHD2LJlywWvERISwssvv0xsbCx2u52YmBimTp1KYWFh6RcsIiIiIiIiImVKwZOUqrCwMGJjY7nhhhsYNWoUa9asuah1brvtNubOncvw4cOZO3cu/fr144cffijlakVERERERESkLCl4klIXEBDA1KlTadeuHc8++yzLli27qHVsNhsPP/wwn332GbVq1eKJJ57ghRde4MSJE6VcsYiIiIiIiIiUBQVPUiZsNhsTJkygZ8+evPrqq3z44YcYhnFRa9WuXZt3332Xf/3rX2zevJk+ffqwYMECDR8XERERERERucwpeJIyYzabefHFF3nkkUeYOnUqb7/99kWHRSaTia5du7Jo0SK6dOnCxIkTeeihh9izZ08pVy0iIiIiIiIipUXBk5Qpk8nEiBEjeP7555k3bx4vv/wyTqfzotcLCgpi7NixzJ49m6KiIgYOHMjbb79Nfn5+KVYtIiIiIiIiIqVBwZOUi759+zJ+/HiSkpIYPXr0JQdFzZo149NPP+Wxxx5j0aJF9O3bl9WrV5dStSIiIiIiIiJSGhQ8SbmJjIxk8uTJbN26lUcffZSsrKxLWs/Ly4vBgwezcOFCGjRowDPPPMMzzzzD8ePHS6dgEREREREREbkkCp6kXLVq1YrY2FhSU1N5+OGHSU1NveQ1a9Sowb///W9ef/11tm/fTp8+fZg7dy5ut7sUKhYRERERERGRi6XgScpdo0aNmDVrFi6Xi6FDh7J///5LXtNkMhEREcGiRYvo3r07b7/9Ng8++CA7duwohYpFRERERERE5GIoeJIKUbt2bWbPnk2lSpUYNmwYW7ZsKZV1AwICGDNmDB999BEAgwcPZuLEieTm5pbK+iIiIiIiIiJScgqepMKEhYURGxtLw4YNGTVqFGvWrCm1tZs0acLHH3/M008/zRdffEGfPn1ITEzEMIxS20NERERERERE/pyCJ6lQAQEBTJkyhXbt2vHss8+ybNmyUlvbYrEQExPDokWLuPnmm3nhhRd46qmnSElJKbU9REREREREROTcFDxJhbPZbEyYMIGePXvy6quv8uGHH5ZqZ1LVqlV58803eeutt9i3bx99+/blo48+wuVyldoeIiIiIiIiInImBU9yWTCbzbz44osMHz6cqVOn8vbbb+PxeEp1jw4dOrBw4UL69OnDu+++y1/+8he2bdtWqnuIiIiIiIiIyB8UPMllw2QyMXz4cJ5//nnmzZvHyy+/jNPpLNU9/Pz8ePrpp/nkk0/w8fFh6NChjBs3DrvdXqr7iIiIiIiIiAiYjBKcabLb7QQHB5OdnU1QUFB51CXXuMTERP7+97/TsmVLXn/9dfz8/Ep9D4/Hw6JFi3j33Xfx9vZm9OjRdOnSBZPJVOp7iYiIiIiIiFxNSpoVqeNJLkuRkZFMnjyZrVu38uijj5KVlVXqe5jNZvr168eiRYto0aIFL730Eo899hiHDx8u9b1ERERERERErkUKnuSy1apVK2JjY0lNTeXhhx8mNTW1TPapUqUK48ePZ/LkyRw5coT+/fszc+ZMHA5HmewnIiIiIiIicq1Q8CSXtUaNGjFr1ixcLhdDhw5l//79ZbbXnXfeyYIFC4iJieH9998nJiaGzZs3l9l+IiIiIiIiIlc7BU9y2atduzazZ8+mUqVKDBs2jC1btpTZXj4+Pjz++OPMnTuXoKAghg8fzv/93/+VyVE/ERERERERkaudgie5IoSFhREbG0vDhg0ZNWoUa9asKdP96tevz8yZM/nb3/7Gt99+S3R0NMuWLaMEs/hFRERERERE5D8UPMkVIyAggClTptCuXTueffZZli1bVqb7mc1mevXqRVxcHG3btuXVV19lxIgRHDp0qEz3FREREREREblaKHiSK4rNZmPChAn07NmTV199lQ8//LDMu5BCQ0N59dVXmTZtGidOnOCBBx5g+vTpFBUVlem+IiIiIiIiIlc6BU9yxTGbzbz44osMHz6cqVOn8vbbb+PxeMp839atW/PZZ58xZMgQPv74Yx544AHWr19f5vuKiIiIiIiIXKkUPMkVyWQyMXz4cJ5//nnmzZvHyy+/jNPpLPN9bTYbI0aMYN68eVSpUoVRo0bx0ksvkZGRUeZ7i4iIiIiIiFxpTEYJzinZ7XaCg4PJzs4mKCioPOoSKbHExET+/ve/07JlS15//XX8/PzKZV/DMPjyyy+LO67++te/0rNnT8xm5bkiIiIiIiJydStpVqTfkOWKFxkZyeTJk9m6dSuPPvooWVlZ5bKvyWSiW7duLF68mLvvvptx48YxbNgw9u3bVy77i4iIiIiIiFzuFDzJVaFVq1bExsaSmprKww8/TGpqarntHRwczMsvv0xsbCw5OTn85S9/YfLkyRQUFJRbDSIiIiIiIiKXIwVPctVo1KgRs2bNwuVyMXToUPbv31+u+992223MnTuXESNGMH/+fPr378/3339frjWIiIiIiIiIXE4UPMlVpXbt2syePZtKlSoxbNgwtmzZUq77W61Whg4dymeffUbt2rV58sknef755zlx4kS51iEiIiIiIiJyOVDwJFedsLAwYmNjadiwIaNGjWLNmjXlXkPt2rWZOnUqr732Gj///DPR0dEsWLAAj8dT7rWIiIiIiIiIVBQFT3JVCggIYMqUKbRr145nn32WZcuWlXsNJpOJLl26sGjRIrp27crEiRN56KGH2L17d7nXIiIiIiIiIlIRFDzJVctmszFhwgR69uzJq6++yocffohhGOVeR1BQEGPHjmX27Nk4HA4GDRrEpEmTyM/PL/daRERERERERMqTySjBb+J2u53g4GCys7MJCgoqj7pESo1hGMTGxvL+++8TExPDU089hdlcMZmry+Vi7ty5xMbGEhQUxJgxY+jYsWOF1CIiIiIiIiJysUqaFanjSa56JpOJESNG8PzzzzNv3jxefvllnE5nhdTi5eXFgw8+yIIFC2jYsCHPPvsszzzzDMePH6+QekRERERERETKkoInuWb07duX8ePHk5SUxOjRoyv0qFuNGjV4++23mThxIjt27KBPnz58+umnuN3uCqtJREREREREpLQpeJJrSmRkJJMnT2br1q08+uijZGVlVVgtJpOJTp06sWjRIu6//37+/e9/M2jQILZv315hNYmIiIiIiIiUJgVPcs1p1aoVsbGxpKam8vDDD5Oamlqh9fj7+/Pcc8/x0UcfYTabeeihh5g4cSK5ubkVWpeIiIiIiIjIpVLwJNekRo0aMWvWLFwuF0OHDmX//v0VXRJNmjTho48+4umnn2b58uX06dOHxMTECnkSn4iIiIiIiEhpUPAk16zatWsze/ZsKlWqxLBhw9iyZUtFl4TFYiEmJoZFixbRtGlTXnjhBZ588klSUlIqujQRERERERGRC6bgSa5pYWFhxMbG0rBhQ0aNGsWaNWsquiQAwsPDeeONN5g0aRL79++nb9++fPjhh7hcroouTURERERERKTEFDzJNS8gIIApU6bQrl07nn32WZYtW1bRJRVr3749CxcupG/fvkybNo2YmBi2bt1a0WWJiIiIiIiIlIiCJxHAZrMxYcIEevbsyauv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FXFxcRw4cIDatWvTu3dvunfvTkhIyCWtnZGRwbfffktiYiIbNmwgJycHOBVw3HDDDTz44IP06NEDf3//s95vGAY7d+4sfjJeRkYGderUKX4yXmkHL5c7p9PJsmXLmDVrFidPnqRbt24MGzaMGjVqlOo+R48e5fXXX+eHH37g7rvv5rnnntMAeBERERGRa5yCJxG5JIZhsHXrVuLi4khMTAQgIiKC3r17c+utt15yl1FmZiarV68mKSmJ1atXc/LkSVwuF2FhYQwYMICHH36YmjVrnvN+t9vNxo0biY+PZ9WqVeTn59OkSROioqLo3LnzJR0VvNI4HA7i4uL44IMPsNvt9OzZk6FDh5ZqOGQYBomJibz55psUFBQwcuRI+vfvj8ViKbU9RERERETkyqHgSURKTVZWFsuXL2fx4sUkJydz/fXXEx0dzb333lsqPxPsdjurV69m2bJlJCYmkp6ejre3N61bt+bJJ5/knnvu+dOgq6ioiO+++474+Hi+//57PB4PrVq1IioqirvvvvucHVRXm4KCAhYsWMBHH31EYWEhffr04aGHHiI0NLTU9sjNzWXatGksXLiQG2+8kbFjx9KkSZNSW19ERERERK4MCp5EpNR5PB42bdpEXFwc33zzDRaLhS5dutC7d29uvvnmUpm1lJOTQ1JSErNmzeKHH36gsLCQqlWr0qtXL5544gnq1q37p/fb7XaSkpKIj49n8+bN2Gw22rdvT1RUFHfeeSdWq/WSa7zc5eXlMXfuXD755BPcbjcDBgxg0KBBpfrze/v27bz22mvs27ePvn37MmrUqGsm4BMREREREQVPIlLG0tPTWbZsGUuWLCElJYWGDRsSHR1NVFRUqT39LDc3l/fff585c+awZ88eLBYLjRs3ZtCgQdx///3Url37T+8/fvw4K1asICEhgT179hAUFERERARRUVHccsstV/2T8ex2O3PmzGHevHlYLBYGDhxITExMqQVEbreb+fPnM2PGDAICAnj22Wfp1KnTNTfsXURERETkWqTgSUTKhcfj4ccffyQuLo7vvvsOb29voqKi6N27N40aNSq1fbZv385bb73FypUrsdvtBAYGctttt9GrVy8iIiLO2wl14MABEhISSEhIICUlhfDw8OKh5DfccMNVHZZkZGTw4YcfsmjRInx8fBg8eDD9+vXD19e3VNY/duwYEydOZM2aNbRr144xY8aU+oBzERERERG5vCh4EpFyl5aWxtKlS1m6dClpaWk0adKEPn36cM8995RayJGdnc1nn33GrFmzSE5OBiA4OJhmzZoRGRlJZGQk9erVO+f9hmGwbds2EhISWLlyJdnZ2dSrV684hLqaA5O0tDQ++OADlixZQlBQEEOGDCE6OhqbzVYq63/77bdMnDgRu93O8OHDiYmJwcvLq1TWFhERERGRy4uCJxGpMG63m7Vr1xIXF8e6devw8/PjvvvuIzo6mvr165fKHi6Xi6SkJD7++GM2btyIyWTCZDLh6+tL/fr1iYiIICIiggYNGpyzm8nlcvHjjz+SkJDAt99+S2FhIc2bN6dr167cc889hISElEqtl5uUlBRmzpzJ8uXLqVy5MsOGDaN79+6lMv8qPz+fGTNmMH/+fOrVq8fYsWNp1qxZKVQtIiIiIiKXEwVPInJZSElJYcmSJXz++edkZGTQvHlzoqOjiYyMLJVOG8Mw+OWXX/j0009ZtWoVbreb8PBw7HY7DoeDOnXqEBkZSUREBA0bNjxnCJWfn8/q1atJSEhg3bp1mEwm2rRpQ9euXenQoUOpdWxdTpKTk4mNjWXFihVUr16d4cOHExUVhcViueS1d+3axbhx49i5cye9evXi8ccf1/9/iIiIiIhcRRQ8ichlxel0snr1ahYvXsz69esJCgqie/fuREdHU6dOnVLZIzU1lQULFrBkyRLy8vJo3LgxgYGB7Ny5E7vdTs2aNYmIiCAyMpLGjRufM4TKzMzk66+/JiEhgW3btuHr60vHjh3p2rUrt99++1V3fGz//v289957rFq1irp16zJixAgiIyMvefi6x+Nh0aJFTJ06FR8fH5555hk6d+58Vc/TEhERERG5Vih4EpHLVnJyMosXL+aLL74gOzubli1bEh0dTceOHUvtuNfy5cuZN28ehw8fpkmTJrRo0YLs7GzWrFlDVlYW1atXLz6Od9NNN50zZElJSSEhIYH4+HgOHjxISEgInTt3pmvXrjRt2vSqClF27drFjBkzWLt2LQ0aNGDkyJF06NDhkt9jWloab731FklJSdx+++28+OKL1KpVq5SqFhERERGRiqDgSUQuew6Hg6SkJBYvXszPP/9MaGgo999/P7179y6VId8ej4e1a9cyb948NmzYQHh4OP369aNu3br89NNPrFq1ioyM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YOBp1x8/fpwVK1aQkJDAnj17CAoKIiIigqioKG655ZYrovPHbrczZ84c5s2bh8ViYeDAgcTExFxUF9emTZsYN24cR44cYdCgQQwbNuyMI4wiIiIiIlI+FDyJiPwXj8fDjz/+SFxcHN999x3e3t5ERUURHR3NjTfeeNHrGobBTz/9xNy5c/nhhx8ICwujb9++REdHU6lSpXPel5qayjfffENiYiLbtm3Dy8uL22+/ncjISDp06HDGz9oDBw6QkJBAQkICKSkphIeHFw8lv+GGGy77J+NlZGTw4YcfsmjRInx8fBg8eDD9+vXD19f3gtZxOBx8/PHHzJ49m8qVK/PCCy9w5513llHVIiIiIiJyLgqeRETOIS0tjaVLl7J06VLS0tJo0qQJffr04Z577rngIOS/HTx4kPnz57N8+XIMwyAqKooBAwbQoEGD89bz+3G8LVu2YDabad26NREREXTs2PG0p/QZhsG2bdtISEhg5cqVZGdnU69eveIQ6mKfJlde0tLS+OCDD1iyZAlBQUEMGTKE6Ojoc3aJnUtycjITJkxg/fr13HPPPTzzzDNUrly5jKoWEREREZH/peBJROQ83G43a9euJS4ujnXr1uHn58d9991HdHT0Jc0Qys7OZsmSJSxYsIC0tDRat25NTEwMd95553mPx508ebI4hPr5558BaNmyJZGRkXTs2PG0Id0ul4sff/yRhIQEvv32WwoLC2nevDldu3blnnvuOS2wutykpKQwc+ZMli9fTuXKlRk2bBjdu3e/oBlWhmGQkJDA22+/TVFREY899hh9+vS5Io4gioiIiIhc6RQ8iYhcgJSUFJYsWcLnn39ORkYGt9xyC7179yYyMvKCu3F+53K5SEpK4tNPP2XHjh3UqVOHAQMGcN9995VovlRGRgbffvstiYmJbNy4EYBbb72VyMhI7r777tM6fPLz81m9ejUJCQmsW7cOk8nEHXfcQVRUFB06dLikTq6ylJycTGxsLCtWrKB69eoMHz6cqKgoLBZLidew2+1MmTKFJUuWcNNNN/G3v/2Nhg0blmHVIiIiIiKi4ElE5CI4nU5Wr15NXFwcGzZsICgoiO7duxMdHU2dOnUuak3DMPjll1+YO3cuq1atwt/fn169etGvXz+qVatWojUyMzNZvXo1SUlJrF+/Ho/Hwy233EJERASdOnUiPDz8tGu//vpr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rVu3Qv831uFwsH37dlauXMm+ffsoX748/fv3p1evXkXSONvhcPDDDz8QHR3N1q1bSUxMJCgoKG87XoMGDcjJyeGrr75iy5Yt7Ny5E6fTyb333kvXrl156KGHSryBd2ZmJh999BH/7//9P7Kysnj00Ud56qmnCAgIuOp1hw8f5o033uDXX38lNDSU4cOH6zNPREREROQKFDyJiNzinE4ne/fuJTIyki+//BIXFxc6depEWFgY9evXL/QqqF9//ZXVq1fz2Wef4ebmRq9evfjb3/5GxYoVi6zeffv2ERUVxdatW0lISKB06dK0b9+ejh070rhxY9LS0oiOjmbz5s388MMPWK1WHnzwQbp27UqrVq1wdXUtkloKIj09nZUrV/Kf//wHp9NJ//79eeKJJ676OeZ0Ovnkk09YuHAh7u7uPPfcc3Tu3FnNx0VERERE/kTBk4jIbeTChQusW7eONWvWcPbsWWrVqkVYWBhdu3bF09OzUHOdP3+ejz/+mIiICGw2G23btiU8PJwmTZoUWYDidDrZv38/0dHRREdHEx8fT0BAAO3bt6dDhw40bdqUhIQEPvvsM7Zs2cKRI0fw9fWlQ4cOdO3alcaNG5fYyXg2m40PPviAVatWYbFYePzxxwkPD7/qSqzz58/z1ltvERUVxX333ceECROoVKlSidQrIiIiInI7UPAkInIbcjqdfPvtt3zyySfs2LEDd3d3unTpQlhYGLVr1y7UXNnZ2WzatIlVq1Zx/PhxateuTXh4OA8//DBWq7VIaz5w4EBeCHX27Fn8/f156KGH6NixI82aNSMmJobNmzezZcsWzp49S9myZfNOxqtZs2aJrChKTEzk/fff55NPPsHd3Z2///3v9OvXDw8Pjytes3PnTmbMmEFCQgLPPvssTzzxRJG+dyIiIiIitysFTyIit7m4uDjWrVvH2rVriY+Pp169ejz66KM8/PDDVw1L/swwDL777jtWrlzJN998Q2BgIH379iU0NPSafY8KyzAMDh48SFRUFNHR0Zw5cwZfX1/atWtHx44dad68ed7JeF988QUpKSlUq1Yt72S8gpxEd6Pi4+P5v//7P9auXYuvry9PP/00YWFhVwyUsrKy+Ne//sV//vMfKlWqxIsvvkjTpk2LvU4RERERkVuZgicRkTuEw+Fgx44dREREsGvXLry8vOjWrRthYWFUr169UHP9/vvvrFq1io0bN2IYBl26dCE8PJwaNWoUed2GYXDkyBGioqKIiori1KlT+Pj40LZtWzp06ECzZs344Ycf2Lx5M9u3bycrK4tGjRrRpUsXHn74Yfz9/Yu8pkvFxsbyzjvvsHHjRkqXLs0//vEPevToccU+VEePHmXatGns37+fnj17MnLkyGKvUURERETkVqXgSUTkDhQbG8uaNWtYt24diYmJNG7cmNDQUDp27FioLWA2m401a9bw4YcfEh8fT4sWLQgPD6dVq1bF0nvJMAyOHj1KdHQ0UVFR/P7773h5efHggw/SoUMHGjVqxLfffsuWLVvYtWsXJpOJli1b0qVLF9q2bVuoFV6FFRMTw/Lly/nss88IDg5m4MCBdO3aFYvF8pexTqeTtWvXsmDBAsxmM6NHj6Z79+5qPi4iIiIidx0FTyIid7CcnBy2b99OREQEe/bswdfXlx49ehAWFkZISEiB58nNzWXr1q2sWLGCAwcOEBISQv/+/enevXuhm5oXxvHjx/O24x07dgxPT0/atGlDx44dqVu3Ll9//TVbtmxh//79eHh40K5dO7p06cJ9992Hi4tLsdR07Ngxli1bxtatW6lcuTKDBg2iY8eO+QZxiYmJzJkzhy1bttC0aVNefPFFqlSpUix1iYiIiIjcihQ8iYjcJWJiYoiMjGT9+vXYbDbuvfdeQkNDadeu3RW3jeVn//79rFq1iujoaLy8vOjTpw/9+vWjXLlyxVj9xe1/W7duJSoqiiNHjuDu7k6bNm3o0KED1apVY/v27WzevJkTJ05QqlQpHn74Ybp06UKDBg2KZaXRwYMHWbp0KTt37qRGjRoMHjyYtm3b5nuv7777jjfffJOzZ8/y1FNP8cwzz6j5uIiIiIjcFRQ8iYjcZex2O9HR0URERLBv3z4CAgLo1asXffr0KVTT7nPnzvHRRx8RGRlJRkYGHTp0YMCAATRs2LAYq78oJiaGrVu3Eh0dzcGDB7FarbRu3ZoOHTpQrlw5tm/fzmeffUZ8fDzly5fPa0perVq1Iq9l//79LFmyhD179lCvXj0GDx5My5Yt/xJAZWdn89577/H+++8THBzMxIkTadGiRZHXIyIiIiJyK1HwJCJyFzt+/DgRERF8+umnpKen07JlS0JDQ3nggQfy7V2Un4yMDDZu3Mjq1auJiYnhnnvuITw8nPbt2xfbdrdLnTlzhujoaKKjozlw4ABWq5X777+f9u3b4+vry1dffUV0dDSpqanUqlWLrl270rlzZ4KCgoq0jr1797J48WL2799Po0aNGDp0KM2aNfvLuBMnTjB9+nR++OEHunbtypgxY4r81EARERERkVuFgicRESErK4vPP/+ciIgIDhw4QFBQEL1796Z3794FDmicTifffPMNK1euZPfu3QQFBfG3v/2NPn36lNhnwtmzZ/nyyy+Jiopi//79uLi4cN9999G2bVvc3Nz46quv+Prrr8nJyaFp06Z07do1L6AqCoZhsGvXLpYsWcLBgwdp0aIFgwcP/ssqMMMw2LhxI/PmzcPpdDJixAh69+5dLA3bRURERERuJgVPIiJymcOHDxMREcHmzZvJzs6mTZs2hIWF0bJlywIHI0ePHmXVqlVs3rwZs9lM9+7d6d+/f4k21o6Pj8/bjrdv3z7MZjMtWrSgVatWAHz99dfs3bsXi8VC69at6dq1Kw888ECR9F4yDIPt27ezZMkSjh07Rps2bRg8eDB16tS5bFxycjLz589nw4YNNGzYkEmTJlG9evUbvr+IiIiIyK1CwZOIiOQrPT2dLVu2EBERwZEjRwgODqZPnz706tWLwMDAAs2RmJhIZGQkH330EYmJibRq1YrHHnuMFi1aFEvD7ytJSEjIC6F+/PFHAJo3b06LFi2w2+3s2LGDX3/9FS8vL9q3b0/Xrl1p3rz5Da9AcjqdREVFsXTpUmJiYmjfvj2DBg36S7j0ww8/MG3aNE6dOsXjjz/OP//5T9zd3W/o3iIiIiIitwIFTyIiclWGYXDgwAEiIyP57LPPyM3NpV27doSFhRU4nLHb7XzxxResWLGCI0eOUK1aNQYMGEC3bt1wc3MrgVfxP4mJiWzbto2oqCj27t0LQJMmTWjUqBFZWVl8/fXXnDp1isDAQDp37kyXLl2oW7fuDQVlDoeDzZs3s3z5cs6ePUvnzp0ZOHAgISEheWPsdjsffPAB7777LqVLl2bChAl5q7NERERERG5XCp5ERKTAbDYbmzZtIjIykuPHj1OpUiVCQ0Pp0aMH/v7+17zeMAx+/PFHVq5cyfbt2/H19SUsLIy+fftSpkyZ4n8Bf5KUlMT27duJjo5m9+7dOJ1OGjVqRO3atUlPT+ebb74hMTGRkJCQvJPxLg2LCisnJ4cNGzbwzjvvkJCQQPfu3fnHP/5x2WmCMTExvPnmm+zevZuOHTsyduzYm/LeiIiIiIgUBQVPIiJSaIZhsG/fPiIiIoiOjgagQ4cOhIWF0bhx4wKtDjp9+jQffvgh69atw26306lTJwYMGEDdunWLu/x82Ww2tm3bRnR0NN999x25ubk0aNCAKlWqkJqayu7du8nIyKBevXp07dqVTp06FXjL4Z/Z7XYiIiJ47733sNls9OnTh6effjqvkbthGHz22WfMmTOH7Oxshg0bxqOPPqrm4yIiIiJy21HwJCIiNyQ5OZkNGzYQGRnJqVOnqFq1KmFhYXTr1q1AnwVpaWmsX7+e1atXExsbS5MmTRgwYADt2rW7aUFLamoqX3/9NVFRUezatYucnBzq1KlDhQoVSE5O5qeffsLpdNKiRQu6dOnCQw89hJeXV6Hvk5mZyUcffcT/+3//j6ysLB599FGeeuopAgICgIufqwsXLiQyMpJ69eoxadIkateuXdQvV0RERESk2Ch4EhGRIuF0Otm7dy8RERFs27YNFxcXOnXqRFhYGPXr17/mKiin08n27dtZuXIlP/74I+XLl6d///707NkTb2/vEnoVf5Wens7XX39NdHQ0O3fuxG63U6NGDUqXLk1iYiJHjhzBarXStm1bunTpQqtWrXB1dS3UPdLS0li5ciUrVqzA6XTSv39/nnjiibzP0p9++olp06Zx4sQJ+vfvz+DBg/H09CyOlysiIiIiUqQUPImISJG7cOEC69atY82aNZw9e5ZatWoRFhZG165dCxSYHDx4kFWrVvH5559jtVrp2bMn/fv3p2LFiiVQ/ZVlZGSwc+dOoqKi2LFjB9nZ2YSEhBAQEMD58+c5c+YMvr6+dOzYkS5dutC4ceNCrdpKSUnhgw8+YPXq1VgsFh5//HHCw8Px8vIiNzeXFStWsHz5cvz9/Rk/fjxt27Ytxlf7V06nk9SMLOw5uRhOA6urC16e7ri6WEq0DhERERG5fSh4EhGRYuN0Ovn222/55JNP2LFjB+7u7nTp0oWwsLACbRk7f/48H3/8MREREdhsNh588EEee+wxmjRpckOnzBWFzMxMdu3aRVRUFF9//TWZmZmULVsWX19f4uLisNlslC1bNu9kvJo1axa45sTERN5//30++eQT3N3d+fvf/06/fv3w8PAgNjaWGTNmsHPnTtq2bcv48eMpW7Zs8bzGLDt7Dxznt5hzHD5xll+PncGWnolhGBgGmEwm3Kwu1KhUlnrVK1Czcjma1q1CUKBfsdQjIiIiIrcfBU8iIlIi4uLiWLduHWvXriU+Pp769esTFhbGww8/jIeHx1Wvzc7OZvPmzaxcuZLjx49Tq1YtwsPD6dSpE1artYRewdXr27VrF9HR0Wzfvp2MjAxKlSqFt7c3586dw263U716dbp27Urnzp0vO8XuauLj4/m///s/1q5di6+vL08//TRhYWG4urqydetWZs2aRXp6OkOGDOFvf/sbFkvRrDw6dfYCm77ex4btP3A+0YZhXGx4bnV1werqgslkwgQYGOTkOsm25wDgNAy8Pd1p17wuPdo1pUndymqILiIiInKXU/AkIiIlyuFwsGPHDiIiIti1axdeXl488sgjhIWFUa1atateaxgGu3fvZuXKlezcuZOAgAD69u1LWFhYXkPum81ut/Pdd98RFRXF9u3bSU1NxdvbGw8PD+Lj4zGZTDRu3JiuXbvSsWNH/P39rzlnbGws77zzDhs3bqR06dL84x//oEePHmRnZ7N48WI+/vhjatasyUsvvUS9evWuu/b4RBsLV37Otj2/kpFlx+piwdfbs8Bb6f7YipeRZcfVxUKtKsGMerwLTetWue6aREREROT2puBJRERumtjYWNasWcO6detITEykcePGhIaG0rFjx2uuZDp58iSrVq1i48aNOJ1OunTpQnh4ODVq1Cih6q8tJyeHPXv2EBUVxbZt20hOTsbNzQ2r1UpiYiIeHh60atWKrl278uCDD15z5VdMTAzLly/ns88+Izg4mIEDB9K1a1cOHTrEG2+8wW+//Ubfvn0ZOnRooRqyG4bBZzv3s2Dl58QlJOPt6Y6Xpzvm69zOaBgG2fYcklMzcHez0q/zfTwb2g5PD7frmk9EREREbl8KnkRE5KbLyclh+/btREREsGfPHnx9fenZsyehoaGEhIRc9VqbzcaaNWv48MMPiY+Pp0WLFgwYMIDWrVvfUtu8cnNz2bt3L9HR0Xz55ZdcuHABs9mMi4sLaWlplCpVioceeoiuXbvSokULXFxcrjjXsWPHWLZsGVu3bqVy5coMGjSIhx56iI8//pglS5bg5eXFuHHj6NChwzX7SqVnZvPmO+uJ2vULTsMg0N8bSxG9b4ZhYEvLJDPbTs3K5Xht2KPUrFyuSOYWERERkduDgicREbmlxMTEEBkZyfr167HZbNx7772EhobSrl07XF1dr3hdbm4uW7duZcWKFRw4cICQkBD69+9P9+7dC3SSXklyOBz88MMPREdHs3XrVuLi4jAMA5PJRE5ODuXLl6dTp0506dKFBg0aXDE8OnjwIEuXLmXnzp3UqFGDIUOGULt2bWbPns22bdto3bo1L7zwwhV7SqWkZfDivA/57udj+Hp54FVMK5Jych0kJKdSNtCPGWP6c0/NSsVyHxERERG59Sh4EhGRW5LdbicqKorIyEj27dtHQEAAvXr1ok+fPtdszv3zzz+zcuVKoqOj8fT0pE+fPvztb3+jXLlbb7WN0+lk3759REVFsXXrVk6fPo3D4cAwDMxmc15T8q5du1K1atV859i/fz9Llixhz5491KtXj8GDB2O325k1axbJyckMHDiQxx577LJVVOmZ2Tz/1kp2/3yMAF8v3KxXDvWK6nXGJ9ooE+DLnPGPU6dqwRqsi4iIiMjtTcGTiIjc8o4fP05ERASffvop6enptGzZkrCwMNq0aXPVk9zOnTvHRx99xJo1a0hPT6d9+/aEh4dfdRXRzeR0Otm/fz/R0dFERUVx8uRJ7HY7TqcTNzc3GjVqxCOPPELnzp0JCgr6y/V79+5l8eLF7N+/n0aNGvHMM8+we/duVq1aRdWqVZk0aRINGzbE6XTy0oKP+fybn0skdPrf6zOIu5BCxXIB/Ou1f1CmlL4riIiIiNzpFDyJiMhtIzMzky+++IKIiAgOHDhAUFAQvXv3pnfv3vkGMX/IyMjg008/ZdWqVcTExFC/fn3Cw8Pp0KHDVXsp3UxOp5MDBw4QHR3NF198wdGjR8nOzsbpdOLl5UWbNm145JFHaN++/WWfuYZhsGvXLpYsWcLBgwdp0aIFXbp04ZNPPuHXX38lNDSUWs3aMfv/bcHLww1P95Jt+O1wOIlPstGldUNeH9H3lgwARURERKToKHgSEZHb0uHDh4mIiGDz5s1kZ2fTpk0bHn30Ue6///4rNhV3Op188803rFy5kt27dxMUFES/fv0IDQ29pT+3DMPg4MGDREVF8dlnn3HkyBEyMjIAKFWqFA8//DDdu3fngQceyDsN0DAMtm/fzpIlSzh27BitW7emSpUqfLJ2IwluNfDw9qNS8JXDuuKUnplNZrad14Y9SqdWDW5KDSIiIiJSMhQ8iYjIbS09PZ0tW7YQERHBkSNHCA4Opk+fPvTq1YvAwMArXnf06FFWrVrF5s2bMZlMdO/enQEDBlClSpWSK/46GIbBkSNHiIqKYtOmTRw8eJCMjAzMZjNBQUH06NGDHj160Lx5c8xmM06nk6ioKJYuXUpMTAyeVVtyLtWEw56Ol5cnweWC88KqknSx35MPH0wfSilfrxK/v4iIiIiUDAVPIiJyRzAMgwMHDhAZGclnn31Gbm4u7dq1IywsLC+EyU9SUhIRERF89NFHJCYm0qpVK8LDw7nvvvtu+W1ghmFw9OhRoqOjWb9+PQcOHCA9PR1XV1cqVqxI37596d69O3Xr1sXpdPL+io95c8VXOHJz8XR3Jceeg9PppHTp0gQGBpbo63U4nJxPsvHc37sxoFurEruviIiIiJQsBU8iInLHsdlsbNq0iYiICE6cOEGlSpUIDQ2lR48e+Pv753uN3W7niy++YMWKFRw5coRq1aoxYMAAunXrhptbyfZBul7Hjx/niy++YM2aNRw4cIC0tDTc3d2pUaMG/fv3J9kSxJqt+zAyk/hh45LLLzaZcfPwJrBCNWo0eQjf0hdPnTu8+3N+2/sFTR5+jAo1G192SY49iz2b3iMx9jjlazahcYe/YTZf3ux917qlXDhzDJ+AsrTtP+6y5+ITbVSpUJoVM4bhcpUm8SIiIiJy+1LwJCIidyzDMNi3bx8RERFER0cD0KFDB8LCwmjcuHG+K3wMw+DHH39k5cqVbN++HV9fX8LCwujbty9lypQp6Zdw3X7//XeioqL46KOP+OWXX0jPzMbvnkewunvh4w77Ni7F3dsfz6BqOB1ODGcuWSnxZNviMVtcuL/nQAKCq14xeMrOTGP3xndIOX+GKg1aU79Nr7+8n+kpF/hyxYz//sqgddgISpUN+d8c9hxs6ZnMef5xWjWpVQLvioiIiIiUNAVPIiJyV0hOTmbDhg1ERkZy6tQpqlWrRmhoKN26dbviZ9aZM2dYvXo169atIzs7m06dOhEeHk7dunVLuPobExMTw8L3PiZixzFyMtOwZ6QQ9+N6vAIr0vDhx3E6nSReSCQ3Nxdn0nFO7v+KgPLVaNV7SL7BU2ZqMt9uWE568nlqNn+Y2i065XvfQ99t4ej30VRr3Jbj+7YTUu8+GrZ79LIxZxOS6d2+GS8N6lPcb4OIiIiI3AQFzYryb4whIiJym/D39+eJJ54gIiKCxYsXU7VqVebOnUvXrl157bXX+OWXX/jz37FUqFCBsWPHsmnTJkaNGsVPP/3EE088wT/+8Q+2bt2K0+m8Sa+mcEJCQqhapxGBgYHUrVeH4OBgAHIdDk6ePElsbCwWFwsVK1akVtN2AKTEn8p3rrSkeHauWUR6cgL1H+h9xdDJcDo5fWgvru6e1LmvC55+pYn9bR+5OfbLxrm6WPj5SP73EhEREZG7h4InERG5I5jNZlq0aMGMGTPYtGkTzz77LHv37uWpp57iscceIyIigoyMjMuu8fb2Jjw8nLVr1zJr1izMZjPjx4+nd+/erFixgrS0tJv0agru4PFYAKyuVgICAoCLr6tSxUq4u7mTlpqG3X5pKPTXbYjJ8af4Zs1isjNsNO7Yn6oNWl/xfvGnDpOVnkL5Go0wW1yoWKspuTnZnD3202Xj3K2unLuQQrIt/cZfpIiIiIjcthQ8iYjIHScwMJBnnnmGdevW8fbbb1OuXDlmzJhBly5dmDZtGocPH75svNls5qGHHmL58uV88MEHNG7cmAULFtCtWzdmz57N6dOnb9IruTqHw8nhE7G4ubpc9rjZZKJMmTLUrl2bhg0bUqZMGX7/5RsA/MtWumzshTPH+HbdMnJz7TTv+hQVazW96j1PHdwNQMVazQCoUKspYOLUwT2XjXOzupBtz+HoqbgbeYkiIiIicptzufYQERGR25PZbKZVq1a0atWKuLg41q1bx5o1a4iMjKR+/fqEhYXRqVMn3N3d866pW7cuU6ZMYcSIEXzyySdERETw4Ycf8uCDDxIeHk7Tpk3zbV5+MyQkp5KRZcf6p+ApPeUCh3d/DoAj105yXAyJZ09gtrhQ574ul42N+fVbABq0DaVs5av3uMrOTCPu94N4+ZehVLnKAHj5BRIQXIXEsydIS4rHu1QQAC4WC7kOJ2fik2hev0heroiIiIjchrTiSURE7gply5Zl4MCBbNy4kbfeegs/Pz9ef/11unTpwqxZszh+/Phl48uUKcOQIUP49NNPmTRpEqdOnWLQoEE89thjbNy48U/b124Ouz0XwzAwmS8PwjJsF/ht7xf8tvcLTuzfQYYtkfI1m9Dm0ZGUKlflsrGlK9YE4NC3W0g5f+aq9zt9aC+G0/GXVVEVal9c/XTq0P9WPZlMJkwmE/ac3Ot9eSIiIiJyB9CKJxERuatYLBbatm1L27ZtiY2NZc2aNaxbt44PP/yQxo0bExYWRocOHbBarQC4ubnRu3dvevXqxe7du1m5ciWTJ0/m7bffpm/fvoSFheX1VippTsPA4K9dm8pUqsV9Pf5ZoDkq1W1BuWr38MtXa/l2/TLu6zEQ/6CK+Y69uJ3OlBc0ZWZlknghEYtPWUxmF2IO7qFc7ZZYXF2wWCw4cnNJSkomIyMDDw+PW2almIiIiIiUHJPx56N+8lHQI/JERERuRzk5OWzbto3IyEj27NmDn58fPXr0IDQ0lJCQkL+MP3nyJKtWrWLjxo04nU66dOnCgAEDqFmzZonWHRufxN/GvY2bqyse7lYybIls/c/0AgVPh3d/zm97v6DJw49RoWZjTh74lp+3R+Lq5s593f/5l15QiWd/55s1i65ZU7kGHfEqffE9c5iteGX8jrv9PBaLBV9fX3x8fPD19c33x8fHBz8/v7+McXNzu/43SURERESKRUGzIq14EhGRu56rqysPP/wwDz/8MDExMURGRrJ+/Xr+85//cO+99xIWFkbbtm1xdXUFoHLlykyYMIGhQ4eydu1aVq9ezfr167n33nsZMGAAbdq0wWwu/t3svt4eWCwWch2OG56rcv37MZnM7N/+Cd9uWM59Pf5JqbL/C93+aCpeJqQO7l5//WKRk53JueM/Y6TGUqtVR3JyckhITuMfT/yDmsE+pKSkkJqais1my/uJj4/n6NGj2Gw2UlNTyczMzLc2q9V6zXDqSo+7uOirjoiIiMjNpG9jIiIilwgJCWH06NEMHTqUqKgoIiMjmTBhAgEBAfTq1Ys+ffpQvnx5AHx9fXnyyScJDw9n69atrFy5kueee45KlSoxYMAAunfvjqenZ7HV6u3pTsWyARyNicPH68bnC6nXApPZxE9ffsx3G/7Ffd2fpVS5KuTmZBN7bD8WFyvNOj+Oi+tfVyAZhpPof08jPuYQOdnpGGZ3vDw96P5wWyqXL12g++fk5PwlnLr0JzU1NS/AOn369GWPX6nnloeHxzXDqfwCLG9v7xIJD0VERETudAqeRERE8mG1WunWrRvdunXj2LFjRERE8PHHH/P+++/TsmVLwsLCaNOmDRaLBRcXFzp16kSnTp34+eefWbVqFbNnz2bx4sX06dOHfv36ERwcXCx13lOjIodPxBbZfJXq3IvJZOanrR/x3YZ3aNH9WdKSzuPIyaZi7Wb5hk4AJpOZirWbcfSHrZw+9D2BNVrkBWMF5erqSkBAQKF7ZhmGQXZ2dl4IdaWw6o/Hzp8/f9kYp9OZ77ze3t5XDKeuttrKy8tL/axERERE/kvBk4iIyDVUr16d8ePHM2LECL744gsiIiIYO3YsQUFB9O7dm969exMUFARAgwYNaNCgASNHjuSjjz5izZo1rFixgvbt2xMeHk6DBg2KNJSoEVIOuBi+FJWKtZthMpvZF7Wa7za+iyPn4mqiinXuvfp1dZpz9IetnDq0B+/KTWherRoWS/GvGjKZTLi7u+Pu7p7376GgDMMgMzMz362A+QVYZ86cyXssLS0t3/fdbDYXeCvgn8e4u7srtBIREZE7ipqLi4iIXIdDhw4RGRnJ5s2byc7Opk2bNjz66KPcf//9l23RysjI4NNPP2XVqlXExMRQv359wsPD6dChQ5H0Hzp+Op6/v7gUF4sZb0/3G56vKDicTs4n2nju790Y0K3VzS6n2DidTtLS0vJdVXWl1VZ//GRkZOQ7p6ur63U1YPfx8ck7iVFERESkJBQ0K1LwJCIicgPS09PZsmULERERHDlyhPLly9O7d2969epFYGBg3jin08k333zDypUr2b17N0FBQfTr148+ffrg5+d3QzWMmfEBO348QrnAG5unMDIyM0hLTcPH1wc3q9tlYVtyagZWVwsfvTWKQH/vEqvpdpKbm0tqaupVw6krBVjZ2dn5zunu7n7NcOpKYZbFYinhd0BERERudwqeRERESpBhGBw4cICIiAg+//xzcnNzadeuHWFhYTRv3vyyYObo0aOsWrWKzZs3YzKZeOSRRxgwYABVq1a9rnt/uftXJsxdjb+PJ1bX4ttFb2Bw8veTBAQEkJScREJCAmazGVcXV6xuVjzcPbC6WcnKga5t7uGN0Y/pVLliYLfb8w2nCrLaKjc3N985PT09C9x4/dIxXl5easIuIiJyl1LwJCIicpPYbDY2bdpEREQEJ06cICQkhD59+tCjRw/8/f3zxiUlJREZGclHH33EhQsXaNWqFQMGDOD+++8vVJ8fe04u4eMXEXM2gbLFvOop9mwsKckplCtXjlOnT5GTk4PZZMZsMYMBmF0xmc2Yzu3Fy5JDjRo1qFevHjVr1qRGjRpUr16d4OBghRU3gWEYZGVlFWgr4J/HpKWl5duE3Ww2X9aE/Wqrrf78uIeHh/pZiYiI3MYUPImIiNxkhmGwb98+IiIiiI6OBqBDhw6EhYXRuHHjvD902+12oqKiWLFiBYcPH6ZatWr079+fRx55BDe3/E+R+7Ptew8ycd6HuLm6FGuvJwOD2NhYbCk2vLy8SExKvNhg2wAXVysmV3esWeewJB4mOzubrKwsHA4HJpMJs9mMm5sbvr6+1KlTh3r16lGjRg0aNmzIPffcU2w1y41zOp1kZGQUaFXVnx9PS0vLd06LxVKgrYD5BVcF/X0hIiIixUfBk4iIyC0kOTmZDRs2EBkZyalTp6hWrRqhoaE88sgj+Pj4ABeDqh9//JFVq1axbds2fH19CQsLo2/fvpQpU+aq8xuGwdRla1n35fcElfIt1tPkDAxiz8SSYkvB4XBgOA0MDAyzG6bcTAKyfsPFdPnqGMMwyM3NJTs7O+8HwOFwUK5cOb799ls8PDyKrWa5eRwOB2lpaQVuvH7pmMzMzHzntFqthWq8funj2v4pIiJSNBQ8iYiI3IKcTid79+4lIiKCbdu24eLiQufOnQkNDaV+/fp5q6DOnDnDhx9+yNq1a8nOzqZTp04MGDCAevXqXXHuJFs6T7+0jDPxiZQN8CvWbUx/hE+JiYk4HA5c3DwxDIOUI9sh4zwVKlTA3f3qK68yMzNJSkpiwoQJjBw5sthqldtXTk5OvuFUQVZb2e32fOf09PQs0FbAP/94e3tri6iIiMglFDyJiIjc4i5cuMC6detYs2YNZ8+epVatWoSFhdG1a1c8PT2Bi6fmrVu3jtWrVxMbG0ujRo147LHHaNu2bb4nke07dJLn31pJSmoGQQG+xRs+GQanTp/mQlIKZosrPjlxWFJ/58yZM2RnZ1O2bFlKlSqV77UOh4OzZ8/SsWNH3n//fa1CkSKXnZ1doK2A+f3k18/KZDLh7e2dbzh1rdVWnp6e6mclIiJ3HAVPIiIitwmn08m3337LJ598wo4dO3B3d6dLly6EhYVRu3btvDHbt29n1apV/PDDDwQHB9O/f3969eqFt7f3ZfN9s+83Xl7wEbb0LIJK+WI2F98feJNt6cTGxZF0/AdKkUApf38MwyAuLo6kpCR8fHwIDg6+LCQzjIt9oipVqsTatWspX758sdUnUliGYZCZmXnNhuv5BVqpqank99XabDYXqvH6pT9ubm4KrURE5Jak4ElEROQ2FBcXl7cK6vz589SvX5+wsDA6deqUt3Xt0KFDrFy5ks8//xyr1UqPHj3o378/lSpVyptn74HjTJr/ERdS0ijl44m7m7VI63Q4nCQkp+LqYuFvne9l2vPPkpiYSPXq1fHy8gIgNTWV2NhYLBYLFSpUyOvhlJSUhNPp5N1336V9+/ZFWpfIzeR0OklLSytw4/VLfzIyMvKd09XVtUBbAf88xsfHB6u1aH/fi4iIXErBk4iIyG3M4XCwY8cOIiIi2LVrF15eXjzyyCOEhYVRrVo1ABISEvj444+JiIggJSWFBx54gMcee4ymTZtiMpmIOZvArPc+ZffPRzGbzQT4et/w6ifDMEjPzCY1I4tK5QIZ80RXHmhWm3/961+MGTMGwzCoXLlyXviUk5PDmTNnyMzMJCgoCC8vLy5cuMDIkSOZOHHiDb9PIneK3NzcvFVTVwqnrvTcH836/8zd3b3AWwL//Ov8tvKKiIhcSsGTiIjIHSI2NpY1a9awbt06EhMTady4MWFhYXTo0AGr1Up2djZbtmxhxYoVHD9+nFq1ajFgwAA6d+6MxeLCmui9LPs4miRbOq4uFvy8PXF1KdwfKp1OJ6kZWWRm2bG6utDtwcYM6/8w/r4XA6aMjAweeughDhw4AEClSpXywifDMDh//jwJCQkAdOjQgYiICK3GECkidru9UI3XL308Nzc33zm9vLwK3Hj90jFeXl5qwi4iNywn18HJ2ASOxpzj99gE0jOysOc6cLGYcbe6EhIcSPVKZaleqSwe7vo+cbMoeBIREbnD5OTksG3bNiIjI9mzZw9+fn706NGD0NBQQkJCMAyDPXv2sGLFCnbu3ElAQACPPvoojz76KFm5Jj796kfWf/kDcRdSMDCwurjg7uaKm6srFsvlf1B0GgZ2ey7Z9hyy7DkYhoG3pzvt7q1Hz4ea0rhO5b/0nfn3v//NCy+8gN1uJzs7m5CQkLwm6QAnT54kKyuLxo0bM3v2bO67774Sed9EJH+GYZCVlVWgrYB/fi41NTXfJuxmsxlvb+9CN2D38fHBw8ND/axE7mI5uQ6+/ek3Nm7/kR8P/k56Zjb2nFxMJhMXUwsDTGDChNMwcHWx4O7mSs2QcjzyYGPa33cPPl5XP1FXipaCJxERkTvYyZMniYyMZMOGDdhsNu69917CwsJo27Ytrq6unDx5ktWrV7NhwwYcDgddu3alf//+hFSuwva9h9j63QF+OXoaW1oG2faLKx4u/fOew2ng5uqCh5uVGiFlad2kFp1bNyQo0O+KNWVlZdGxY0eOHz9Obm4uGRkZeeFTSkoKdrud6dOns3PnTnbv3s1TTz3FoEGDdKKdyG3I6XSSkZFR4Mbrlz6elpaW75wWi+UvfaoKutpKKyhFbl+p6Vms+3Iv67Z+T8zZCzidTtzdrLhZXXBzdc23TYBhGNhzcsm255KZbQcgwM+Lrg805tFOLagQFFDSL+OupOBJRETkLmC324mKiiIyMpJ9+/YREBBAr1696NOnD+XLl8dms7F27VpWr15NfHw8zZs3Jzw8nDZt2gBwNiGZozFxnD2fTE5OLg6ngdXVBX8fT2qElKVKhTJYXQseDK1atYqxY8cSGBhIXFwcmZmZlCtXjtTUVJ599lmmTp2KYRj8+9//ZvHixdxzzz288cYbBAcHF9dbJCK3GIfDQVpaWoEbr186JjMzM985rVZrgRuv/7m3lcJvkZtnzy/HmP3+Jo6fjsdiMuHn41mo7x1/yHU4sKVlkp2TS6CfN4P6daB3+2ba+lvMFDyJiIjcZY4dO0ZERASffvopGRkZtGzZkrCwMNq0aYNhGGzdupVVq1bx888/U6lSJQYMGED37t0v2w53o+x2O506deLIkSMEBwdz8uRJbDYbLVq04PPPP7/sXvv372fSpEmkpaXx8ssv64Q7EbmmnJycQjVev/Rxu92e75yenp4Fbrx+6Y+3t7f+UCtyndIyslj2cTRrovaSnZNDaT8fXArZfzI/TqdBYkoaTsOgZaOajHv6ESqW1eqn4qLgSURE5C6VmZnJF198wSeffMKvv/5KUFAQvXv3pnfv3gQFBfHzzz+zatUqoqKi8PT0pE+fPvTr16/IVh19/PHHjBo1isDAQBITE8nIyKB69eq8//773HPPPZeNtdlsTJ06la1bt9K3b1/GjBmjLTMiUiyys7ML1Xj90p/8+lmZTCa8vb0L3Hj90sc9PT3Vz0ruWheS05gwdxX7Dp3E090NHy/3Iv/9kJltJ9mWQXCQPzPGDKBe9QpFOr9cpOBJREREOHToEJGRkWzevJns7GweeOABwsLCuP/++zl//jwffvgha9asIT09nYceeojHHnuMBg0a3NAXQLvdTteuXfnxxx/x8vJi6tSpfPXVVxw9epQlS5ZQr169y8YbhsEnn3zC3LlzqVKlCtOnT6dy5co3+tJFRIqEYRhkZmYWaCvgn8ekpaWR3x+3zGZzoRqvX/q4m5ubQiu5bV1ITmPMjA/49dgZAv29r2tbXUE5nU7iE20E+vswe1w499SsVGz3ulspeBIREZE86enpbNmyhYiICI4cOUL58uXp3bs3vXr1wtPTk40bN7Jq1SpiYmKoV68e4eHhdOzY8bp7n6xdu5axY8fSvXt35s2bR2ZmJsOHD+fEiRMsXryYunXr/uWaI0eOMHHiROLj43nhhRfo3r37jb5sEZGbyul0XtbPqqAN2G02GxkZGfnO6erqWqjG65c2a9eKUrmZUtOzeG7mB/x48CSlS/ngWgRb667F6TSIT0whKNCP+ROepEZI2WK/591EwZOIiIj8hWEYHDhwgIiICD777DMcDgcPPfQQoaGhNG3alO+++44VK1awe/duypQpQ79+/QgNDcXP78qn2eUnNzeX9evX07Fjx7zvDunp6QwbNoyYmBiWLFlC7dq1/3JdRkYGs2bNYsOGDXTr1o0JEyYUaQ8qEZHbRW5uLqmpqQVuvH7pmOzs7HzndHd3L3Dj9T+HVhZL8YcEcmeb/d5GPtzyLQF+xbvS6c+cTidxiTYa1KjE0lefxc2qAwWKioInERERuSqbzcamTZuIiIjgxIkThISE0KdPH3r06MGFCxdYuXIlmzdvxmQy8cgjjzBgwACqVq16Q/dMS0tj6NChnD59mqVLl1KrVq18x23atInp06dTpkwZpk+fnm9IJSIi+bPb7dfVgN1ms5Gbm5vvnF5eXgVuvH5pcOXl5aUm7HeYM2fOkJ6efsXP8Px8u/8o42atwGIx4+vlUYzV5c+ek0uiLZ3B/TrwbGi7Er//nUrBk4iIiBSIYRjs27ePiIgIoqOjAejYsSOhoaFUrlyZNWvW8NFHH3HhwgVatWrFgAEDuP/++6+7x0hqaipDhw4lNjaWpUuXUrNmzXzHxcTEMHHiRI4fP87o0aPp16+f+pqIiBSjP/pZXU8D9rS0tHybsJvNZry9vQvceP3Sxz08PPTf/VvQmDFjWL9+PY899ljeYSJXk5qexdMvLSPmbAJBAb437d9pki0dF4uZJa88Q91qajZeFBQ8iYiISKElJyezYcMGIiMjOXXqFNWqVSM0NJROnTrx7bffsmLFCg4fPkzVqlUZMGAA3bp1w93dvdD3sdlsDBkyhLi4OJYtW0b16tXzHWe323n77bdZvXo1bdu25dVXX9V3ERGRW5DT6SQ9Pb1QWwL/+HV6enq+c1oslkI1Xr/0OfWzKj6PP/44n376KW5ubpQvX54xY8bQv39/XF1d8x3//tqvWLTqc0r7++BSAn2drsQwDM5dSOGBprWZ+8ITN62OO4mCJxEREbluTqeTvXv3EhERwbZt23BxcaFz58706dMHu93O6tWr2bZtGz4+PoSFhdG3b1+CgoIKdY+UlBSGDBnC+fPnWbZsGdWqVbvi2O3bt/Paa6/h4eHBG2+8QePGjW/wFYqIyK3C4XCQlpZW4Mbrl/5kZWXlO6fVai1w4/U/bx+83oM17hZdu3bll19+oXTp0pw/fx6n00nTpk2ZNGkSLVu2vGysPSeX/uMWEHs+CS9LLlv/M/2y501mC24e3gSUr0qNJg/hW7o8AElxMZz85RtSzp8mK92GIzcHdy8//MpUpHqTtvgH/fWEOsMwOHf8F37/eSdpyfHk2LPw8PYnsHw1qjd5CC+/QNIyssh1OHn/jUFUr6RG4zdKwZOIiIgUiQsXLrBu3TrWrFnD2bNnqVWrFo8++igNGzZk/fr1rF27luzsbB5++GHCw8OpV69egedOTk5m8ODBJCYmsnz5cqpUqXLFsXFxcUyaNIn9+/czePBgnnrqKfUNERG5y9nt9iuGVtcKsHJycvKd09PTs8CN1y/98fb2vuM/l95//33Gjx+PyWSiYsWKmEwmsrKySEhIwMPDg169evH8889TocLFrWxf7j7AhLmr8ffxIjfTxtb/TMfTN5AKtZoC4MjJJikuhqRzv2O2uHB/z4EEBFfl2I/bOP7T15QqG4K7tx8WFysZtgvE/f4rToeDxh3+RsXazS6r7dedGzj+01e4efpSrmo9XKzu2BJiOX/qN1xcrbQKHY5PQFnOXUjhqV4PMjy8U4m/f3caBU8iIiJSpJxOJ7t27SIiIoIdO3bg7u5Oly5d6Nq1KwcPHmT16tXExsbSqFEjwsPDadeuXYFOQUpKSmLQoEHYbDaWL19OSEjIFcc6HA6WL1/O//3f/3HvvfcyZcoUSpcuXZQvU0RE7gKGYZCdnX1dDdhtNlu+/axMJhPe3t4F2gr45+c8PT1vi35WEydOZObMmZhMJjw9PQkMDMTf3x+z2Zz3PpUpU4Zhw4bx1FNPMWlBBF9/f4hypf3JsCWy9T/TKVOpFvf1+Odl8x76bgtHv48moHw1WvUegiM3B4vLX7fu2S6cY8cn83GxuvPwU6/kvWdZGTai/t9UPLz9ebDfGFzd/tfA/PhPX/Hrzg1UqnMvjdr3IzElDV9vDyLmjsbTw61437A7XEGzIq0hFBERkQIxm820bt2a1q1bExcXl7cKKjIykvr16/PMM8/g4eFBREQEL7zwAsHBwfztb3+jd+/eeHt7X3HeUqVKsXTpUgYNGsSgQYNYtmzZFcMni8XCkCFDaNasGS+//DIDBgxgypQpf1naLyIicjUmkwl3d3fc3d0LvVXcMAwyMjIKvCXw9OnTeWNSU1PzndNsNheq8fqlj7u5uZVYaGW1WjGZTJjNZjIzMzl9+jRxcXEEBAQQEBCAt7c3Fy5cYMqUKXz48SdkBd2HRwF6QVZt0Jqj30eTEn8KIN/QCcA3sBzepcpiSzhDrj0rL2DKtCWBYVCqXJXLQieAoMp1+XXnBrIz0wDw9nQn2ZbBkZPnaFyn8o28HVJACp5ERESk0MqWLcvAgQN59tln+frrr4mMjOSNN97Ay8uLRx55hL59+7Jjxw4WLlzI8uXL6dGjB/3796dSpb/2ZAAICAjIC58GDx7M8uXLqVix4hXv36JFC1atWsWrr77KiBEjePLJJxk6dKj6coiISLEzmUx4eXnh5eVFcHBwoa51Op2kpaUVaCtgQkICJ06cyHs8IyMj3zldXV0LtBXwz72sfHx8Ct2E/Y+thGazGYvFgmEY5ObmEhcXR0JCAn5+fgQGBuLr68uRE2dwNc7j5eGGu2tB36erB2jpKQmkJ8fj7u1/WcDk5V8as9lC0rnfybFn4Wr9X9gVf/IgAKUrXjxF19XFQq7DwdGYOAVPJUTfzkREROS6WSwW2rVrR7t27Thz5gxr1qxh/fr1fPjhhzRu3JjRo0eTkJDA2rVr+eijj3jggQcIDw+nWbNmf/nb2cDAQJYuXcrAgQMZNGgQy5cvz+sRkZ+AgADmz5/Pf/7zHxYtWsQPP/zAtGnTKF++fHG/bBERkety6cqmwsrNzc0Lqa4VWsXGxnLo0KG8X9vt9nzndHd3L3Dj9T+2VBmGkfcZbjKZcHV1xTAMHA4HiYmJJCcn4+npSUDlBjhMFtJsKfyWnoaPR/6rmAB+/+UbAPzLXv4XVElxMcSfPIThdJCZmkTc778C0KBt6GXjrO5e1GnZjV93bmTbylmX9XhKOHOMyve0pEqDVnk1AxyNOVfofwdyfdTjSURERIpUTk4O27ZtIzIykj179uDn50fXrl3x9/fniy++4NixY9SqVYsBAwbQuXPnv/xta3x8PIMGDSInJ4fly5cXKEj6+eefmTRpEjabjVdeeYX27dsX18sTERG57fzRz6qwDdhtNhsOhyNvntjYWM6ePYvJZMr7AS77yyTDMDAMA9+q9+Jd4R5MjmwwQU5mKue+X4e7dykq1WkGmHDk2kmOiyHx7AnMFhda9hpEqXJV8uY68fNODny9Nu/Xbh7eNO7QnzIhtfN9nbFHf2L/lx+Tm5Od91hAcFXq3N+VgOCqeY+dT0qlVuVy/Hv6kBt8Z+9uai4uIiIiN93JkyeJjIxkw4YN2Gw2mjdvzj333MPhw4fZtWsXAQEBPProozz66KMEBATkXRcfH8/AgQNxOp0sW7asQFsZUlNTmTp1KtHR0YSFhfHcc8/h5qamoSIiItfLMAwyMzPzQqjZs2fzzjvv4Orqmvf8lf7pV70VnsF1cGRf7GvlyE7n/L6Nl81vMltw8/AmoHw1ajR9CN/A/D/vHbk5pCef5/hPX3H6yA/Uvb8b1Zu0u2zMkT1f8Nv30dRu0YkKtZri6uaBLSGWAzvWY7sQS7POT1Kuan0AElPSKBPgy9q3nyuS9+lupeBJREREbhl2u52oqCgiIiL46aefCAgI4IEHHiArK4vt27fjcDjo0qULAwYMoFatWgDExcXxz39ePPXmX//6F2XLlr3mfQzDYM2aNcyePZvKlSszbdo0qlates3rRERE5NpeeeUV3njjjWs2NDcMA+9qLXErXQ1HdtrFXlDZ6STs24ibfzAN2odTrly566ph98Z3iT91mAf7PYdv4MU5zp86wncb/kXVRg9Qv3XPy8ZnZdjY+p83cffyo/1jLwCQbEvHx9uDTUvGX1cNcpFOtRMREZFbhtVqpVu3bnTr1o1jx44RERHBp59+SkZGBs2aNSMgIIBvv/2WDRs20Lx5c8LDw2nTpg3Lli27rOfTtU4eMplMhIaG0rBhQyZMmMATTzzB+PHj6dGjx21xTLWIiEhJMgyD7OxsMjIyyMzMJD09nczMzLxfZ2RkXPbcjh07MAwDu92e97n659VOf3DPycH63213Jkz/axtuGKSlpV13zaUr1SI+5hCJZ4//L3iKOXzxuQo1/jLe3dMXb/+giyfh5WTj4uqGAbhYLNddgxSOgicREREpUdWrV2f8+PGMGDGCL774gk8++YS9e/dSpkwZ2rRpw7lz53juueeoVKkS/fv3Z968eYwaNYrBgwezbNkyypQpc8171KhRgw8++IBZs2YxZcoUdu/ezYsvvoinp2exvKYsew5n4hLJzLKT63Di4mLBy8NKhaAArK76uiUiIjfOMAyysrIuC4QuDYb+HBYV9LlrbYJydXXF09MTT09Pzpw585fxf5x090cQ5XQ6L4ZNhhOzyYT5v9vyyL34eejh4UH1GtWv+33IzrD9977/C46czot9qLIz8w+07JlpYDJh+u81TqeBu9uVm51L0dI3IREREbkpPDw86NmzJz179uTQoUNERkayefNmsrOzqV+/PoZhMHv2bLy8vHjooYfYvn17XvhUunTpAs3/yiuv0KJFC6ZNm8aBAweYPn06derUueHaMzKz+fqHwxw8foZfjp7mxOl4srJzcP7xN7smE2azGU83V2pWDqZe9QrUr1GBVo1r42bV1y8RkTud0+m8LCS6ViB06UqjKz1XkJDIarXi4eGBl5cXHh4eeHp65v3Tz8/vis/98b///JyHh0dePyeAUaNGcfToUVxdXfMCpz9er8PhwDAMXFxcLp6M5+tOjtmMMxdcXFwICAriLBeDrEvWP+UrOf4U/kGV/vJ4SsIZTh74FpPZQumKNfMeL1WuCr//vJMTP31FcLUGuLp55D138pddZKWnUKpcFSyWi5/B9txcaoRcewu/FA198xEREZGbrk6dOrz44ouMGjWKLVu2EBERwZEjRwgMDCQwMJCoqChSU1P5/fff6d+/Px9++CGBgYEFmrtLly7Ur1+fiRMn8tRTTzFq1Cj69+9/XVvvfj9znk1f7+PT7fs4n3Txb1xNJhNuVhc83d0wmy+e8GMYBg6nkyx7LnsPHGfvgeNggvKlS9GzfVO6tmlMcBn/Qt9fRESK3h8h0Z9Dn/x+XdDnMjMzr3lfq9WaF/pcGv54enri7+9/xecuDYsufc7DwwMXl+L9I352dvZlv3Y4HDgcjoufhW5uBAQEUKpUKbKzs0lOPIebbzVKBQQQXK4cOZmpBb7P9599gMlkxq9MRTx8/HE6HKQnx3P+9G9gQP02PfH0/d+hJOWrN+TkgV0kxh7ny5UzKVulHq5uHqScP8OFM0cxu7hSr3WPvPFmk4naVa59cIkUDTUXFxERkVuOYRj88ssvREZG8tlnn5GTk0OFChU4d+4cv/76KwEBAcyaNYvevXtf9jexV2O321m4cCErV67kwQcf5NVXX8XPz69A1ybb0lm8+gu27NxPZpYdq6sLvl4euLgUvD+EPScXW1omuQ4HXp7uhHW8l2dD2+HpoZP3REQKyul0XrUH0fU8V5CQyM3N7aqhT0Ge+/NqIstt2GPoiSeeYOXKlXmrncxmMz4+PgQEBODj44PdbichIQFXV1daPdCOk84Q3N3d8fZ0J8OWyNb/TKdMpVrc1+OfV73PyQPfEn/yILaEWLKz0sEwcPP0ISC4KlUatKZU2ZC/XONw5HLip6+IPbqf9OR4nE4Hbh4+BFaoTo2m7fEJuLjCKdfh4EJKGnPHP07rJrWL/k26i+hUOxEREbkj2Gw2Nm3aREREBCdOnMBisXD06FEcDgfNmzfnscceIzQ0tMAh0ldffcXkyZNxd3fnjTfeoEmTJlcd//X3h5j7783EnLuAl4cbPp7uN9So3Ok0sKVnkpVtp2blYJ5/+hGa1K1y3fOJiNyqnE5nkfQguvSfWVlZ17yvu7v7VUOf/EKiaz136bayu1lYWBjr1q3DYrFQunRpAgICcHNzIzc3l4SEBJxOJ/fccw/PP/88HTt25ImJS/jt5FmCAgr2GV0SbOkXg8aP54wiKED5xo1Q8CQiIiJ3FMMw+PHHH4mMjGTTpk0cPXoUd3d3ypQpg5+fH927d6d///5Uq1btmnPFx8czadIkfvrpJwYOHMgzzzzzlz9U5DoczP9gC5FRe8jJdRDo712kJ+Dk5Dq4kJyKu5uVp/s8yFO9HtQfbETkpnE4HFfcRna9YdGft2Xl548tYlfrM1SY59zd3fXf0mL06aef8o9//ANPT09KlSqF0+kkKSmJzMxMKlasyMiRI+nfvz9WqxWAVZu+Yc7/20SZAF8st8i/l3MJyXRseQ/TR/e/2aXc9hQ8iYiIyB0rOTmZd999lxkzZpCTk0PVqlVxOByYzWbatGnDgAEDaNmy5VVXJjkcDt555x3eeecdmjVrxuuvv553Yp49J5dpy9fx6dc/4unuhq+XxxXnuRGGYZCSmoE918GAbi0Z+Vhn/YFJRK7J4XAUqil1QZ6z2+3XvG9htpUV5DmFRLcfwzCoX78+2dnZWCyWvKzgmWeeYeDAgZQqVeqy8ReS0+g3dj72HAf+PsVzsmxhZNtzsKVnMmf8E7RqXPPaF8hVKXgSERGRO95vv/1GeHg4GRkZuLu7k5mZiYuLCw6Hg7p16xIeHk63bt1wd3e/4hx79+7lpZdewuFw8Nprr3Hfffcz7Z11rN/6Az5e7niVQA+m1PRMMrPtPNnzAYb2f/iGtvKJyK0lNzf3hhtW/7k/0bVCIpPJlO/WsRsJixQSyR+aNWvGsWPHKFWqFD169OC5556jSpUqVxw//V/riPhiD+VK+930z7f4xBSqVghixYxhWCz6//ONUvAkIiIid4UjR44wePBgSpcuTbt27di8eTPHjh3DMIy8puT9+vWjb9++BAUF5TtHUlISr776Kt988w33PNCTX8/m4O1ZMqHTH2xpmdhzcpnwz570eqhZid1XRP4nJyenwE2pC7rlLCcn56r3/CMkulIPout5zs3NTSGRFJtHH30UgPHjx9OiRYtrjj8aE8c/J/8Luz2XAD/v4i7vijKz7KRmZPHy4D50b3v1/o5SMAqeRERE5K7xR/hUqVIlFixYwM8//0xERARbt24lNTUVh8OBr68vPXv2JDw8nHr16v1lDqfTyZxF77Bk7V5crFaqVqpQ4BPzisr5JBv+Pp68+/pAKgQFXPsCkbvUH8FyUTWs/uMnNzf3qvc1m82Fbkp9refc3Nxu+ioQkcL4Y2t7Yf5/+8H6r1mw8nP8fTxxs5bsZytc/IyPS7Tx0L31mPFcfwWzRUTBk4iIiNxVDh06xJAhQ6hSpQoLFy7Ey8uLuLg41q5dS0REBEePHiUnJwc3NzdatWrF3//+d9q1a5d3nHW2PZchU/6PHw4eJys1GafTQXBwcIl+93E6ncRdSKHtvfWYNXaAvhjLHeGPkOhGexD9+TmHw3HV+5rN5ms2pf7jn1dqWP3nkMhqtSokErkO9pxchk19jx8PnaRsoB/mEv59dD7JRilfL/7v9UEEl/Ev0XvfyRQ8iYiIyF3n119/ZejQoVSrVo2FCxfi6XmxkanD4eDrr7/mk08+ISoqCpvNhtlsplatWjzzzDP06tWL9dv3M/8/Wyjl64XFYuLs2bOk2lLx9/enbLmymE0lEwL9sRXgtWFhdGnTqETuKfIHwzCw2+0F6jNU0OcyMjIKFBL9ecvYjfYncnV1VUgkcgs5GnOOYVPfJ8mWTlCAb4n9/kyypWMYBi8P7qPP1SKm4ElERETuSgcOHGDo0KHUrFmTt99+Oy98+sOZM2dYs2YNq1at4sSJE+Tm5lK6TBDedTpjuLhTrvT/TuRJSk4i7lwcVquVChUq4OZWMj2fzl1IoUHNSrw75Z/6g7NckWEYZGdnF8mx95c+53Q6r3pfi8VS4BVCBX1OIZHI3WHvgeO8MGc1qemZlAnwLfaVT0m2dBxOJ8MGPMzj3dsU673uRgqeRERE5K71888/M2zYMOrUqcP8+fPx8PD4y5icnBy2bdvGihUr+HL3rxhBjTA57bi7GBz58oPLB5vMuFg9CKxQjdrNO+JbujwAh3d/zm97v6DJw49RoWbjy+e3Z7Fn03skxh6nfM0mNO7wN8zmi9v60pLP8/vPO0k4fZSstGScjlysHt74lw2hQs3G+JWvRaY9lyUvP02j2pWL5T2SknVpSFSUW86uFRK5uLhcMfS53mbWVqu1hN41EbkTfbf/KK8s/IQLKWmU9vfB1cVS5PdwOp0kJKfhYjEzpH9HHnuktcLtYqDgSURERO5q+/fvZ/jw4dSrV4958+bh7u5+xbH/fHkJO388QlZ6Mpm2JM79sA5XD1/KVW+Iu7s7uTnZJJw5TmrCGcwWF+7vOZCA4KpXDJ6yM9PYvfEdUs6foUqD1tRv0yvvC++xfds5tGsThmEQEFwFvzIVsLhYyUxLJuH0b2RnpFKxzr2UbdiJPh2aM2lg72J+p+TPDMMgKyvruo69v9pz1/ra7erqetXQ53qaWZd0g3wRkYL45bdTTF2+lqMxcXi6W/H18iiyYCgzy05yWgal/b0Z+VgXuj3YuEjmlb8qaFbkUoI1iYiIiJSYhg0b8vbbbzNixAiee+455s6dm+9WufNJNg7HJBBUOhDvkPLEx8Zw7gewuHnh9Akhx+pKUJkg6rfuyaHvtnD0+2gOfbeFVr2H5HvfzNRkvt2wnPTk89Rs/jC1W3TKe+7kgW85+M1GPHxK0bzLk/iVqXjZtU6ng9OHvifx7HE8rK5s2/0rzz/dHaurvrJdidPpJCsrq0iOvf/jnwUJiaxW6xVDn+Dg4GsGQn/eqqaQSETuJvfUrMS7Uwbyr0+2EvHFbs5dSMHP2wMPt+tv4G/PySU5NR0w8WCzOox9qptOiL1F6FuMiIiI3LEaN27M/PnzGTlyJGPHjmXOnDl/2Sb028k4su12Any9MZlM+Pj4AODl5U1QUBCJiYmcO3eOMmXKULVBa45+H01K/Kl875eWFM+3G/5FVloK9R/oTdUGrfOey8nO5OCuTzGbLbR45Fl8Asr+5Xqz2UJIvRZUqN2UnFyDjKxsfj9znlpVgovwXbl5/giJiuLY+0tDomuxWq1XDH38/f2vefLZnwMkDw8PXFz0NVpE5EZ4ebgx+omuPNC0Dss+jubA0dOkpGbi4e6Kt4c7Fov5miGUw+kkI9NOemYWZrOZSuVK80TPNvRo20Qnw95C9IkpIiIid7SmTZsyb948Ro0axbhx45g9e/Zl4dOxmHM4neDypx4TZrOJChUqEBwcjMPh+NOX379+EU6OP8Xuje+SY8+kccf+VKzV9LLnzx7bT649i/I1m+QbOl3KYnHBZDZISk3naEzcTQmenE7nDfcg+vOvs7KyrnlfNze3K4Y+pUqVKnQzaw8PDyyWou8fIiIiRaNZ/aosq/csB46d4dPtP/L5Nz+TaEvP62Hn6mK5GEJhwuDi55M9JxdMJsDAw81Ku3vr0aNdU1o2rlksPaPkxih4EhERkTte8+bNmTt3LqNHj+b5559n1qxZeeHTkZPnMLjytiqz2Zz3t6a///INAP5lK1025sKZY/y87ROchpPmXZ+ibOW6f5kn8dzvAJSuUKNANZtNJkwmE0dj4q451uFwXDEIKsyx95c+l52dfc37uru7XzH0CQwMvK7TzfQ31CIidx+TycQ9NSpyT42KDOrbnoMnYjkaE8eRk2c5dDyWtIwscnIdWMxm3N1cqRlSjjpVy1M9JIjaVcpTPqjUtW8iN42CJxEREbkrtGjRgjlz5vDcc88xYcIEZsyYgaurK6fOXcAlnxUx6SkXOLz7cwAcuXaS42JIPHsCs8WFOvd1uWxszK/fAtCgbWi+oRNAdkYqAO7efpc9brfbycnNwel05v0YTgOn00l6hp3NUV+ScGTnVbec2e32a77+P0Ki/HoOlS5d+rpOPlNIJCIiRc3f14uWjWrSslHNm12KFBEFTyIiInLXuP/++5k9ezZjx45lwoQJvPnmm9hzcjHn00Iiw3aB3/Z+AYDJbMHNw5vyNZtQo+lD+AZevvWtdMWaJJz+jUPfbsE/KAS/MhUKVE9Obg7Hjh37y+Mmswmz2YwDV84npBPr4sDT0xNv74t9pwp78pm7u7tCIhEREbkpFDyJiIjIXaVVq1bMnj2bcePG8eKLL+I0QvIdV6ZSLe7r8c8CzVmpbgvKVbuHX75ay7frl3Ffj4H4B11+Yp2b58Wm5VnpKXmPubq4UqNGDQzDyNvSZzKbMP23h1TchRRaNa7JvAlPXs9LFREREbnp9FdfIiIictdp3bo1M2fO5Ouvv+b3E8dxGlfu8VRQVe5pRYO2oeRkZ/HdhuUkx11+8l1AuSoAJJw+etnjrq6uWK1WXFxcLgZPlzQuN4yLTVNFREREblcKnkREROSu9MADDzBjxgySE86SnJxy1QbjBVW5/v00bPcoOfYsvt2wnKS4mLzngqs3xMXqzrnjP5OWFH/VeRyO3Lz/XSbA94brEhEREblZFDyJiIjIXatt27b06dYBu91O7JnYIgmfQuq1oNFDfcnNyea7Df8i6b+n2bm6eVC35SM4Hbns/vRdUhLO/OVaw+nk1KG9/Lw9AuO/q7CqVwq64ZpEREREbhb1eBIREZG7WtcOD7Dp299ISbmAyWTCz9vthuesVOdeTCYzP239iO82vEOL7s8SEFyVyvXvJ9eexaFvN/P1R/MJKF8Vv9IVsLi4kpWeQsLpo2Slp1CpbgvsObm4urhQPaRcEbxKERERkZtDwZOIiIjc1aqHBOHr44271YUL5+PITi+aeSvWbobJbGZf1Gq+2/guLR55hsDy1ajepB1lq9Tj91++IeH0UWIO7sbpyMXNwxu/oIrUr9WTctUaYEvPxN3NleoVteJJREREbl8mw7h2N02bzYafnx8pKSn4+qrPgIiIiNw5DMNg4OR32Hc4Bg9XiD0Ti5+/H8HBwZc1+i5p5xKS6diyAdNH/+2m1SAiIiJyJQXNitTjSURERO5qJpOJXu2bA+Dl6U358uVJSU7h3NlzRdLz6Xpk2XNwsVjo+VDTm3J/ERERkaKi4ElERETueu1b1KNMKR9s6Zn4+flRvnx5kpOTizx8MjCIjY0lKyvrquNsaRlUrlCaFvdUL7J7i4iIiNwMCp5ERETkrufp4UbPh5phz8klN9eBn9/FrXbJycnEnYsrsvuYMGG324mJicFut+c7Jtueg2FAaMd7sVj0VU1ERERub/o2IyIiIgI89khrqlYMIiElFcMw8Pf3Jzg4mKSkJM6dO1dk96lUqRIWFwsnY06Sk5tz2XOGYZCYkk6j2iH0/u/2PxEREZHbmYInEREREcDHy51xTz2Cm6srqekXt8L5+/tTLrgcSUlJxMUVzconi8VCSEgIADExMTgcjrznkmzp+Hi5M/6ZHlhddfiwiIiI3P4UPImIiIj8V4sG1enTsTkZWdlkZV9cjVTKvxTlypUjMTGxyMInVxdXKodUxpHr4NSpUzidTtIzs8l1OHi6T1tqVi5XJPcRERERudkUPImIiIhcYlj/h2nTtDZJtnSy7f8Nn0qVomy5siQmJhIfH18k97FarVQKqUR2djYnY05jS8+k6wONCX+kVZHMLyIiInIrUPAkIiIicgl3NytThvfl/kY1SLSlk5l1sQl4QKkAypYty4ULF4osfPJw9yCwTFkysnPwt2Qy4dkeuFgsRTK3iIiIyK1AwZOIiIjIn/h4uTPzuQG0b1GP1IxMEpJTcRoGAQEBBJUN4sKFC5w/f/6G7uFwOjmfaAOThYfvr0vK0R28PX8ehmEU0asQERERufnUtVJEREQkH54ebkwf3Z810XtZ9nE0cRdS8Pf2JDAgEAwurnoyQZnSZQo1r2EYZGTZsaVnUjbQjxHhnejcuiFrm1XijTfewN/fn4EDBxbTqxIREREpWQqeRERERK7AYjHzaKcWtGhQjVnvfcreA8dJTsvAy92T0mVKk3A+ARMmSpcufc25nE4ntvQsMrPtuLm68HDLBox5sitBAb4A9OnTh+TkZBYtWoS/vz/9+vUr7pcnIiIiUuwUPImIiIhcQ0hwaeZPeII9vxxn4/Yf+er7Qzhwxd3bn7iEJOy5TsqWKY3ZbMq7xuF0km3PJduegz0nFzDh4+VOlzbNeeTBJjSqHYLJZLrsPk899RRJSUnMmjULPz8/OnfuXMKvVERERKRoKXgSERERKQCz2cx9DWtwX8MaxMYnEfXtL/x85BRf7f6J8xeSsec6cXN3B8MAkwmL2YTV1ZXSpXyoV70iDWtV4uGWDShdyueK9zCZTIwePZrk5GReeeUVfHx8aNVKp9yJiIjI7ctkFKCDpc1mw8/Pj5SUFHx9fUuiLhEREZHbgtPpZNa8Raz4aC09e/ehTZsHsLq64OFupVrFIIICfP+ysulacnNzef7559mzZw+LFy+mYcOGxVS9iIiIyPUpaFakU+1EREREboDZbGb8mOEMfjKMLZ+8T2LMAdrfV5+WjWpSNtCv0KETgIuLC2+++SZ16tRh9OjRHD9+vBgqFxERESl+Cp5EREREbpDJZGLIkCH8/e9/Z86cOaxevfqG53Rzc2Pu3LmULVuWYcOGERsbWwSVioiIiJQsBU8iIiIiRcBkMjF8+HCeeOIJZs+ezUcffXTDc/r4+LBgwQKsVivDhw8nMTGxCCoVERERKTkKnkRERESKiMlkYuTIkYSHhzNz5kwiIiJueM7SpUuzaNEi0tLSGDlyJOnp6UVQqYiIiEjJUPAkIiIiUoRMJhNjxoxhwIABTJ8+ncjIyBues2LFiixcuJDTp08zduxY7HZ7EVQqIiIiUvwUPImIiIgUMZPJxHPPPUe/fv2YNm0a69evv+E5a9Wqxdy5c9m/fz+TJk3C4XAUQaUiIiIixUvBk4iIiEgxMJlMPP/884SFhfH666+zcePGG56zSZMmzJgxg+3btzNt2jQMwyiCSkVERESKj8vNLkBERETkTmUymXjhhRdwOp289tprmM1munXrdkNzPvDAA7z66qu8+uqrlCpViuHDhxdRtSIiIiJFT8GTiIiISDEym81MnDgRp9PJ5MmTMZvNdOnS5YbmfOSRR0hJSWHOnDn4+/vz+OOPF1G1IiIiIkVLwZOIiIhIMTObzUyaNAmn08krr7yC2WymU6dONzRneHg4SUlJzJs3D39/f7p3715E1YqIiIgUHQVPIiIiIiXAbDbz8ssv43A4eOmllzCbzXTs2PGG5hw6dCjJyclMmTIFX19fHnzwwSKqVkRERKRoKHgSERERKSFms5nJkydjGAYvvvgiZrOZ9u3bX/d8JpOJiRMnkpKSwoQJE1i4cCFNmzYtwopFREREboxOtRMREREpQX+ETx07dmTixIl8+eWXNzzf1KlTadSoEWPGjOHIkSNFVKmIiIjIjVPwJCIiIlLCLBYLr7/+Og899BATJkzgq6++uqH5rFYrb731FiEhIQwfPpxTp04VUaUiIiIiN0bBk4iIiMhNYLFYmDp1Km3btmX8+PHs2LHjhubz9PTk7bffxtvbm2HDhpGQkFBElYqIiIhcPwVPIiIiIjeJi4sL06ZNo02bNjz//PN88803NzRfqVKlWLRoEbm5uQwfPhybzVZElYqIiIhcHwVPIiIiIjeRi4sL06dPp2XLlowbN45du3bd0HzBwcEsXLiQ+Ph4xowZQ1ZWVhFVKiIiIlJ4Cp5EREREbjJXV1fefPNNWrRowdixY9m9e/cNzVetWjXmz5/P4cOHmTBhArm5uUVUqYiIiEjhKHgSERERuQVYrVZmzpxJ8+bNGT16NHv27Lmh+Ro0aMCsWbP49ttvmTJlCk6ns4gqFRERESk4BU8iIiIitwir1crs2bNp1qwZo0eP5vvvv7+h+Vq2bMmUKVPYvHkz8+bNwzCMIqpUREREpGAUPImIiIjcQv4Inxo3bsyoUaP44Ycfbmi+Tp06MX78eFauXMl7771XRFWKiIiIFIyCJxEREZFbjJubG2+99RYNGjRg1KhR/PTTTzc0X9++fRk0aBCLFy8mMjKyiKoUERERuTYFTyIiIiK3IHd3d+bMmUO9evUYMWIE+/fvv6H5/vGPf9CvXz+mT59OdHR0EVUpIiIicnUKnkRERERuUR4eHsybN4/atWszfPhwfvnll+uey2QyMW7cODp16sRLL710wyfniYiIiBSEgicRERGRW5iHhwfz58+nZs2aDBs2jF9//fW65zKbzUyePJl7772XsWPH3tBcIiIiIgWh4ElERETkFufp6cmCBQuoXr06w4YN4+DBg9c9l6urKzNmzKBmzZqMGDGC33//vegKFREREfkTBU8iIiIit4E/wqfKlSszbNgwDh8+fN1z/bGFLzAwkGHDhhEXF1eElYqIiIj8j4InERERkduEl5cXCxcupGLFigwZMoQjR45c91y+vr4sXLgQs9nMsGHDSE5OLrpCRURERP5LwZOIiIjIbcTb25tFixZRoUIFhgwZwtGjR697rqCgIBYtWkRKSgqjRo0iIyOjCCsVERERUfAkIiIictvx8fFh0aJFlCtXjiFDhnD8+PHrniskJIQFCxZw4sQJnn/+eex2exFWKiIiInc7BU8iIiIityFfX18WL15MmTJlGDx48A2FT3Xq1GHu3Ln8+OOPvPLKKzidziKsVERERO5mCp5EREREblN+fn4sXryYgIAABg8efEMn1DVr1oxp06axdetWZsyYgWEYRVeoiIiI3LUUPImIiIjcxvz9/VmyZAn+/v4MHjyYmJiY656rXbt2TJo0iYiICJYtW1aEVYqIiMjdSsGTiIiIyG2uVKlSLF26FB8fHwYNGnRD4VOvXr0YOXIk77zzDqtXry7CKkVERORupOBJRERE5A4QEBDA0qVL8fLyYvDgwZw+ffq653ryySd54oknmD17Nps3by7CKkVERORuo+BJRERE5A4RGBjI0qVLcXd3Z9CgQZw5c+a65xo5ciQ9evRg8uTJ7Ny5swirFBERkbuJgicRERGRO0jp0qVZunQpVquVQYMGERsbe13zmEwmXnrpJVq3bs348eP56aefirhSERERuRsoeBIRERG5wwQFBbFs2TIsFguDBw/m3Llz1zWPxWJh+vTp1K9fn9GjR3P06NEirlRERETudAqeRERERO5Af4RPAIMGDSIuLu665nFzc2POnDkEBwczfPjw615BJSIiIncnBU8iIiIid6hy5cqxbNkynE4ngwYNIj4+/rrm8fb2ZuHChXh4eDB06FASExOLuFIRERG5Uyl4EhEREbmDBQcHs2zZMnJzcxk8eDDnz5+/rnkCAgJYtGgRWVlZDB8+nLS0tCKuVERERO5ECp5ERERE7nDly5dn2bJlZGVlMXjwYBISEq57noULF3L27Fmee+457HZ7EVcqIiIidxoFTyIiIiJ3gQoVKrBs2TIyMzMZPHjwdW+Xq1GjBvPmzePAgQNMnDgRh8NRxJWKiIjInUTBk4iIiMhdolKlSixdupS0tLQbCp8aNWrEzJkz2bFjB2+88QaGYRRxpSIiInKnUPAkIiIichcJCQlh2bJlpKSkMGTIEJKTk69rntatWzN58mTWr1/PggULirZIERERuWMoeBIRERG5y1SuXJmlS5eSlJTEkCFDSElJua55unbtyrhx4/j3v//Nv//97yKuUkRERO4ECp5ERERE7kJVq1Zl6dKlJCQkMGTIEGw223XN079/f5599lnefvtt1q9fX8RVioiIyO1OwZOIiIjIXapatWosWbKE+Ph4hg4det3h0+DBgwkNDWXq1Kls27ataIsUERGR25qCJxEREZG7WI0aNVi8eDGxsbEMHz6c1NTUQs9hMpmYMGEC7du358UXX+T7778vhkpFRETkdqTgSUREROQuV6tWLZYuXcrp06cZPnw4aWlphZ7DbDYzZcoUGjduzJgxYzh06FAxVCoiIiK3GwVPIiIiIkKtWrVYvHgxMTExjBgxgvT09ELPYbVamT17NlWqVGHEiBHExMQUQ6UiIiJyO1HwJCIiIiIA1KlTh0WLFnHixAlGjBhBRkZGoefw9PTk7bffxs/Pj2HDhhEfH18MlYqIiMjtQsGTiIiIiOSpV68eixYt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maYZh6QAgMbIsGqxxMLv98vr9crn8yk1NbU+cgGN0tSpUzV9+nRJ+1ZCud1ubd++XZKUl5cnt9tdM9bn88myLL377rtq3bq1vl2/XTN+90+t3Vwoy5RSktxK9LiP6LG4aNSUv7JagVBYHpdTl55zikZef6HSUmO7fxQAAGj8wuGw7rvvPn322WeaOXOmzjjjjAPGLF26VJMmTdINN9ygcePG8fg+AJzAatsVUTwBdcA0Tf3xj3/U/PnzVV1draKiIiUmJqqkpEQul0u5ublyOPZ/iWRBQYGuuOIKPfPMMzWfhcIRffzl9/r7+1/q6++3KBAMyzAMuV1OuV0OuZ0OGYYhwzBkWZaipqlgKKJgKKxgOCJDkjclURefdbIG9e+pzm1b8A0hAACotVAopHvvvVcrVqzQ7Nmz1adPnwPGvPbaa3r88cc1cuRI3XbbbXFICQBoCCiegHpSXFysBx98UCtXrtStt96q2267TYMGDdLy5cuVlpam3NzcAx5xq66ult/v10svvaR+/fod9Lrrt+7Se59/p2/Xb9cPW3aqsjqoUDgi07JkyJBkyW63ye1yKj01SV3btVTPzq114RndWOEEAACOWigU0t13360vv/xSs2fP1mmnnXbAmEWLFmnRokWaNGmSrrrqqjikBADEW227IschjwA4rI8++kgPPfSQnE6nFixYoF69eumpp56Sz+dT+/btVVJSctANw0tLS9WlSxf17dv3kNdu36qZ2rdqJkkKR6LaWrhH23eVKBgKK2qacjkdSkrw6KTcpmqakcrKJgAAUCdcLpeefPJJ3XXXXRo7dqzmzZunU089db8xv/3tb1VWVqbHHntMXq9X5513XpzSAgAaOlY84bhnWZZ27/Vr264SBYJhhSNRuZx2JSV41CYnS96UxCO+ZjAY1OzZs/Xaa6+pX79+euCBB+RyuTRhwgT9+9//1vjx49W7d29dd9112rJli3JycmqKoUgkoqKiIk2fPl233nprXd8uAABAnQgGgxo3bpxWr16tefPmqWfPnvsdN01T999/v95//33NnTv3oCujAADHLx61wwmtqMSn9z77Tt9tLNB3Gwq011ehYCgiy7JkWZYMw5DNtm/vpOZN0tStfUt175Cn8/p0VUqS52evvX79ek2aNEkFQj03lwAAN9xJREFUBQW68847dc0112j37t0aO3asduzYoccff7xmM86vv/5aN910k8rKytSsWTMZhqGSkhIlJyfr448/VlpaWj38aQAAABydQCCgcePG6dtvv9X8+fN1yimn7Hc8HA7rzjvv1KpVq7Rw4UJ16dIlTkkBAPWN4gknHNM09fXarfrHh1/pw5VrVVkVkCXJ7XTI7XLK5XTIZjNkyJAlS9HofzfmDocViUQlSRneZA085xQN7Nez5jG3H1mWpVdffVVz5sxRXl6epk2bprZt2+r777/X2LFj5XA4NGfOHJ100kn7nffWW29p1KhRMk1TmZmZ2rFjh4YNG6YpU6bU058MAADA0auurtbYsWO1du1azZ8/XyeffPIBx0eMGKHt27frueeeU+vWreMTFABQryiecELZvqtET77wpr5Ys0nhSEQJHpdSEj0HbOr9cyLRqPwV1QqGI0pwuzSoXw8N/38XyJuSqNLSUk2dOlWffPKJrr/+eo0ZM0Yul0vLli3TxIkT1bZtW82aNUuZmZkHvfYzzzyjhx9+WKZpyuPx6M0331Tnzp3r6vYBAABiqrq6WmPGjNG6dev09NNPq1u3bvsd9/v9uv3221VZWanf/e53atq0aZySAgDqC8UTTgimaepv763UotfeV0lZhdJSEuVxO49po23LslReFVBlVVCtWjTRpX1a67Xf5ysajWrKlCnq27evLMvSn/70J82aNUsDBgzQQw89JI/n0I/oWZalyZMna/Hixbrgggv0xz/+8ajzAQAAxENVVZVGjx6tDRs2KD8//4DH6oqLizV48GB5PB4999xz8nq9cUoKAKgPFE847lVWBzX16b/oo5Xfy2YYyvAmy2aruze7hSNRbSssUqCqUu2buvTinAfUtGmWotGonnzySb322mu65ZZbNGrUqFqtrAqFQnriiSc0cODAA94MAwAA0BhUVVVp1KhR2rx5s/Lz89WpU6f9jm/btk2DBw9WixYtlJ+fr8TEI3+JCwCgcaB4wnGtvDKg8bP+rM/XbFBacqISPK46vX4oFFLBjgIFgkGlpmXI6fTo6gtO04jrBmjy5En67LPPNGHCBF111VV1Oi8AAEBDV1lZqZEjR2rbtm3Kz89Xx44d9zu+du1aDR06VCeffLJmzZolp9MZp6QAgFiieMJxqzoQ0vhZf9byr39QhjdJblfdfjNTVlamXbt2yel0KicnRx6PRxVVAfkrq+QJFMnu26AZ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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# use pooch to download robustly from a url\n", + "url = \"https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz\"\n", + "file_path = pooch.retrieve(\n", + " url=url,\n", + " known_hash=\"md5:39ee257f7eeb94cb60e6177cf80c9544\",\n", + ")\n", + "\n", + "df = pd.read_csv(file_path, delimiter=\" \")\n", + "\n", + "# the ground-truth dag is shown here: XXX: comment in when errors are fixed\n", + "ground_truth_dag = bnlearn.import_DAG(\"sachs\", verbose=False)\n", + "fig = bnlearn.plot(ground_truth_dag)\n", + "\n", + "# .. note::\n", + "# The Sachs dataset has previously been preprocessed, and the steps are described\n", + "# in bnlearn, at the web-page https://www.bnlearn.com/research/sachs05/.\n", + "print(df.head())\n", + "print(df.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7a908aeb-d993-454e-80a8-144aadf90923", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OutEdgeView([('Erk', 'Akt'), ('PKA', 'Akt'), ('PKA', 'Erk'), ('PKA', 'Jnk'), ('PKA', 'Mek'), ('PKA', 'P38'), ('PKA', 'Raf'), ('Mek', 'Erk'), ('PKC', 'Jnk'), ('PKC', 'Mek'), ('PKC', 'P38'), ('PKC', 'PKA'), ('PKC', 'Raf'), ('Raf', 'Mek'), ('PIP3', 'PIP2'), ('Plcg', 'PIP2'), ('Plcg', 'PIP3')])\n" + ] + } + ], + "source": [ + "pprint(ground_truth_dag['model'].to_directed().edges)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1aa43d9a-a88d-459b-9b32-388f794885c0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6 6\n" + ] + } + ], + "source": [ + "# %%\n", + "# Preprocess the dataset\n", + "# ----------------------\n", + "# Since the data is one dataframe, we need to process it into a form\n", + "# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We\n", + "# will form a list of separate dataframes.\n", + "unique_ints = df[\"INT\"].unique()\n", + "\n", + "# get the list of intervention targets and list of dataframe associated with each intervention\n", + "intervention_targets = [df.columns[idx] for idx in unique_ints]\n", + "data_cols = [col for col in df.columns if col != \"INT\"]\n", + "data = []\n", + "for interv_idx in unique_ints:\n", + " _data = df[df[\"INT\"] == interv_idx][data_cols]\n", + " data.append(_data)\n", + "\n", + "print(len(data), len(intervention_targets))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e75376cb-d467-47fd-92bd-84ef21a35f4f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Graph with 26 nodes and 325 edges\n", + "[('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n" + ] + } + ], + "source": [ + "# Our dataset is comprised of discrete valued data, so we will utilize the\n", + "# G^2 (Chi-square) CI test.\n", + "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "# Since our data is entirely discrete, we can also use the G^2 test as our\n", + "# CD test.\n", + "cd_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "alpha = 0.05\n", + "learner = PsiFCI(\n", + " ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha\n", + ")\n", + "\n", + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = (\n", + " ctx_builder.variables(data=data[0])\n", + " # .intervention_targets(intervention_targets)\n", + " .num_distributions(6)\n", + " .obs_distribution(False)\n", + " .build()\n", + ")\n", + "\n", + "print(ctx.init_graph)\n", + "print(ctx.f_nodes)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3d6ac82a-6a5c-4c46-b8c1-7cd09101c5f8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1800 is too small. Need 1920.\n", + "Not enough samples. 1800 is too small. Need 1920.\n", + "Not enough samples. 1800 is too small. Need 1920.\n", + "Not enough samples. 1800 is too small. Need 1920.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1280.\n" + ] + } + ], + "source": [ + "# `fit` design. All fitted attributes contain an underscore at the end.\n", + "learner = learner.fit(data, ctx)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "7c25044c-99f7-4255-87f7-9a5d845b77e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 47 edges in the resulting PAG\n" + ] + } + ], + "source": [ + "# %%\n", + "# Analyze the results\n", + "# ===================\n", + "# Now that we have learned the graph, we will show it here. Note differences and similarities\n", + "# to the ground-truth DAG that is \"assumed\". Moreover, note that this reproduces Supplementary\n", + "# Figure 8 in :footcite:`Jaber2020causal`.\n", + "est_pag = learner.graph_\n", + "\n", + "print(f\"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "9f3e89fb-9ef6-4ad8-8198-164ba3032dd5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "PKC->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "Plcg->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf\n", + "\n", + "Raf\n", + "\n", + "\n", + "\n", + "Mek\n", + "\n", + "Mek\n", + "\n", + "\n", + "\n", + "Raf->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "Akt->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)\n", + "\n", + "('F', 4)\n", + "\n", + "\n", + "\n", + "('F', 4)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 10)\n", + "\n", + "('F', 10)\n", + "\n", + "\n", + "\n", + "('F', 10)->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 10)->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 10)->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 9)\n", + "\n", + "('F', 9)\n", + "\n", + "\n", + "\n", + "('F', 9)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 9)->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 9)->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)\n", + "\n", + "('F', 5)\n", + "\n", + "\n", + "\n", + "('F', 5)->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 11)\n", + "\n", + "('F', 11)\n", + "\n", + "\n", + "\n", + "('F', 11)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 11)->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", + "\n", + "\n", + "\n", + "('F', 1)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)\n", + "\n", + "('F', 13)\n", + "\n", + "\n", + "\n", + "('F', 13)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)\n", + "\n", + "('F', 3)\n", + "\n", + "\n", + "\n", + "('F', 3)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 6)\n", + "\n", + "('F', 6)\n", + "\n", + "\n", + "\n", + "('F', 6)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 12)\n", + "\n", + "('F', 12)\n", + "\n", + "\n", + "\n", + "('F', 12)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 12)->Plcg\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 12)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 12)->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)\n", + "\n", + "('F', 2)\n", + "\n", + "\n", + "\n", + "('F', 2)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)\n", + "\n", + "('F', 14)\n", + "\n", + "\n", + "\n", + "('F', 14)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 8)\n", + "\n", + "('F', 8)\n", + "\n", + "\n", + "\n", + "('F', 8)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 8)->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 7)\n", + "\n", + "('F', 7)\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "dot_graph = draw(est_pag, direction=\"TD\")\n", + "dot_graph\n", + "# dot_graph.render(outfile=\"psi_pag_full.png\", view=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "afb1ce35-7715-417c-aa77-eccd5ebf8280", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Plcg', 'PIP3', ('F', 10), ('F', 5)]\n" + ] + } + ], + "source": [ + "print(list(est_pag.neighbors('PIP2')))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "64b61853-3c5e-4cd4-bb9b-5b4e79a9e292", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1, 2)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ctx = learner.context_\n", + "\n", + "# get the distribution indices that are associated with the F-node\n", + "ctx.sigma_map[('F', 5)]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "c12c86b9-d6e5-417e-88ec-9b203100500a", + "metadata": {}, + "outputs": [], + "source": [ + "# get the distributions across the two distributions\n", + "data_i = data[1].copy()\n", + "data_j = data[2].copy()\n", + "\n", + "# name the group column the F-node, so Oracle works as expected\n", + "data_i[('F', 5)] = 1\n", + "data_j[('F', 5)] = 0\n", + "sub_df = pd.concat((data_i, data_j), axis=0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "841a883d-816e-4927-83e6-20a109fc3cc4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "inf\n", + "inf\n" + ] + } + ], + "source": [ + "print(learner.min_cond_set_size)\n", + "print(learner.max_cond_set_size)\n", + "print(learner.max_combinations)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6a0a1fb5-9938-40e2-a017-15800d8edc17", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "() 6.435791889158532e-18\n", + "('Plcg',) 6.593184879001655e-20\n", + "('Akt',) 1.200266118509522e-11\n", + "('PKC',) 8.024753178107371e-14\n", + "('Jnk',) 2.585768066145771e-11\n", + "('Erk',) 3.900071970577842e-13\n", + "('P38',) 3.299503701434742e-14\n", + "('PIP3',) 7.083138871715661e-05\n", + "('PKA',) 2.1393776567798484e-13\n", + "('Mek',) 3.693790590305435e-13\n", + "('Raf',) 4.606407772216647e-14\n", + "('Plcg', 'Akt') 8.460800997783422e-08\n", + "('Plcg', 'PKC') 8.990500531927801e-12\n", + "('Plcg', 'Jnk') 3.3857765002483844e-08\n", + "('Plcg', 'Erk') 6.590268332067125e-10\n", + "('Plcg', 'P38') 1.5225223700046747e-12\n", + "('Plcg', 'PIP3') 0.007261132771613868\n", + "('Plcg', 'PKA') 3.212849565105484e-10\n", + "('Plcg', 'Mek') 1.2833709367530019e-10\n", + "('Plcg', 'Raf') 1.4163604686420524e-10\n", + "('Akt', 'PKC') 9.873846189581637e-05\n", + "('Akt', 'Jnk') 0.0031219677903327\n", + "('Akt', 'Erk') 0.01369622199818355\n", + "('Akt', 'P38') 6.063070345314021e-05\n", + "('Akt', 'PIP3') 0.9024296015533677\n", + "('Akt', 'PKA') 0.0017714845018109568\n", + "('Akt', 'Mek') 0.003528741899265669\n", + "('Akt', 'Raf') 0.0008991224821112011\n", + "('PKC', 'Jnk') 9.33977408762107e-07\n", + "('PKC', 'Erk') 8.515213761827435e-06\n", + "('PKC', 'P38') 2.246388723926839e-07\n", + "('PKC', 'PIP3') 0.34768142211165515\n", + "('PKC', 'PKA') 6.332152314280369e-06\n", + "('PKC', 'Mek') 9.5098537319553e-06\n", + "('PKC', 'Raf') 1.2688094863821566e-06\n", + "('Jnk', 'Erk') 0.0001566261707614548\n", + "('Jnk', 'P38') 1.5862931844717754e-05\n", + "('Jnk', 'PIP3') 0.38466781469475697\n", + "('Jnk', 'PKA') 0.00021305054793702892\n", + "('Jnk', 'Mek') 0.00036729818160982603\n", + "('Jnk', 'Raf') 0.00013375039556901973\n", + "('Erk', 'P38') 3.025389145329581e-06\n", + "('Erk', 'PIP3') 0.571452260105889\n", + "('Erk', 'PKA') 0.0004884821515207358\n", + "('Erk', 'Mek') 0.0001085690456512515\n", + "('Erk', 'Raf') 7.50123313213848e-05\n", + "('P38', 'PIP3') 0.3624403399481475\n", + "('P38', 'PKA') 3.613841666449476e-06\n", + "('P38', 'Mek') 3.380684744791879e-06\n", + "('P38', 'Raf') 1.4059792077888952e-06\n", + "('PIP3', 'PKA') 0.5191109355735917\n", + "('PIP3', 'Mek') 0.652887562766674\n", + "('PIP3', 'Raf') 0.08503255960096978\n", + "('PKA', 'Mek') 3.275626021425967e-05\n", + "('PKA', 'Raf') 7.463914552917212e-05\n", + "('Mek', 'Raf') 0.00011080182503373675\n", + "('Plcg', 'Akt', 'PKC') 0.7891422366155535\n", + "('Plcg', 'Akt', 'Jnk') 0.9859814485468757\n", + "('Plcg', 'Akt', 'Erk') 0.9998631601456061\n", + "('Plcg', 'Akt', 'P38') 0.6491208080745487\n", + "('Plcg', 'Akt', 'PIP3') 0.9999999999998938\n", + "('Plcg', 'Akt', 'PKA') 0.9954496653208057\n", + "('Plcg', 'Akt', 'Mek') 0.9908709305733735\n", + "('Plcg', 'Akt', 'Raf') 0.9903519248786904\n", + "('Plcg', 'PKC', 'Jnk') 0.272016946202727\n", + "('Plcg', 'PKC', 'Erk') 0.34285852384885324\n", + "('Plcg', 'PKC', 'P38') 0.0178491632841892\n", + "('Plcg', 'PKC', 'PIP3') 0.9999776236130891\n", + "('Plcg', 'PKC', 'PKA') 0.24366692852731484\n", + "('Plcg', 'PKC', 'Mek') 0.2962573810055808\n", + "('Plcg', 'PKC', 'Raf') 0.2547341290948196\n", + "('Plcg', 'Jnk', 'Erk') 0.8750866000635122\n", + "('Plcg', 'Jnk', 'P38') 0.19238205860774288\n", + "('Plcg', 'Jnk', 'PIP3') 0.9999996689409033\n", + "('Plcg', 'Jnk', 'PKA') 0.8665894965460248\n", + "('Plcg', 'Jnk', 'Mek') 0.7819450525990416\n", + "('Plcg', 'Jnk', 'Raf') 0.8022937030878551\n", + "('Plcg', 'Erk', 'P38') 0.2746627826687863\n", + "('Plcg', 'Erk', 'PIP3') 0.9999999992414166\n", + "('Plcg', 'Erk', 'PKA') 0.9720017267019727\n", + "('Plcg', 'Erk', 'Mek') 0.8611375671390413\n", + "('Plcg', 'Erk', 'Raf') 0.914660041195928\n", + "('Plcg', 'P38', 'PIP3') 0.9999579261799895\n", + "('Plcg', 'P38', 'PKA') 0.24945969813307475\n", + "('Plcg', 'P38', 'Mek') 0.22021175370330875\n", + "('Plcg', 'P38', 'Raf') 0.26535481578322995\n", + "('Plcg', 'PIP3', 'PKA') 0.9999999947814776\n", + "('Plcg', 'PIP3', 'Mek') 0.9999999964268261\n", + "('Plcg', 'PIP3', 'Raf') 0.9999989292834803\n", + "('Plcg', 'PKA', 'Mek') 0.7872515434872753\n", + "('Plcg', 'PKA', 'Raf') 0.905685514521774\n", + "('Plcg', 'Mek', 'Raf') 0.8282818367662137\n", + "('Akt', 'PKC', 'Jnk') 0.9971393969975411\n", + "('Akt', 'PKC', 'Erk') 0.9999999458872947\n", + "('Akt', 'PKC', 'P38') 0.9893596174396212\n", + "('Akt', 'PKC', 'PIP3') 1.0\n", + "('Akt', 'PKC', 'PKA') 0.9999954872688738\n", + "('Akt', 'PKC', 'Mek') 0.9999986563760157\n", + "('Akt', 'PKC', 'Raf') 0.999971160867838\n", + "('Akt', 'Jnk', 'Erk') 0.999999993828627\n", + "('Akt', 'Jnk', 'P38') 0.9997396896479096\n", + "('Akt', 'Jnk', 'PIP3') 1.0\n", + "('Akt', 'Jnk', 'PKA') 0.9999999822575754\n", + "('Akt', 'Jnk', 'Mek') 0.9999999979889044\n", + "('Akt', 'Jnk', 'Raf') 0.999999981982114\n", + "('Akt', 'Erk', 'P38') 0.999999700454769\n", + "('Akt', 'Erk', 'PIP3') 1.0\n", + "('Akt', 'Erk', 'PKA') 0.9999999999999994\n", + "('Akt', 'Erk', 'Mek') 0.9999999999998971\n", + "('Akt', 'Erk', 'Raf') 0.999999999999427\n", + "('Akt', 'P38', 'PIP3') 1.0\n", + "('Akt', 'P38', 'PKA') 0.9999908229412479\n", + "('Akt', 'P38', 'Mek') 0.9999947787202634\n", + "('Akt', 'P38', 'Raf') 0.9999754637345232\n", + "('Akt', 'PIP3', 'PKA') 1.0\n", + "('Akt', 'PIP3', 'Mek') 1.0\n", + "('Akt', 'PIP3', 'Raf') 1.0\n", + "('Akt', 'PKA', 'Mek') 0.9999999999274537\n", + "('Akt', 'PKA', 'Raf') 0.9999999999881026\n", + "('Akt', 'Mek', 'Raf') 0.9999999999983371\n", + "('PKC', 'Jnk', 'Erk') 0.9651475133088108\n", + "('PKC', 'Jnk', 'P38') 0.5427124506088234\n", + "('PKC', 'Jnk', 'PIP3') 0.9999990051613937\n", + "('PKC', 'Jnk', 'PKA') 0.9675608555729773\n", + "('PKC', 'Jnk', 'Mek') 0.9769118017786198\n", + "('PKC', 'Jnk', 'Raf') 0.9278947746043861\n", + "('PKC', 'Erk', 'P38') 0.9148685242905765\n", + "('PKC', 'Erk', 'PIP3') 0.9999999999999999\n", + "('PKC', 'Erk', 'PKA') 0.9998858065715381\n", + "('PKC', 'Erk', 'Mek') 0.9995801816450322\n", + "('PKC', 'Erk', 'Raf') 0.9989918666456864\n", + "('PKC', 'P38', 'PIP3') 0.9999999999828385\n", + "('PKC', 'P38', 'PKA') 0.935827568587764\n", + "('PKC', 'P38', 'Mek') 0.9376631156192213\n", + "('PKC', 'P38', 'Raf') 0.891353553265502\n", + "('PKC', 'PIP3', 'PKA') 0.9999999999999962\n", + "('PKC', 'PIP3', 'Mek') 1.0\n", + "('PKC', 'PIP3', 'Raf') 0.9999999994789294\n", + "('PKC', 'PKA', 'Mek') 0.9981343131288912\n", + "('PKC', 'PKA', 'Raf') 0.9990695979081108\n", + "('PKC', 'Mek', 'Raf') 0.9997591440996322\n", + "('Jnk', 'Erk', 'P38') 0.9863194883217228\n", + "('Jnk', 'Erk', 'PIP3') 0.9999999999999992\n", + "('Jnk', 'Erk', 'PKA') 0.9999982941423281\n", + "('Jnk', 'Erk', 'Mek') 0.9999863603496597\n", + "('Jnk', 'Erk', 'Raf') 0.999978853319258\n", + "('Jnk', 'P38', 'PIP3') 0.9999999999923149\n", + "('Jnk', 'P38', 'PKA') 0.9958478989453659\n", + "('Jnk', 'P38', 'Mek') 0.9919983175172655\n", + "('Jnk', 'P38', 'Raf') 0.9880507060776124\n", + "('Jnk', 'PIP3', 'PKA') 1.0\n", + "('Jnk', 'PIP3', 'Mek') 1.0\n", + "('Jnk', 'PIP3', 'Raf') 0.9999999999998467\n", + "('Jnk', 'PKA', 'Mek') 0.9999850493880029\n", + "('Jnk', 'PKA', 'Raf') 0.9999931221643621\n", + "('Jnk', 'Mek', 'Raf') 0.9999980460494133\n", + "('Erk', 'P38', 'PIP3') 0.9999999999999999\n", + "('Erk', 'P38', 'PKA') 0.9998825118150718\n", + "('Erk', 'P38', 'Mek') 0.9987854820233211\n", + "('Erk', 'P38', 'Raf') 0.998993464768293\n", + "('Erk', 'PIP3', 'PKA') 1.0\n", + "('Erk', 'PIP3', 'Mek') 1.0\n", + "('Erk', 'PIP3', 'Raf') 1.0\n", + "('Erk', 'PKA', 'Mek') 0.9999999999490085\n", + "('Erk', 'PKA', 'Raf') 0.9999999998053\n", + "('Erk', 'Mek', 'Raf') 0.9999997290186001\n", + "('P38', 'PIP3', 'PKA') 0.9999999999999999\n", + "('P38', 'PIP3', 'Mek') 1.0\n", + "('P38', 'PIP3', 'Raf') 0.9999999999526511\n", + "('P38', 'PKA', 'Mek') 0.9984454305569591\n", + "('P38', 'PKA', 'Raf') 0.9995944645718454\n", + "('P38', 'Mek', 'Raf') 0.9994200382853249\n", + "('PIP3', 'PKA', 'Mek') 1.0\n", + "('PIP3', 'PKA', 'Raf') 1.0\n", + "('PIP3', 'Mek', 'Raf') 1.0\n", + "('PKA', 'Mek', 'Raf') 0.9999999489322792\n" + ] + }, + { + "ename": "RuntimeError", + "evalue": "Not enough samples. 2400 is too small. Need 3240.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_2117/627510932.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_non_f_nodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msep_set\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcombinations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnon_f_nodes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mstat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlearner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msub_df\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'F'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'PIP2'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msep_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msep_set\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mevaluate_edge\u001b[0;34m(self, data, X, Y, Z)\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 257\u001b[0;31m \u001b[0mtest_stat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mci_estimator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mY\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 258\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtest_stat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/ci/g_test.py\u001b[0m in \u001b[0;36mtest\u001b[0;34m(self, df, x_vars, y_vars, z_covariates)\u001b[0m\n\u001b[1;32m 459\u001b[0m \u001b[0mstat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg_square_binary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mz_covariates\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 460\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata_type\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"discrete\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 461\u001b[0;31m \u001b[0mstat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg_square_discrete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mz_covariates\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevels\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 462\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 463\u001b[0m raise ValueError(\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/ci/g_test.py\u001b[0m in \u001b[0;36mg_square_discrete\u001b[0;34m(data, x, y, sep_set, levels)\u001b[0m\n\u001b[1;32m 352\u001b[0m \u001b[0mn_samples_req\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mdof\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn_samples\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mn_samples_req\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 354\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Not enough samples. {n_samples} is too small. Need {n_samples_req}.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 355\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 356\u001b[0m \u001b[0mcontingency_tble\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mRuntimeError\u001b[0m: Not enough samples. 2400 is too small. Need 3240." + ] + } + ], + "source": [ + "non_f_nodes = ctx.get_non_f_nodes()\n", + "non_f_nodes.remove('PIP2')\n", + "\n", + "for p in range(len(ctx.get_non_f_nodes())):\n", + " for sep_set in combinations(non_f_nodes, p):\n", + " stat, pvalue = learner.evaluate_edge(sub_df, ('F', 5), 'PIP2', set(sep_set))\n", + " \n", + " print(sep_set, pvalue)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "daae0d6c-65cd-43aa-b8b2-b0a3b7b83c53", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[7 4]\n", + "['PKA' 'PIP3']\n" + ] + } + ], + "source": [ + "# the intervention target indices\n", + "print(unique_ints[[2, 4]])\n", + "\n", + "print(np.array(intervention_targets)[[2, 4]])\n", + "# print(intervention_targets[7], intervention_targets[4])" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "c4668302-9da7-411f-9605-bffd863d06a5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('F', 6), ('F', 12), ('F', 9), 'Raf', ('F', 5), ('F', 2), ('F', 8), ('F', 14), ('F', 11), ('F', 1), ('F', 0), ('F', 13), ('F', 3)]\n" + ] + } + ], + "source": [ + "print(list(est_pag.neighbors('Mek')))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "321acf1c-0519-4f92-9a8f-f7f6b6333da8", + "metadata": {}, + "outputs": [], + "source": [ + "for f_node in est_pag.f_nodes:\n", + " print(f_node)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "d27c0dab-a6bf-48cf-90b7-f1298ca89b12", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{}\n" + ] + } + ], + "source": [ + "print(ctx.state_variables)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "b6e4aa12-a6f6-4afd-b810-02a852fdb623", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'obs_skel_graph'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_2117/2603007690.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mobs_graph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate_variables\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'obs_skel_graph'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'obs_skel_graph'" + ] + } + ], + "source": [ + "obs_graph = ctx.state_variables['obs_skel_graph']" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b9daa53d-0216-4443-aa31-fbbdf8c19b4a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "PKC->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "Plcg->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf\n", + "\n", + "Raf\n", + "\n", + "\n", + "\n", + "Mek\n", + "\n", + "Mek\n", + "\n", + "\n", + "\n", + "Raf->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "Akt->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# %%\n", + "# Visualize the graph without the F-nodes\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes())\n", + "dot_graph = draw(est_pag_no_fnodes, direction=\"LR\")\n", + "dot_graph\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63f8ce08-1a2f-4e70-8b47-2172e78126e6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pywhy-discover", + "language": "python", + "name": "pywhy-discover" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index 7c11e94a5..fdf617b76 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -7,7 +7,7 @@ import pandas as pd from dodiscover.ci.base import BaseConditionalIndependenceTest -from dodiscover.constraint.skeleton import ConditioningSetSelection, LearnSkeleton +from dodiscover.constraint.skeleton import ConditioningSetSelection from dodiscover.context import Context from dodiscover.typing import Column, SeparatingSet @@ -24,7 +24,10 @@ class BaseConstraintDiscovery: ci_estimator : BaseConditionalIndependenceTest The conditional independence test function. The arguments of the estimator should be data, node, node to compare, conditioning set of nodes, and any additional - keyword arguments. + keyword arguments. It must implement the ``test`` function which accepts the data, + a set of X nodes, a set of Y nodes and an optional set of Z nodes, which returns a + ordered tuple of test statistic and pvalue associated with the null hypothesis + :math:`X \\perp Y | Z`. alpha : float, optional The significance level for the conditional independence test, by default 0.05. min_cond_set_size : int, optional @@ -36,8 +39,9 @@ class BaseConstraintDiscovery: max_combinations : int, optional Maximum number of tries with a conditioning set chosen from the set of possible parents still, by default None. If None, then will not be used. If set, then - the conditioning set will be chosen lexographically based on the sorted - test statistic values of 'ith Pa(X) -> X', for each possible parent node of 'X'. + only ``max_combinations`` of conditioning sets will be chosen at each iteration + of the algorithm. One can also set ``keep_sorted`` to make sure to choose the most + "dependent" variables in the conditioning set. condsel_method : ConditioningSetSelection The method to use for selecting the conditioning sets. Must be one of ('neighbors', 'complete', 'neighbors_path'). See Notes for more details. @@ -45,6 +49,14 @@ class BaseConstraintDiscovery: Whether or not to apply orientation rules given the learned skeleton graph and separating set per pair of variables. If ``True`` (default), will apply orientation rules for specific algorithm. + keep_sorted : bool + Whether or not to keep the considered conditioning set variables in sorted + dependency order. If True (default) will sort the existing dependencies of each variable + by its dependencies from strongest to weakest (i.e. largest CI test statistic value + to lowest). The conditioning set is chosen lexographically + based on the sorted test statistic values of 'ith Pa(X) -> X', for each possible + parent node of 'X'. This can be used in conjunction with ``max_combinations`` parameter + to only test the "strongest" dependences. Attributes ---------- @@ -54,6 +66,24 @@ class BaseConstraintDiscovery: The dictionary of separating sets, where it is a nested dictionary from the variable name to the variable it is being compared to the set of variables in the graph that separate the two. + + Notes + ----- + The design of constraint-based causal discovery algorithms proceeds at a high level + in two stages: + + 1. skeleton discovery + 2. orientation of edges + + The skeleton discovery stage is passed off to a dedicated class used for learning + Bayesian networks with conditional testing. All skeleton discovery methods return an + undirected networkx :class:`networkx.Graph` and a `SeparatingSet` data structure. + + The orientation of edges proceeds typically by: + + - converting the skeleton graph to a relevant `EquivalenceClass` + - orienting unshielded triples into colliders + - orienting edges """ graph_: Optional[EquivalenceClass] @@ -68,6 +98,7 @@ def __init__( max_combinations: Optional[int] = None, condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, + keep_sorted: bool = False, ): self.alpha = alpha self.ci_estimator = ci_estimator @@ -84,6 +115,7 @@ def __init__( if max_combinations is None: max_combinations = np.inf self.max_combinations = max_combinations + self.keep_sorted = keep_sorted # initialize the result properties we want to fit self.separating_sets_ = defaultdict(lambda: defaultdict(list)) @@ -115,9 +147,35 @@ def orient_unshielded_triples( graph: EquivalenceClass, sep_set: SeparatingSet, ) -> None: + """Orient unshielded triples in a graph. + + Parameters + ---------- + graph : EquivalenceClass + Causal graph + sep_set : SeparatingSet + Separating sets among all possible variables (I.e. a hash map of hash maps). + + Raises + ------ + NotImplementedError + All constraint-based discovery algorithms must implement this. + """ raise NotImplementedError() def orient_edges(self, graph: EquivalenceClass) -> None: + """Apply orientations to edges using logical rules. + + Parameters + ---------- + graph : EquivalenceClass + Causal graph. + + Raises + ------ + NotImplementedError + All constraint-based discovery algorithms must implement this. + """ raise NotImplementedError( "All constraint discovery algorithms need to implement a function to orient the " "skeleton graph given a separating set." @@ -205,10 +263,9 @@ def learn_skeleton( context: Context, sep_set: Optional[SeparatingSet] = None, ) -> Tuple[nx.Graph, SeparatingSet]: - """Learns the skeleton of a causal DAG using pairwise independence testing. + """Learns the skeleton of a causal DAG using pairwise (conditional) independence testing. - Encodes the skeleton via an undirected graph, `networkx.Graph`. Only - tests with adjacent nodes in the conditioning set. + Encodes the skeleton via an undirected graph, `networkx.Graph`. Parameters ---------- @@ -226,35 +283,13 @@ def learn_skeleton( sep_set : dict of dict of list of set The separating set per pairs of variables. - Raises - ------ - ValueError - If the nodes in the initialization graph do not match the variable - names in passed in data, ``X``. - ValueError - If the nodes in the fixed-edge graph do not match the variable - names in passed in data, ``X``. - Notes ----- Learning the skeleton of a causal DAG uses (conditional) independence testing to determine which variables are (in)dependent. This specific algorithm compares exhaustively pairs of adjacent variables. """ - skel_alg = LearnSkeleton( - self.ci_estimator, - sep_set=sep_set, - alpha=self.alpha, - min_cond_set_size=self.min_cond_set_size, - max_cond_set_size=self.max_cond_set_size, - max_combinations=self.max_combinations, - condsel_method=self.condsel_method, - keep_sorted=False, + raise NotImplementedError( + "All constraint discovery algorithms need to implement a function to orient the " + "skeleton graph given a separating set." ) - skel_alg.fit(data, context) - - skel_graph = skel_alg.adj_graph_ - sep_set = skel_alg.sep_set_ - self.n_ci_tests += skel_alg.n_ci_tests - - return skel_graph, sep_set diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index f926c3b34..78221e207 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -56,6 +56,14 @@ class FCI(BaseConstraintDiscovery): and separating set per pair of variables. If ``True`` (default), will apply Zhang's orientation rules R0-10, orienting colliders and certain arrowheads and tails :footcite:`Zhang2008`. + keep_sorted : bool + Whether or not to keep the considered conditioning set variables in sorted + dependency order. If True (default) will sort the existing dependencies of each variable + by its dependencies from strongest to weakest (i.e. largest CI test statistic value + to lowest). The conditioning set is chosen lexographically + based on the sorted test statistic values of 'ith Pa(X) -> X', for each possible + parent node of 'X'. This can be used in conjunction with ``max_combinations`` parameter + to only test the "strongest" dependences. max_iter : int The maximum number of iterations through the graph to apply orientation rules. @@ -91,6 +99,7 @@ def __init__( max_combinations: Optional[int] = None, condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, + keep_sorted: bool = False, max_iter: int = 1000, max_path_length: Optional[int] = None, selection_bias: bool = True, @@ -103,9 +112,10 @@ def __init__( max_cond_set_size=max_cond_set_size, max_combinations=max_combinations, condsel_method=condsel_method, + keep_sorted=keep_sorted, + apply_orientations=apply_orientations, ) self.max_iter = max_iter - self.apply_orientations = apply_orientations self.max_path_length = max_path_length self.selection_bias = selection_bias self.pds_condsel_method = pds_condsel_method @@ -821,7 +831,7 @@ def learn_skeleton( max_combinations=self.max_combinations, condsel_method=self.condsel_method, second_stage_condsel_method=self.pds_condsel_method, - keep_sorted=False, + keep_sorted=self.keep_sorted, max_path_length=self.max_path_length, ) skel_alg.fit(data, context) diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index e06aa0802..cf66f244c 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -67,6 +67,14 @@ class PsiFCI(FCI): and separating set per pair of variables. If ``True`` (default), will apply Zhang's orientation rules R0-10, orienting colliders and certain arrowheads and tails :footcite:`Zhang2008`. + keep_sorted : bool + Whether or not to keep the considered conditioning set variables in sorted + dependency order. If True (default) will sort the existing dependencies of each variable + by its dependencies from strongest to weakest (i.e. largest CI test statistic value + to lowest). The conditioning set is chosen lexographically + based on the sorted test statistic values of 'ith Pa(X) -> X', for each possible + parent node of 'X'. This can be used in conjunction with ``max_combinations`` parameter + to only test the "strongest" dependences. max_iter : int The maximum number of iterations through the graph to apply orientation rules. @@ -94,6 +102,7 @@ def __init__( max_combinations: Optional[int] = None, condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, + keep_sorted: bool = False, max_iter: int = 1000, max_path_length: Optional[int] = None, pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, @@ -107,6 +116,7 @@ def __init__( max_combinations, condsel_method, apply_orientations, + keep_sorted=keep_sorted, max_iter=max_iter, max_path_length=max_path_length, selection_bias=False, @@ -342,4 +352,9 @@ def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: pag = pgraph.IPAG(incoming_circle_edges=graph, name="IPAG derived with I-FCI") else: pag = pgraph.PsiPAG(incoming_circle_edges=graph, name="PsiPAG derived with Psi-FCI") + + # XXX: assign targets as well + # assign f-nodes + for f_node in self.context_.f_nodes: + pag.set_f_node(f_node) return pag diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index 9468eaf2d..0af030357 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -1,8 +1,9 @@ import logging from itertools import combinations -from typing import Optional +from typing import Optional, Tuple import networkx as nx +import pandas as pd from dodiscover.ci.base import BaseConditionalIndependenceTest from dodiscover.constraint.config import ConditioningSetSelection @@ -10,7 +11,9 @@ from dodiscover.typing import Column, SeparatingSet from .._protocol import EquivalenceClass +from ..context import Context from ._classes import BaseConstraintDiscovery +from .skeleton import LearnSkeleton logger = logging.getLogger() @@ -24,10 +27,13 @@ class PC(BaseConstraintDiscovery): Parameters ---------- - ci_estimator : Callable + ci_estimator : BaseConditionalIndependenceTest The conditional independence test function. The arguments of the estimator should be data, node, node to compare, conditioning set of nodes, and any additional - keyword arguments. + keyword arguments. It must implement the ``test`` function which accepts the data, + a set of X nodes, a set of Y nodes and an optional set of Z nodes, which returns a + ordered tuple of test statistic and pvalue associated with the null hypothesis + :math:`X \\perp Y | Z`. alpha : float, optional The significance level for the conditional independence test, by default 0.05. min_cond_set_size : int, optional @@ -53,6 +59,14 @@ class PC(BaseConstraintDiscovery): and separating set per pair of variables. If ``True`` (default), will apply Meek's orientation rules R0-3, orienting colliders and certain arrowheads :footcite:`Meek1995`. + keep_sorted : bool + Whether or not to keep the considered conditioning set variables in sorted + dependency order. If True (default) will sort the existing dependencies of each variable + by its dependencies from strongest to weakest (i.e. largest CI test statistic value + to lowest). The conditioning set is chosen lexographically + based on the sorted test statistic values of 'ith Pa(X) -> X', for each possible + parent node of 'X'. This can be used in conjunction with ``max_combinations`` parameter + to only test the "strongest" dependences. max_iter : int The maximum number of iterations through the graph to apply orientation rules. @@ -83,6 +97,7 @@ def __init__( max_combinations: Optional[int] = None, condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, + keep_sorted: bool = False, max_iter: int = 1000, ): super().__init__( @@ -92,9 +107,10 @@ def __init__( max_cond_set_size=max_cond_set_size, max_combinations=max_combinations, condsel_method=condsel_method, + apply_orientations=apply_orientations, + keep_sorted=keep_sorted, ) self.max_iter = max_iter - self.apply_orientations = apply_orientations def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: """Convert skeleton graph as undirected networkx Graph to CPDAG. @@ -117,6 +133,51 @@ def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: graph = CPDAG(incoming_undirected_edges=graph) return graph + def learn_skeleton( + self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None + ) -> Tuple[nx.Graph, SeparatingSet]: + """Learns the skeleton of a causal DAG using pairwise (conditional) independence testing. + + Parameters + ---------- + data : pd.DataFrame + The dataset. + context : Context + A context object. + sep_set : SeparatingSet + The separating set. + + Returns + ------- + skel_graph : nx.Graph + The undirected graph of the causal graph's skeleton. + sep_set : SeparatingSet + The separating set per pairs of variables. + + Notes + ----- + Learning the skeleton of a causal DAG uses (conditional) independence testing + to determine which variables are (in)dependent. This specific algorithm + compares exhaustively pairs of adjacent variables. + """ + skel_alg = LearnSkeleton( + self.ci_estimator, + sep_set=sep_set, + alpha=self.alpha, + min_cond_set_size=self.min_cond_set_size, + max_cond_set_size=self.max_cond_set_size, + max_combinations=self.max_combinations, + condsel_method=self.condsel_method, + keep_sorted=self.keep_sorted, + ) + skel_alg.fit(data, context) + + skel_graph = skel_alg.adj_graph_ + sep_set = skel_alg.sep_set_ + self.n_ci_tests += skel_alg.n_ci_tests + + return skel_graph, sep_set + def orient_edges(self, graph: EquivalenceClass) -> None: """Orient edges in a skeleton graph to estimate the causal DAG, or CPDAG. diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 45991899b..b825926f9 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -2,7 +2,7 @@ from collections import defaultdict from copy import deepcopy from itertools import chain, combinations -from typing import Iterable, List, Optional, Set, SupportsFloat, Tuple, Union +from typing import Callable, Generator, Iterable, List, Optional, Set, SupportsFloat, Tuple, Union import networkx as nx import numpy as np @@ -14,13 +14,43 @@ from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet -from .._protocol import EquivalenceClass +from .._protocol import EquivalenceClass, Graph from ..context import Context from ..context_builder import ContextBuilder, InterventionalContextBuilder, make_context logger = logging.getLogger() +def _parallel_test_xy_edges( + conditional_test_func, x_var, y_var, cond_set, data +) -> Tuple[float, float]: + """Private function used to test edges between X and Y in parallel. + + Parameters + ---------- + conditional_test_func : Callable + Conditional test function. + x_var : Columns + The 'X' variable name. + y_var : Column + The 'Y' variable name. + cond_set : Set[Column] + A set of variables to condition on. Can be the empty set. + data : pandas.Dataframe + The dataset with variables as columns and samples as rows. + + Returns + ------- + test_stat : float + Test statistic. + pvalue : float + Pvalue. + """ + # compute conditional independence test + test_stat, pvalue = conditional_test_func(data, x_var, y_var, set(cond_set)) + return test_stat, pvalue + + def _iter_conditioning_set( possible_variables: Iterable, x_var: Union[SupportsFloat, str], @@ -102,7 +132,385 @@ def _find_neighbors_along_path(G: nx.Graph, start, end) -> Set: return nbrs -class LearnSkeleton: +class BaseSkeletonLearner: + """Base class for constraint-based skeleton learning algorithms.""" + + alpha: float + + adj_graph_: nx.Graph + context_: Context + sep_set_: SeparatingSet + min_cond_set_size_: int + max_cond_set_size_: int + max_combinations_: int + + n_iters_: int + + _cont: bool + + def _learn_skeleton( + self, + data: pd.DataFrame, + context: Context, + conditional_test_func: Callable, + possible_x_nodes=None, + ): + """Core function for learning the skeleton of a causal graph. + + This function is a "stateful" function of Skeleton learners. It requires + the following state to be preserved as attributes of self. + + - context_ : a Context object + + Parameters + ---------- + data : pd.DataFrame + The data to learn the causal graph from. + context : Context + A context object. + conditional_test_func : Callable + The conditional test function that + possible_x_nodes : set of nodes, optional + The nodes to initialize as X variables. How to initialize variables to test in + the second loop of the algorithm. See Notes for details. + + Notes + ----- + The context object should be copied before this function is called. + + Proceed by testing neighboring nodes, while keeping track of test + statistic values (these are the ones that are + the "most dependent"). Remember we are testing the null hypothesis + + .. math:: + H_0: X \\perp Y | Z + + where the alternative hypothesis is that they are dependent and hence + require a causal edge linking the two variables. + + Overview of learning causal skeleton from data: + + This algorithm consists of four general loops through the data. + + 1. "Infinite" loop through size of the conditioning set, 'size_cond_set'. The + minimum size is set by ``min_cond_set_size``, whereas the maximum is controlled + by ``max_cond_set_size`` hyperparameter. + 2. Loop through nodes of the graph, 'x_var' + 3. Loop through variables adjacent to selected node, 'y_var'. The edge between 'x_var' + and 'y_var' is tested with a statistical test. + 4. Loop through combinations of the conditioning set of size p, 'cond_set'. + The ``max_combinations`` parameter allows one to limit the fourth loop through + combinations of the conditioning set. + + At each iteration of the outer infinite loop, the edges that were deemed + independent for a specific 'size_cond_set' are removed and 'size_cond_set' + is incremented. + + Furthermore, the maximum pvalue is stored for existing + dependencies among variables (i.e. any two nodes with an edge still). + The ``keep_sorted`` hyperparameter keeps the considered neighbors in + a sorted order. + + The stopping condition is when the size of the conditioning variables for all (X, Y) + pairs is less than the size of 'size_cond_set', or if the 'max_cond_set_size' is + reached. + """ + # preserve state of the Context object + self.context_ = context + + # get the initialized graph + adj_graph: Graph = deepcopy(context.init_graph.copy()) + + if possible_x_nodes is None: + possible_x_nodes = adj_graph.nodes + + # the size of the conditioning set will start off at the minimum + size_cond_set = self.min_cond_set_size_ + + logger.info( + f"\n\nRunning skeleton phase with: \n" + f"max_combinations: {self.max_combinations_},\n" + f"min_cond_set_size: {self.min_cond_set_size_},\n" + f"max_cond_set_size: {self.max_cond_set_size_},\n" + ) + + # Outer loop: iterate over 'size_cond_set' until stopping criterion is met + # - 'size_cond_set' > 'max_cond_set_size' or + # - All (X, Y) pairs have candidate conditioning sets of size < 'size_cond_set' + while 1: + # private attribute '_cont' is used to preserve state and determine a breaking + # condition for the constraint-based search algorithm + self._cont = False + + # initialize set of edges to remove at the end of every loop + # track progress of the algorithm for which edges to remove to ensure stability + # wrt which edges are removed at each process of the algorithm + remove_edges = set() + + # determine whether or not to continue + # loop through every node that we want to test + for x_var in possible_x_nodes: + possible_adjacencies = set(adj_graph.neighbors(x_var)) + logger.info(f"Considering node {x_var}...\n\n") + + for y_var in possible_adjacencies: + # a node cannot be a parent to itself in DAGs + if y_var == x_var: + continue + + if (x_var, y_var) in context.included_edges.edges: + continue + + # compute the possible variables used in the conditioning set + possible_variables = self._compute_candidate_conditioning_sets( + adj_graph, + x_var, + y_var, + ) + + logger.debug( + f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " + f"with p={size_cond_set}. The possible variables to condition on are: " + f"{possible_variables}." + ) + + # check that number of adjacencies is greater then the + # cardinality of the conditioning set + if len(possible_variables) < size_cond_set: + logger.debug( + f"\n\nBreaking for {x_var}, {y_var}, {len(possible_adjacencies)}, " + f"{size_cond_set}, {possible_variables}" + ) + continue + else: + self._cont = True + + # generate iterator through the conditioning sets + conditioning_sets = _iter_conditioning_set( + possible_variables=possible_variables, + x_var=x_var, + y_var=y_var, + size_cond_set=size_cond_set, + ) + + # now iterate through the possible parents + for comb_idx, cond_set in enumerate(conditioning_sets): + # check the number of combinations of possible parents we have tried + # to use as a separating set + if ( + self.max_combinations_ is not None + and comb_idx >= self.max_combinations_ + ): + break + + try: + # compute conditional independence test + test_stat, pvalue = conditional_test_func( + data, x_var, y_var, set(cond_set) + ) + except Exception as e: + print(e) + test_stat = np.inf + pvalue = 0.0 + + # if any "independence" is found through inability to reject + # the null hypothesis, then we will break the loop comparing X and Y + # and say X and Y are conditionally independent given 'cond_set' + if pvalue > self.alpha: + break + + # post-process the CI test results + removed_edge = self._postprocess_ci_test( + adj_graph, x_var, y_var, cond_set, test_stat, pvalue + ) + if removed_edge: + remove_edges.add((x_var, y_var, pvalue)) + + # summarize the comparison of XY + self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + + # finally remove edges after performing + # conditional independence tests + logger.info(f"For p = {size_cond_set}, removing all edges: {remove_edges}") + + # Remove non-significant links + # Note: Removing edges at the end ensures "stability" of the algorithm + # with respect to the randomness choice of pairs of edges considered in the inner loop + adj_graph.remove_edges_from(remove_edges) + + # increment the conditioning set size + size_cond_set += 1 + + # only allow conditioning set sizes up to maximum set number + if size_cond_set > self.max_cond_set_size_ or self._cont is False: + break + + self.adj_graph_ = adj_graph + self.n_iters_ += 1 + + def _generate_pairs_with_sepset( + self, possible_x_nodes, adj_graph, context, size_cond_set + ): # -> Generator[Column, Column, Set[Column]]: + # loop through every node that we want to test + for x_var in possible_x_nodes: + possible_adjacencies = set(adj_graph.neighbors(x_var)) + logger.info(f"Considering node {x_var}...\n\n") + + for y_var in possible_adjacencies: + # a node cannot be a parent to itself in DAGs + if y_var == x_var: + continue + + if (x_var, y_var) in context.included_edges.edges: + continue + + # compute the possible variables used in the conditioning set + possible_variables = self._compute_candidate_conditioning_sets( + adj_graph, + x_var, + y_var, + ) + + logger.debug( + f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " + f"with p={size_cond_set}. The possible variables to condition on are: " + f"{possible_variables}." + ) + + # check that number of adjacencies is greater then the + # cardinality of the conditioning set + if len(possible_variables) < size_cond_set: + logger.debug( + f"\n\nBreaking for {x_var}, {y_var}, {len(possible_adjacencies)}, " + f"{size_cond_set}, {possible_variables}" + ) + continue + else: + self._cont = True + + # generate iterator through the conditioning sets + conditioning_sets = _iter_conditioning_set( + possible_variables=possible_variables, + x_var=x_var, + y_var=y_var, + size_cond_set=size_cond_set, + ) + + # now iterate through the possible parents + for comb_idx, cond_set in enumerate(conditioning_sets): + # check the number of combinations of possible parents we have tried + # to use as a separating set + if self.max_combinations_ is not None and comb_idx >= self.max_combinations_: + break + yield x_var, y_var, cond_set + + def _compute_candidate_conditioning_sets( + self, adj_graph: nx.Graph, x_var: Column, y_var: Column + ) -> Set[Column]: + r"""Compute candidate conditioning sets. + + For a given 'X' and 'Y', this method implements a graphical algorithm that + enumerates possible variables that are part of 'Z', the conditioning set. + One can then test the following null hypothesis :math:`H_0: X \perp Y | Z`. + + Parameters + ---------- + adj_graph : nx.Graph + The current adjacency graph. + x_var : node + The 'X' node. + y_var : node + The 'Y' node. + + Returns + ------- + possible_variables : Set of Column + The set of nodes in 'adj_graph' that are candidates for the + conditioning set. + + Notes + ----- + This depends on: + + size_cond_set : int + The maximum size of the conditioning set allowed. If candidate conditioning + sets are less than this number, then the ``possible_variables`` will be + the empty set. + """ + raise NotImplementedError( + "All skeleton discovery methods should implement a method for selecting " + "the possible conditioning sets." + ) + + def _postprocess_ci_test( + self, + adj_graph: nx.Graph, + x_var: Column, + y_var: Column, + cond_set: Set[Column], + test_stat: float, + pvalue: float, + ) -> bool: + # keep track of the smallest test statistic, meaning the highest pvalue + # meaning the "most" independent. keep track of the maximum pvalue as well + if pvalue > adj_graph.edges[x_var, y_var]["pvalue"]: + adj_graph.edges[x_var, y_var]["pvalue"] = pvalue + if test_stat < adj_graph.edges[x_var, y_var]["test_stat"]: + adj_graph.edges[x_var, y_var]["test_stat"] = test_stat + + # two variables found to be independent given a separating set + if pvalue > self.alpha: + self.sep_set_[x_var][y_var].append(set(cond_set)) + self.sep_set_[y_var][x_var].append(set(cond_set)) + return True + return False + + def _summarize_xy_comparison( + self, x_var: Column, y_var: Column, removed_edge: bool, pvalue: float + ) -> None: + """Provide ability to log end result of each XY edge evaluation.""" + # exit loop if we have found an independency and removed the edge + if removed_edge: + remove_edge_str = "Removing edge" + else: + remove_edge_str = "Did not remove edge" + + logger.info( + f"{remove_edge_str} between {x_var} and {y_var}... \n" + f"Statistical summary:\n" + f"- PValue={pvalue} at alpha={self.alpha}" + ) + + def evaluate_edge( + self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None + ) -> Tuple[float, float]: + """Test any specific edge for X || Y | Z. + + Parameters + ---------- + data : pd.DataFrame + The dataset + X : column + A column in ``data``. + Y : column + A column in ``data``. + Z : set, optional + A list of columns in ``data``, by default None. + + Returns + ------- + test_stat : float + Test statistic. + pvalue : float + The pvalue. + """ + raise NotImplementedError( + "All skeleton discovery methods should implement a method for " + "evaluating an edge with a statistical test." + ) + + +class LearnSkeleton(BaseSkeletonLearner): """Learn a skeleton graph from observational data without latent confounding. A skeleton graph from a Markovian causal model can be learned completely @@ -176,31 +584,6 @@ class LearnSkeleton: where the alternative hypothesis is that they are dependent and hence require a causal edge linking the two variables. - Overview of learning causal skeleton from data: - - This algorithm consists of four general loops through the data. - - - "infinite" loop through size of the conditioning set, 'size_cond_set'. The - minimum size is set by ``min_cond_set_size``, whereas the maximum is controlled - by ``max_cond_set_size`` hyperparameter. - - loop through nodes of the graph, 'x_var' - - loop through variables adjacent to selected node, 'y_var' - - loop through combinations of the conditioning set of size p, 'cond_set'. - The ``max_combinations`` parameter allows one to limit the fourth loop through - combinations of the conditioning set. - - At each iteration of the outer infinite loop, the edges that were deemed - independent for a specific 'size_cond_set' are removed and 'size_cond_set' is incremented. - - Furthermore, the maximum pvalue is stored for existing - dependencies among variables (i.e. any two nodes with an edge still). - The ``keep_sorted`` hyperparameter keeps the considered neighbors in - a sorted order. - - The stopping condition is when the size of the conditioning variables for all (X, Y) - pairs is less than the size of 'size_cond_set', or if the 'max_cond_set_size' is - reached. - Different methods for learning the skeleton: There are different ways to learn the skeleton that are valid under various @@ -215,16 +598,6 @@ class LearnSkeleton: from 'x_var' to 'y_var'. This is a variant from the RFCI paper :footcite:`Colombo2012` """ - adj_graph_: nx.Graph - context_: Context - min_cond_set_size_: int - max_cond_set_size_: int - max_combinations_: int - sep_set_: SeparatingSet - n_iters_: int = 0 - - remove_edges: Set - def __init__( self, ci_estimator: BaseConditionalIndependenceTest, @@ -251,6 +624,7 @@ def __init__( # debugging mode self.n_ci_tests = 0 + self.n_iters_ = 0 def _initialize_params(self) -> None: """Initialize parameters for learning skeleton. @@ -312,7 +686,7 @@ def evaluate_edge( """ if Z is None: Z = set() - test_stat, pvalue = self.ci_estimator.test(data, {X}, {Y}, Z) + test_stat, pvalue = self.ci_estimator.test(data, set({X}), set({Y}), Z) self.n_ci_tests += 1 return test_stat, pvalue @@ -328,21 +702,14 @@ def fit(self, data: pd.DataFrame, context: Context): """ self.context_ = context.copy() - # get the initialized graph - adj_graph = deepcopy(self.context_.init_graph.copy()) - - # track progress of the algorithm for which edges to remove to ensure stability - self.remove_edges = set() - # initialize learning parameters self._initialize_params() - # the size of the conditioning set will start off at the minimum - size_cond_set = self.min_cond_set_size_ - # allow us to query the iteration stage of the causal discovery algorithm # allowing us to run multiple iterations of the skeleton discovery - edge_attrs = set(chain.from_iterable(d.keys() for *_, d in adj_graph.edges(data=True))) + edge_attrs = set( + chain.from_iterable(d.keys() for *_, d in self.context_.init_graph.edges(data=True)) + ) if self.n_iters_ == 0 and "test_stat" in edge_attrs or "pvalue" in edge_attrs: raise RuntimeError( "Running skeleton discovery with adjacency graph " @@ -350,131 +717,15 @@ def fit(self, data: pd.DataFrame, context: Context): ) # store the absolute value of test-statistic values and pvalue for - # every single candidate parent-child edge (X -> Y) - nx.set_edge_attributes(adj_graph, np.inf, "test_stat") - nx.set_edge_attributes(adj_graph, -1e-5, "pvalue") - - logger.info( - f"\n\nRunning skeleton phase with: \n" - f"max_combinations: {self.max_combinations_},\n" - f"min_cond_set_size: {self.min_cond_set_size_},\n" - f"max_cond_set_size: {self.max_cond_set_size_},\n" - ) - - # Outer loop: iterate over 'size_cond_set' until stopping criterion is met - # - 'size_cond_set' > 'max_cond_set_size' or - # - All (X, Y) pairs have candidate conditioning sets of size < 'size_cond_set' - while 1: - cont = False - # initialize set of edges to remove at the end of every loop - self.remove_edges = set() - - # loop through every node - for x_var in adj_graph.nodes: - possible_adjacencies = set(adj_graph.neighbors(x_var)) - - logger.info(f"Considering node {x_var}...\n\n") - - for y_var in possible_adjacencies: - # a node cannot be a parent to itself in DAGs - if y_var == x_var: - continue - - # ignore fixed edges - if (x_var, y_var) in self.context_.included_edges.edges: - continue - - # compute the possible variables used in the conditioning set - possible_variables = self._compute_candidate_conditioning_sets( - adj_graph, - x_var, - y_var, - ) - - logger.debug( - f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " - f"with p={size_cond_set}. The possible variables to condition on are: " - f"{possible_variables}." - ) - - # check that number of adjacencies is greater then the - # cardinality of the conditioning set - if len(possible_variables) < size_cond_set: - logger.debug( - f"\n\nBreaking for {x_var}, {y_var}, {len(possible_adjacencies)}, " - f"{size_cond_set}, {possible_variables}" - ) - continue - else: - cont = True - - # generate iterator through the conditioning sets - conditioning_sets = _iter_conditioning_set( - possible_variables=possible_variables, - x_var=x_var, - y_var=y_var, - size_cond_set=size_cond_set, - ) - - # now iterate through the possible parents - for comb_idx, cond_set in enumerate(conditioning_sets): - # check the number of combinations of possible parents we have tried - # to use as a separating set - if ( - self.max_combinations_ is not None - and comb_idx >= self.max_combinations_ - ): - break - - # compute conditional independence test - test_stat, pvalue = self.evaluate_edge(data, x_var, y_var, set(cond_set)) - - # if any "independence" is found through inability to reject - # the null hypothesis, then we will break the loop comparing X and Y - # and say X and Y are conditionally independent given 'cond_set' - if pvalue > self.alpha: - break - - # post-process the CI test results - removed_edge = self._postprocess_ci_test( - adj_graph, x_var, y_var, cond_set, test_stat, pvalue - ) - - # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) - - # finally remove edges after performing - # conditional independence tests - logger.info(f"For p = {size_cond_set}, removing all edges: {self.remove_edges}") - - # Remove non-significant links - # Note: Removing edges at the end ensures "stability" of the algorithm - # with respect to the randomness choice of pairs of edges considered in the inner loop - adj_graph.remove_edges_from(self.remove_edges) - - # increment the conditioning set size - size_cond_set += 1 - - # only allow conditioning set sizes up to maximum set number - if size_cond_set > self.max_cond_set_size_ or cont is False: - break - - self.adj_graph_ = adj_graph - self.n_iters_ += 1 - - def _summarize_xy_comparison( - self, x_var: Column, y_var: Column, removed_edge: bool, pvalue: float - ) -> None: - # exit loop if we have found an independency and removed the edge - if removed_edge: - remove_edge_str = "Removing edge" - else: - remove_edge_str = "Did not remove edge" - - logger.info( - f"{remove_edge_str} between {x_var} and {y_var}... \n" - f"Statistical summary:\n" - f"- PValue={pvalue} at alpha={self.alpha}" + # every single candidate parent-child edge (X -> Y) + nx.set_edge_attributes(self.context_.init_graph, np.inf, "test_stat") + nx.set_edge_attributes(self.context_.init_graph, -1e-5, "pvalue") + + # apply algorithm to learn skeleton + self._learn_skeleton( + data, + context=self.context_, + conditional_test_func=self.evaluate_edge, ) def _compute_candidate_conditioning_sets( @@ -533,30 +784,6 @@ def _compute_candidate_conditioning_sets( return possible_variables - def _postprocess_ci_test( - self, - adj_graph: nx.Graph, - x_var: Column, - y_var: Column, - cond_set: Set[Column], - test_stat: float, - pvalue: float, - ) -> bool: - # keep track of the smallest test statistic, meaning the highest pvalue - # meaning the "most" independent. keep track of the maximum pvalue as well - if pvalue > adj_graph.edges[x_var, y_var]["pvalue"]: - adj_graph.edges[x_var, y_var]["pvalue"] = pvalue - if test_stat < adj_graph.edges[x_var, y_var]["test_stat"]: - adj_graph.edges[x_var, y_var]["test_stat"] = test_stat - - # two variables found to be independent given a separating set - if pvalue > self.alpha: - self.remove_edges.add((x_var, y_var)) - self.sep_set_[x_var][y_var].append(set(cond_set)) - self.sep_set_[y_var][x_var].append(set(cond_set)) - return True - return False - class LearnSemiMarkovianSkeleton(LearnSkeleton): """Learning a skeleton from a semi-markovian causal model. @@ -738,13 +965,13 @@ def _compute_candidate_conditioning_sets( # determine how we want to construct the candidates for separating nodes # perform conditioning independence testing on all combinations possible_variables = pgraph.pds( - pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore + pag, x_var, y_var, max_path_length=self.max_path_length_ # type: ignore ) elif condsel_method == ConditioningSetSelection.PDS_PATH: # determine how we want to construct the candidates for separating nodes # perform conditioning independence testing on all combinations possible_variables = pgraph.pds_path( - pag, x_var, y_var, max_path_length=self.max_path_length # type: ignore + pag, x_var, y_var, max_path_length=self.max_path_length_ # type: ignore ) if self.keep_sorted: @@ -763,7 +990,7 @@ def _compute_candidate_conditioning_sets( return possible_variables - def fit(self, data: pd.DataFrame, context: Context): + def _prep_second_stage_skeleton(self) -> Context: import pywhy_graphs as pgraphs if self.max_path_length is None: @@ -771,14 +998,6 @@ def fit(self, data: pd.DataFrame, context: Context): else: self.max_path_length_ = self.max_path_length - # initially learn the skeleton without using PDS information - super().fit(data, context) - - # if there is no second stage skeleton method to be run, then we - # will stop with the skeleton here - if self.second_stage_condsel_method is None: - return self - # convert the undirected skeleton graph to a PAG, where # all left-over edges have a "circle" endpoint sep_set = self.sep_set_ @@ -800,11 +1019,24 @@ def fit(self, data: pd.DataFrame, context: Context): if "pvalue" in d: d.pop("pvalue") context = ( - make_context(context).init_graph(new_init_graph).state_variable("PAG", pag).build() + make_context(self.context_) + .init_graph(new_init_graph) + .state_variable("PAG", pag) + .build() ) + return context + + def fit(self, data: pd.DataFrame, context: Context): + # initially learn the skeleton without using PDS information + super().fit(data, context) + + # if there is no second stage skeleton method to be run, then we + # will stop with the skeleton here + if self.second_stage_condsel_method is None: + return self - if not all(x in context.state_variable("PAG").nodes for x in data.columns): - raise RuntimeError("wtf..") + # setup context for the second round-of learning + context = self._prep_second_stage_skeleton() # now compute all possibly d-separating sets and learn a better skeleton super().fit(data, context) @@ -899,6 +1131,70 @@ def __init__( self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets + def _initialize_params(self) -> None: + """Initialize parameters for learning skeleton. + + Basic parameters that are used by any constraint-based causal discovery algorithms. + """ + # error checks of passed in arguments + if self.max_combinations is not None and self.max_combinations <= 0: + raise RuntimeError(f"Max combinations must be at least 1, not {self.max_combinations}") + + if self.condsel_method not in ConditioningSetSelection: + raise ValueError( + f"Skeleton method must be one of {ConditioningSetSelection}, not " + f"{self.condsel_method}." + ) + + if self.sep_set is None and not hasattr(self, "sep_set_"): + # keep track of separating sets + self.sep_set_ = defaultdict(lambda: defaultdict(list)) + elif not hasattr(self, "sep_set_"): + self.sep_set_ = self.sep_set # type: ignore + + # control of the conditioning set + if self.max_cond_set_size is None: + self.max_cond_set_size_ = np.inf + else: + self.max_cond_set_size_ = self.max_cond_set_size + if self.min_cond_set_size is None: + self.min_cond_set_size_ = 0 + else: + self.min_cond_set_size_ = self.min_cond_set_size + if self.max_combinations is None: + self.max_combinations_ = np.inf + else: + self.max_combinations_ = self.max_combinations + + def evaluate_edge( + self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None + ) -> Tuple[float, float]: + """Test any specific edge for X || Y | Z. + + Parameters + ---------- + data : pd.DataFrame + The dataset + X : column + A column in ``data``. + Y : column + A column in ``data``. + Z : set, optional + A list of columns in ``data``, by default None. + + Returns + ------- + test_stat : float + Test statistic. + pvalue : float + The pvalue. + """ + if Z is None: + Z = set() + test_stat, pvalue = self.ci_estimator.test(data, set({X}), set({Y}), Z) + self.n_ci_tests += 1 + return test_stat, pvalue + def evaluate_fnode_edge( self, data: List[pd.DataFrame], @@ -908,6 +1204,8 @@ def evaluate_fnode_edge( ) -> Tuple[float, float]: """Test an edge from an F-node to a regular node for X || Y | Z. + Tests the conditional invariance: :math:`P_{X=x}(Y | Z) = P_{X=x'}(Y|Z)`. + Parameters ---------- data : pd.DataFrame @@ -934,15 +1232,15 @@ def evaluate_fnode_edge( data_j = data[distribution_idx[1]].copy() # name the group column the F-node, so Oracle works as expected - data_i[X] = 0 - data_j[X] = 1 + data_i[X] = 1 + data_j[X] = 0 data = pd.concat((data_i, data_j), axis=0) # compare conditional distributions P(Y | X) vs P'(Y | X), where 'group_col' # indicates which distribution data came from # test graphically if Y is d-separated from F-node given Z # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, Y, {X}, Z) + test_stat, pvalue = self.cd_estimator.test(data, Y, set({X}), Z) self.n_ci_tests += 1 return test_stat, pvalue @@ -977,158 +1275,65 @@ def _compute_candidate_conditioning_sets( raise RuntimeError("This should not be the case") # get only neighboring sets of Y-vars, or PDS that depend on Y - possible_variables = set(adj_graph.neighbors(y_var)) - set(f_nodes) - return possible_variables + possible_variables = super()._compute_candidate_conditioning_sets( + adj_graph, x_var, y_var + ) - set(f_nodes) - def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): - self.context_ = make_context(context, create_using=InterventionalContextBuilder).build() - - # initialize learning parameters - self._initialize_params() + return possible_variables - # get the initialized graph - adj_graph = self.context_.init_graph + def _postprocess_ci_test( + self, + adj_graph: nx.Graph, + x_var: Column, + y_var: Column, + cond_set: Set[Column], + test_stat: float, + pvalue: float, + ) -> bool: + # post-process the CI test results f_nodes = self.context_.f_nodes + if x_var in f_nodes: + all_other_fnodes = f_nodes.copy() + all_other_fnodes.remove(x_var) + cond_set = cond_set.union(all_other_fnodes) + return super()._postprocess_ci_test(adj_graph, x_var, y_var, cond_set, test_stat, pvalue) - # the size of the conditioning set will start off at the minimum - size_cond_set = self.min_cond_set_size_ - - # track progress of the algorithm for which edges to remove to ensure stability - self.remove_edges = set() - - # first remove all connections among f-nodes - for x_var in f_nodes: - for y_var in f_nodes: - if x_var == y_var: - continue - - pvalue = 1.0 - test_stat = 0.0 - - # post-process the CI test results - removed_edge = self._postprocess_ci_test( - adj_graph, x_var, y_var, set(), test_stat, pvalue - ) - - # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) - - # Remove edges - adj_graph.remove_edges_from(self.remove_edges) - - # Outer loop: iterate over 'size_cond_set' until stopping criterion is met - # - 'size_cond_set' > 'max_cond_set_size' or - # - All (X, Y) pairs have candidate conditioning sets of size < 'size_cond_set' - while 1: - cont = False - # initialize set of edges to remove at the end of every loop - self.remove_edges = set() - - # loop through every node - for x_var in f_nodes: - possible_adjacencies = set(adj_graph.neighbors(x_var)) - - logger.info(f"Considering node {x_var}...\n\n") - - for y_var in possible_adjacencies: - # a node cannot be a parent to itself in DAGs - if y_var == x_var: - continue - - # compute the possible variables used in the conditioning set - possible_variables = self._compute_candidate_conditioning_sets( - adj_graph, - x_var, - y_var, - ) - - logger.debug( - f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " - f"with p={size_cond_set}. The possible variables to condition on are: " - f"{possible_variables}." - ) - - # check that number of adjacencies is greater then the - # cardinality of the conditioning set - if len(possible_variables) < size_cond_set: - logger.debug( - f"\n\nBreaking for {x_var}, {y_var}, {len(possible_adjacencies)}, " - f"{size_cond_set}, {possible_variables}" - ) - continue - else: - cont = True - - # generate iterator through the conditioning sets - conditioning_sets = _iter_conditioning_set( - possible_variables=possible_variables, - x_var=x_var, - y_var=y_var, - size_cond_set=size_cond_set, - ) - - # now iterate through the possible parents - for comb_idx, cond_set in enumerate(conditioning_sets): - # check the number of combinations of possible parents we have tried - # to use as a separating set - if ( - self.max_combinations_ is not None - and comb_idx >= self.max_combinations_ - ): - break - - # compute conditional independence test - test_stat, pvalue = self.evaluate_fnode_edge( - interv_data, x_var, set({y_var}), set(cond_set) - ) - - # if any "independence" is found through inability to reject - # the null hypothesis, then we will break the loop comparing X and Y - # and say X and Y are conditionally independent given 'cond_set' - if pvalue > self.alpha: - break - - # post-process the CI test results - removed_edge = self._postprocess_ci_test( - adj_graph, x_var, y_var, cond_set, test_stat, pvalue - ) - - # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) - - # finally remove edges after performing - # conditional independence tests - logger.info(f"For p = {size_cond_set}, removing all edges: {self.remove_edges}") - - # Remove non-significant links - # Note: Removing edges at the end ensures "stability" of the algorithm - # with respect to the randomness choice of pairs of edges considered in the inner loop - adj_graph.remove_edges_from(self.remove_edges) - - # increment the conditioning set size - size_cond_set += 1 - - # only allow conditioning set sizes up to maximum set number - if size_cond_set > self.max_cond_set_size_ or cont is False: - break - - self.adj_graph_ = adj_graph + def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): + state_variables = context.state_variables.copy() + self.context_ = make_context(context, create_using=InterventionalContextBuilder).build() + for name, var in state_variables.items(): + self.context_.add_state_variable(name, var) + + # apply algorithm to learn skeleton + self._learn_skeleton( + data=interv_data, + context=self.context_, + conditional_test_func=self.evaluate_fnode_edge, + possible_x_nodes=list(self.context_.f_nodes), + ) def _learn_skeleton_with_observations(self, obs_data: pd.DataFrame, context: Context): - f_nodes = context.f_nodes - # get the init graph that does not contain any F-nodes obs_context_bld = make_context(context, create_using=ContextBuilder) init_graph = deepcopy(context.init_graph) # get the subgraph of non-f nodes - non_f_nodes = set(init_graph.nodes) - set(f_nodes) - obs_init_graph = init_graph.subgraph(non_f_nodes) + obs_init_graph = init_graph.subgraph(context.get_non_f_nodes()) # now learn the observational subgraph obs_context_bld.init_graph(obs_init_graph) obs_context = obs_context_bld.build() - super().fit(obs_data, obs_context) + + # get the initialized graph + adj_graph = deepcopy(obs_context.init_graph.copy()) + + # apply algorithm to learn skeleton + self._learn_skeleton( + data=obs_data, + context=obs_context, + conditional_test_func=self.evaluate_edge, + possible_x_nodes=list(adj_graph.nodes), + ) def fit(self, data: List[pd.DataFrame], context: Context) -> None: """Fit data and context. @@ -1168,11 +1373,34 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: largest_data_idx = np.argmax([len(df) for df in data]) obs_data = data[largest_data_idx] + self.context_ = context.copy() + + # initialize learning parameters + self._initialize_params() + + # allow us to query the iteration stage of the causal discovery algorithm + # allowing us to run multiple iterations of the skeleton discovery + edge_attrs = set( + chain.from_iterable(d.keys() for *_, d in context.init_graph.edges(data=True)) + ) + if self.n_iters_ == 0 and "test_stat" in edge_attrs or "pvalue" in edge_attrs: + raise RuntimeError( + "Running skeleton discovery with adjacency graph " + "with 'test_stat' or 'pvalue' is not supported yet." + ) + + # store the absolute value of test-statistic values and pvalue for + # every single candidate parent-child edge (X -> Y) + nx.set_edge_attributes(context.init_graph, np.inf, "test_stat") + nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") + + # first learn the skeleton using only "observational data" self._learn_skeleton_with_observations(obs_data, context) # keep track of the observational skeleton graph obs_skel_graph = self.adj_graph_.copy() + # prepare the context object for the second stage of learning # all separating sets are either: # i) augmented with all F-nodes, or # ii) augmented with all F-nodes except intervention index 'i' @@ -1193,7 +1421,7 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # interventional distributions # create a complete subgraph of F-nodes with all other nodes for node in f_nodes: - for obs_node in set(f_nodes).union(set(non_f_nodes)): + for obs_node in set(non_f_nodes): if node == obs_node: continue self.adj_graph_.add_edge(node, obs_node, test_stat=np.inf, pvalue=-1e-5) @@ -1206,6 +1434,19 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: ) self.context_.add_state_variable("obs_skel_graph", obs_skel_graph) + # convert the undirected skeleton graph to a PAG, where + # all left-over edges have a "circle" endpoint + sep_set = self.sep_set_ + import pywhy_graphs + + pag = pywhy_graphs.PAG(incoming_circle_edges=obs_skel_graph, name="PAG derived with FCI") + + # orient colliders + self._orient_unshielded_triples(pag, sep_set) + + # convert the adjacency graph + self.context_.add_state_variable("pag", pag) + # now, we'll fit the data using interventional data by looping over all # combinations of F-nodes and their neighbors self._learn_skeleton_with_interventions(data, self.context_) diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index fd56403e7..75792976e 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -100,7 +100,8 @@ ctx_builder = make_context(create_using=InterventionalContextBuilder) ctx: Context = ( ctx_builder.variables(data=data[0]) - .intervention_targets(intervention_targets) + # .intervention_targets(intervention_targets) + .num_distributions(6) .obs_distribution(False) .build() ) diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index 401c052f3..97b0c801e 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -270,13 +270,14 @@ def test_psifci_withsachs(): for interv_idx in unique_ints: _data = df[df["INT"] == interv_idx][data_cols] data.append(_data) + print(len(_data)) ci_estimator = GSquareCITest(data_type="discrete") alpha = 0.05 learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=ci_estimator, alpha=alpha) ctx_builder = make_context(create_using=InterventionalContextBuilder) ctx = ( - ctx_builder.variables(data=data) + ctx_builder.variables(observed=data_cols) .intervention_targets(intervention_targets) .obs_distribution(False) .build() From 81b07bf6f2971941833196fab975eb241117bdaf Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 17 Mar 2023 12:04:39 -0400 Subject: [PATCH 34/61] Massive fix and change Signed-off-by: Adam Li --- Untitled.ipynb | 1433 +- doc/references.bib | 17 + dodiscover/ci/__init__.py | 1 + dodiscover/ci/categorical_test.py | 200 + dodiscover/ci/g_test.py | 1 + dodiscover/constraint/fcialg.py | 2 +- dodiscover/constraint/intervention.py | 1 + dodiscover/constraint/skeleton.py | 324 +- dodiscover/testdata/adult.csv | 30163 ++++++++++++++++ .../conditional/ci/test_chisq_test.py | 156 + 10 files changed, 31711 insertions(+), 587 deletions(-) create mode 100644 dodiscover/ci/categorical_test.py create mode 100644 dodiscover/testdata/adult.csv create mode 100644 tests/unit_tests/conditional/ci/test_chisq_test.py diff --git a/Untitled.ipynb b/Untitled.ipynb index 2a3a2f323..26a3d7477 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -8,7 +8,7 @@ "outputs": [], "source": [ "from pywhy_graphs.viz import draw\n", - "from dodiscover.ci import GSquareCITest\n", + "from dodiscover.ci import GSquareCITest, CategoricalCITest, CausalLearnCITest\n", "from dodiscover import PsiFCI, Context, make_context, InterventionalContextBuilder\n", "import networkx as nx\n", "import pandas as pd\n", @@ -48,7 +48,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ4AAAMWCAYAAACwV0zRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZyO9f7H8dd933Pfsy9mGDuFhEJlKREyE6bIMpbMIZGQOi0qldOp8+uckEonhCa0KIRBUjM0o0gpWyj72mCGYbZ79nu7fn84TcdBBrNY3s/z8Ie5r+v7/dx3Y85j3o/P93OZDMMwEBERERERERERKWXmii5ARERERERERESuTgqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEV0ku8ng8pKSkEBgYiMlkKuuaRERERERERETkMmYYBjk5OdSoUQOz+dx9TSUKnlJSUqhdu3apFSciIiIiIiIiIle+w4cPU6tWrXO+XqLgKTAwsHixoKCg0qlMRERERERERESuSHa7ndq1axdnRudSouDp9+N1QUFBCp5ERERERERERATgvCOZNFxcRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEgicRERERERERESkTCp5ERERERERERKRMKHgSEREREREREZEyoeBJRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEgicRERERERERESkTCp5ERERERERERKRMKHgSEREREREREZEyoeBJRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEwoeBIRERERERERkTKh4ElERERERERERMqEgicRERERERERESkTCp5ERERERERERKRMKHgSEREREREREZEyoeBJRERERERERETKhIInEREREREREREpEwqeRERERERERESkTCh4EhERERERERGRMqHgSUREREREREREyoSCJxERERERERERKRMKnkREREREREREpEx4VXQBUjIut5vk1HT2Hz5OZnYeDpcLs8mM1WqhWlgwDepUo1rlYEwmU0WXKiIiIiIiIiICKHi6rGXa81j5/Ta+37KH3QdTyS0owuFwnhYuGYaByWTC22YlNNifJvVr0en2JtzVohE+NmsFVi8iIiIiIiIi1zqTYRjG+S6y2+0EBweTnZ1NUFBQedR1Tdu+/whffLOZr9f9gj23AEzgY7Xi7W3F2+qF2Xz6CUmX202Rw0WRw4nD6cJkMlGtcgj3d7yN+zrcSvUqIRXzRkRERERERETkqlTSrEjB02UkJ6+Q2IVJLF21kYJCJ74+VgL9fbGYL2wUl9PlIju3AKfLTaUgf4b37UTviFZYLBrpJSIiIiIiIiKXTsHTFeanbft466OvOHAkDX8fbwL9fS55XpPHY5Bhz8Xj8dC6aQOeG3IfdapXLqWKRURERERERORaVdKsSC0wFcwwDD5d/j3PvvkpB4+mUSUkkKAA31IZEm42m6gcEkiQvy/rtuzlkVdmsuHX/aVQtYiIiIiIiIjI+Sl4qkCGYTBr8bdMnbcSj8egamgwXl6WUt/Hx9tG1bBgMu15vPD2fH74eU+p7yEiIiIiIiIi8r8UPFWgeV+tY9bib/GyWAgNDiiVLqdzMZtNhIcGkZNXyMvvLmLTjoNltpeIiIiIiIiICCh4qjCbth9k+meJmE0mQgL9ymVPk+lU+JSdm8+r0xeTnpVbLvuKiIiIiIiIyLVJwVMFyCso4o0Pl1NY5KBSkH+57m0ymagSEsTR45lM+XQFJZgtLyIiIiIiIiJyURQ8VYD3F61iX/JxwkICy/R43blYLGYC/X1Y+cM2vlm/o9z3FxEREREREZFrg4Kncrb3t2MsTtyAn48N60UOEk+aM46kOeMuqY4APx9cHg9T5q6kyOG6pLVERERERERERM5GwVM5W756M/mFDoL8fc/6+tZVC1g+7TlWzHoFt/vSA6EtSfNZPu058u0ZZ7wWGujP0eMZfLdp1yXvIyIiIiIiIiLyvxQ8lSN7XgEJa7fhY7Oe9Yidy1FIyr6tgAlnUT7HD/xapvVYrV4YwOffbCrTfURERERERETk2qTgqRwlrfuVjOzcc3Y7pezbitvloF7zu8BkInnn+jKvKdDPm593HmLvb8fKfC8RERERERERubZ4VXQB15L1v+7H4NRw77NJ3rkek9lM/Vs7Yk9P4eTRfeTnZOIXWKlE6x/YspodP3xJWM36tIoazOrPJlGQkwnAqk/GF18XWqMed/Z8FAA/H29y8rLZtOMgN9StdknvT0RERERERETkvyl4KieGYbB93xG8rWf/yHMyjpN1PJnwOo3w9gukVsMWnDyyj8M7N3Bj687nXXvnui85sGU11es349bIAZgtXlzf7C6O7NqAPT2V65u1w8t2qtPKL+iPIOv3I397DqWW0jsVERERERERETlFwVM5OXYym0x7Pt4261lfP/yfY3U1b2wBQLX6TbGsWcKRXRto2CoSk+nsXVIej5tt3yzkyO5N1L35Tm6+q0fxtfWa34X95NH/BE934RcUetY1vLwsbN935FLfooiIiIiIiIjIaTTjqZzsP3ycIocTn7METx63myN7NuFl86Ha9TcB4GX1plq9mynIzeLk4b1nXdPtdLDxqw85snsTDVt1pmn7XucMqP6Mj83KsfRssux5F3yviIiIiIiIiMi5KHgqJ1k5+XgM46zznY4d2o6jII/q9Zth8fojmKr1n+6n5J0bzrjH7XKybtl7pB3eTdMOvWnY6p6Lrs1iMeNye7DnFVz0GiIiIiIiIiIi/0vBUzlxOl2YzvHa78fsfg+afle5VgN8/IM5fmg7jsL8015zOYuwn0zB5uNHWM0Gl1Sb2WTCMAyKHK5LWkdERERERERE5L9pxlM5MZvPHjsV5GRx4vAeANYtnX7O+4/u2cz1zdoV/93bN4CmHaLZGP8h65bOoE2PEQRUCr+o2gwDTH9So4iIiIiIiIjIxVDHUznxtlkxOPUEuv92ePcGMAxCq19P7catz/jzx3G79WesGV7nRlrdOwSno4B1n79HbmbaGdf8PvPJMDznrM0wDEwmE7ZzPHFPRERERERERORiKGkoJ9Uqh2C1WHC63MUBj2EYHNm1ETDRvFN//IPDznpvXtZJMo//RlbaYULCa5/2WpXaDWl97xDWf/UB6z6fQZseI0/rfLL6+AFQkJuNf3Dls67vcLrwtnkRHhpcCu9UREREREREROQUdTyVk/q1q+Jts1Lk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tm3bpb49EREREREREbmKKHi6xnh7e9OnTx8cjj+emufxeHA4HAQGBlKrVi1mzpzJlClT2Lp1K48++uhpIdV/8/PzY/To0cyZMwebzcbQoUMZN24cdru9HN+RiIiIiIiIiFyudNTuGrRnzx66du2K1WolICCAlJQUqlWrxrhx47BYLHTu3BmAXbt28cQTTxAYGMjUqVOpXr36Odf0eDwsWrSIqVOn4uPjw+jRo+nSpYuGj4uIiIiIiIhchTTjSf5U3759Wbt2LWazmaCgIGbPnk2bNm3OuO7w4cM8/vjjOBwOpk6dSv369f903RMnTvDWW2+RmJjI7bffzgsvvEDt2rXL6m2IiIiIiIiISAXQjCf5U/369cMwDHx8fJg0adJZQyeA2rVrM3v2bCpVqsSwYcPYsmXLn65bpUoVJkyYwDvvvMPhw4fp378/s2bNwuFwlMG7EBEREREREZHLmYKna1TXrl1p0aIFr732GlFRUX96bVhYGLGxsdxwww2MGjWKNWvWnHf9tm3bsmDBAgYMGEBsbCwxMTFs3ry5tMoXERERERERkSuAjtpdwwzDuKAZTA6Hg5deeolvv/2Wl156ifvvv79E9+3bt49x48axbds27r//fp544glCQkIusmoRERERERERqWia8SRlwuPxMGHCBBYvXszjjz/O4MGDSxReeTweli5dypQpUzCbzTz99NPcd999Gj4uIiIiIiIicgVS8CRlxjAMYmNjef/994mJieGpp57CbC7Zqc2MjAzefvtt4uPjadGiBS+++CLXXXdd2RYsIiIiIiIiIqVKw8WlzJhMJkaMGMHzzz/PvHnzePnll3E6nSW6NzQ0lH/+85+8++67pKWl8cADDzBjxgwNHxcRERERERG5Cil4kovWt29fxo8fT1JSEqNHjyY/P7/E995+++189tlnPPTQQ3z44Yf079+f9evXl2G1IiIiIiIiIlLeFDzJJYmMjGTy5Mls3bqVRx99lKysrBLfa7PZGDlyJPPmzaNKlSqMGjWKv//972RkZJRdwSIiIiIiIiJSbhQ8ySVr1aoVsbGxpKam8vDDD5OamnpB919//fW89957vPLKK/zwww9ER0ezePFiPB5PGVUsIiIiIiIiIuVBwZOUikaNGjFr1ixcLhdDhw5l//79F3S/yWSie/fuxMXFcffddzNu3DiGDRt2weuIiIiIiIiIyOVDwZOUmtq1azN79mwqVarEsGHD2LJlywWvERISwssvv0xsbCx2u52YmBimTp1KYWFh6RcsIiIiIiIiImVKwZOUqrCwMGJjY7nhhhsYNWoUa9asuah1brvtNubOncvw4cOZO3cu/fr144cffijlakVERERERESkLCl4klIXEBDA1KlTadeuHc8++yzLli27qHVsNhsPP/wwn332GbVq1eKJJ57ghRde4MSJE6VcsYiIiIiIiIiUBQVPUiZsNhsTJkygZ8+evPrqq3z44YcYhnFRa9WuXZt3332Xf/3rX2zevJk+ffqwYMECDR8XERERERERucwpeJIyYzabefHFF3nkkUeYOnUqb7/99kWHRSaTia5du7Jo0SK6dOnCxIkTeeihh9izZ08pVy0iIiIiIiIipUXBk5Qpk8nEiBEjeP7555k3bx4vv/wyTqfzotcLCgpi7NixzJ49m6KiIgYOHMjbb79Nfn5+KVYtIiIiIiIiIqVBwZOUi759+zJ+/HiSkpIYPXr0JQdFzZo149NPP+Wxxx5j0aJF9O3bl9WrV5dStSIiIiIiIiJSGhQ8SbmJjIxk8uTJbN26lUcffZSsrKxLWs/Ly4vBgwezcOFCGjRowDPPPMMzzzzD8ePHS6dgEREREREREbkkCp6kXLVq1YrY2FhSU1N5+OGHSU1NveQ1a9Sowb///W9ef/11tm/fTp8+fZg7dy5ut7sUKhYRERERERGRi6XgScpdo0aNmDVrFi6Xi6FDh7J///5LXtNkMhEREcGiRYvo3r07b7/9Ng8++CA7duwohYpFRERERERE5GIoeJIKUbt2bWbPnk2lSpUYNmwYW7ZsKZV1AwICGDNmDB999BEAgwcPZuLEieTm5pbK+iIiIiIiIiJScgqepMKEhYURGxtLw4YNGTVqFGvWrCm1tZs0acLHH3/M008/zRdffEGfPn1ITEzEMIxS20NERERERERE/pyCJ6lQAQEBTJkyhXbt2vHss8+ybNmyUlvbYrEQExPDokWLuPnmm3nhhRd46qmnSElJKbU9REREREREROTcFDxJhbPZbEyYMIGePXvy6quv8uGHH5ZqZ1LVqlV58803eeutt9i3bx99+/blo48+wuVyldoeIiIiIiIiInImBU9yWTCbzbz44osMHz6cqVOn8vbbb+PxeEp1jw4dOrBw4UL69OnDu+++y1/+8he2bdtWqnuIiIiIiIiIyB8UPMllw2QyMXz4cJ5//nnmzZvHyy+/jNPpLNU9/Pz8ePrpp/nkk0/w8fFh6NChjBs3DrvdXqr7iIiIiIiIiAiYjBKcabLb7QQHB5OdnU1QUFB51CXXuMTERP7+97/TsmVLXn/9dfz8/Ep9D4/Hw6JFi3j33Xfx9vZm9OjRdOnSBZPJVOp7iYiIiIiIiFxNSpoVqeNJLkuRkZFMnjyZrVu38uijj5KVlVXqe5jNZvr168eiRYto0aIFL730Eo899hiHDx8u9b1ERERERERErkUKnuSy1apVK2JjY0lNTeXhhx8mNTW1TPapUqUK48ePZ/LkyRw5coT+/fszc+ZMHA5HmewnIiIiIiIicq1Q8CSXtUaNGjFr1ixcLhdDhw5l//79ZbbXnXfeyYIFC4iJieH9998nJiaGzZs3l9l+IiIiIiIiIlc7BU9y2atduzazZ8+mUqVKDBs2jC1btpTZXj4+Pjz++OPMnTuXoKAghg8fzv/93/+VyVE/ERERERERkaudgie5IoSFhREbG0vDhg0ZNWoUa9asKdP96tevz8yZM/nb3/7Gt99+S3R0NMuWLaMEs/hFRERERERE5D8UPMkVIyAggClTptCuXTueffZZli1bVqb7mc1mevXqRVxcHG3btuXVV19lxIgRHDp0qEz3FREREREREblaKHiSK4rNZmPChAn07NmTV199lQ8//LDMu5BCQ0N59dVXmTZtGidOnOCBBx5g+vTpFBUVlem+IiIiIiIiIlc6BU9yxTGbzbz44osMHz6cqVOn8vbbb+PxeMp839atW/PZZ58xZMgQPv74Yx544AHWr19f5vuKiIiIiIiIXKkUPMkVyWQyMXz4cJ5//nnmzZvHyy+/jNPpLPN9bTYbI0aMYN68eVSpUoVRo0bx0ksvkZGRUeZ7i4iIiIiIiFxpTEYJzinZ7XaCg4PJzs4mKCioPOoSKbHExET+/ve/07JlS15//XX8/PzKZV/DMPjyyy+LO67++te/0rNnT8xm5bkiIiIiIiJydStpVqTfkOWKFxkZyeTJk9m6dSuPPvooWVlZ5bKvyWSiW7duLF68mLvvvptx48YxbNgw9u3bVy77i4iIiIiIiFzuFDzJVaFVq1bExsaSmprKww8/TGpqarntHRwczMsvv0xsbCw5OTn85S9/YfLkyRQUFJRbDSIiIiIiIiKXIwVPctVo1KgRs2bNwuVyMXToUPbv31+u+992223MnTuXESNGMH/+fPr378/3339frjWIiIiIiIiIXE4UPMlVpXbt2syePZtKlSoxbNgwtmzZUq77W61Whg4dymeffUbt2rV58sknef755zlx4kS51iEiIiIiIiJyOVDwJFedsLAwYmNjadiwIaNGjWLNmjXlXkPt2rWZOnUqr732Gj///DPR0dEsWLAAj8dT7rWIiIiIiIiIVBQFT3JVCggIYMqUKbRr145nn32WZcuWlXsNJpOJLl26sGjRIrp27crEiRN56KGH2L17d7nXIiIiIiIiIlIRFDzJVctmszFhwgR69uzJq6++yocffohhGOVeR1BQEGPHjmX27Nk4HA4GDRrEpEmTyM/PL/daRERERERERMqTySjBb+J2u53g4GCys7MJCgoqj7pESo1hGMTGxvL+++8TExPDU089hdlcMZmry+Vi7ty5xMbGEhQUxJgxY+jYsWOF1CIiIiIiIiJysUqaFanjSa56JpOJESNG8PzzzzNv3jxefvllnE5nhdTi5eXFgw8+yIIFC2jYsCHPPvsszzzzDMePH6+QekRERERERETKkoInuWb07duX8ePHk5SUxOjRoyv0qFuNGjV4++23mThxIjt27KBPnz58+umnuN3uCqtJREREREREpLQpeJJrSmRkJJMnT2br1q08+uijZGVlVVgtJpOJTp06sWjRIu6//37+/e9/M2jQILZv315hNYmIiIiIiIiUJgVPcs1p1aoVsbGxpKam8vDDD5Oamlqh9fj7+/Pcc8/x0UcfYTabeeihh5g4cSK5ubkVWpeIiIiIiIjIpVLwJNekRo0aMWvWLFwuF0OHDmX//v0VXRJNmjTho48+4umnn2b58uX06dOHxMTECnkSn4iIiIiIiEhpUPAk16zatWsze/ZsKlWqxLBhw9iyZUtFl4TFYiEmJoZFixbRtGlTXnjhBZ588klSUlIqujQRERERERGRC6bgSa5pYWFhxMbG0rBhQ0aNGsWaNWsquiQAwsPDeeONN5g0aRL79++nb9++fPjhh7hcroouTURERERERKTEFDzJNS8gIIApU6bQrl07nn32WZYtW1bRJRVr3749CxcupG/fvkybNo2YmBi2bt1a0WWJiIiIiIiIlIiCJxHAZrMxYcIEevbsyauv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FXFxcRw4cIDatWvTu3dvunfvTkhIyCWtnZGRwbfffktiYiIbNmwgJycHOBVw3HDDDTz44IP06NEDf3//s95vGAY7d+4sfjJeRkYGderUKX4yXmkHL5c7p9PJsmXLmDVrFidPnqRbt24MGzaMGjVqlOo+R48e5fXXX+eHH37g7rvv5rnnntMAeBERERGRa5yCJxG5JIZhsHXrVuLi4khMTAQgIiKC3r17c+utt15yl1FmZiarV68mKSmJ1atXc/LkSVwuF2FhYQwYMICHH36YmjVrnvN+t9vNxo0biY+PZ9WqVeTn59OkSROioqLo3LnzJR0VvNI4HA7i4uL44IMPsNvt9OzZk6FDh5ZqOGQYBomJibz55psUFBQwcuRI+vfvj8ViKbU9RERERETkyqHgSURKTVZWFsuXL2fx4sUkJydz/fXXEx0dzb333lsqPxPsdjurV69m2bJlJCYmkp6ejre3N61bt+bJJ5/knnvu+dOgq6ioiO+++474+Hi+//57PB4PrVq1IioqirvvvvucHVRXm4KCAhYsWMBHH31EYWEhffr04aGHHiI0NLTU9sjNzWXatGksXLiQG2+8kbFjx9KkSZNSW19ERERERK4MCp5EpNR5PB42bdpEXFwc33zzDRaLhS5dutC7d29uvvnmUpm1lJOTQ1JSErNmzeKHH36gsLCQqlWr0qtXL5544gnq1q37p/fb7XaSkpKIj49n8+bN2Gw22rdvT1RUFHfeeSdWq/WSa7zc5eXlMXfuXD755BPcbjcDBgxg0KBBpfrze/v27bz22mvs27ePvn37MmrUqGsm4BMREREREQVPIlLG0tPTWbZsGUuWLCElJYWGDRsSHR1NVFRUqT39LDc3l/fff585c+awZ88eLBYLjRs3ZtCgQdx///3Url37T+8/fvw4K1asICEhgT179hAUFERERARRUVHccsstV/2T8ex2O3PmzGHevHlYLBYGDhxITExMqQVEbreb+fPnM2PGDAICAnj22Wfp1KnTNTfsXURERETkWqTgSUTKhcfj4ccffyQuLo7vvvsOb29voqKi6N27N40aNSq1fbZv385bb73FypUrsdvtBAYGctttt9GrVy8iIiLO2wl14MABEhISSEhIICUlhfDw8OKh5DfccMNVHZZkZGTw4YcfsmjRInx8fBg8eDD9+vXD19e3VNY/duwYEydOZM2aNbRr144xY8aU+oBzERERERG5vCh4EpFyl5aWxtKlS1m6dClpaWk0adKEPn36cM8995RayJGdnc1nn33GrFmzSE5OBiA4OJhmzZoRGRlJZGQk9erVO+f9hmGwbds2EhISWLlyJdnZ2dSrV684hLqaA5O0tDQ++OADlixZQlBQEEOGDCE6OhqbzVYq63/77bdMnDgRu93O8OHDiYmJwcvLq1TWFhERERGRy4uCJxGpMG63m7Vr1xIXF8e6devw8/PjvvvuIzo6mvr165fKHi6Xi6SkJD7++GM2btyIyWTCZDLh6+tL/fr1iYiIICIiggYNGpyzm8nlcvHjjz+SkJDAt99+S2FhIc2bN6dr167cc889hISElEqtl5uUlBRmzpzJ8uXLqVy5MsOGDaN79+6lMv8qPz+fGTNmMH/+fOrVq8fYsWNp1qxZKVQtIiIiIiKXEwVPInJZSElJYcmSJXz++edkZGTQvHlzoqOjiYyMLJVOG8Mw+OWXX/j0009ZtWoVbreb8PBw7HY7DoeDOnXqEBkZSUREBA0bNjxnCJWfn8/q1atJSEhg3bp1mEwm2rRpQ9euXenQoUOpdWxdTpKTk4mNjWXFihVUr16d4cOHExUVhcViueS1d+3axbhx49i5cye9evXi8ccf1/9/iIiIiIhcRRQ8ichlxel0snr1ahYvXsz69esJCgqie/fuREdHU6dOnVLZIzU1lQULFrBkyRLy8vJo3LgxgYGB7Ny5E7vdTs2aNYmIiCAyMpLGjRufM4TKzMzk66+/JiEhgW3btuHr60vHjh3p2rUrt99++1V3fGz//v289957rFq1irp16zJixAgiIyMvefi6x+Nh0aJFTJ06FR8fH5555hk6d+58Vc/TEhERERG5Vih4EpHLVnJyMosXL+aLL74gOzubli1bEh0dTceOHUvtuNfy5cuZN28ehw8fpkmTJrRo0YLs7GzWrFlDVlYW1atXLz6Od9NNN50zZElJSSEhIYH4+HgOHjxISEgInTt3pmvXrjRt2vSqClF27drFjBkzWLt2LQ0aNGDkyJF06NDhkt9jWloab731FklJSdx+++28+OKL1KpVq5SqFhERERGRiqDgSUQuew6Hg6SkJBYvXszPP/9MaGgo999/P7179y6VId8ej4e1a9cyb948NmzYQHh4OP369aNu3br89NNPrFq1ioyM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YOBp1x8/fpwVK1aQkJDAnj17CAoKIiIigqioKG655ZYrovPHbrczZ84c5s2bh8ViYeDAgcTExFxUF9emTZsYN24cR44cYdCgQQwbNuyMI4wiIiIiIlI+FDyJiPwXj8fDjz/+SFxcHN999x3e3t5ERUURHR3NjTfeeNHrGobBTz/9xNy5c/nhhx8ICwujb9++REdHU6lSpXPel5qayjfffENiYiLbtm3Dy8uL22+/ncjISDp06HDGz9oDBw6QkJBAQkICKSkphIeHFw8lv+GGGy77J+NlZGTw4YcfsmjRInx8fBg8eDD9+vXD19f3gtZxOBx8/PHHzJ49m8qVK/PCCy9w5513llHVIiIiIiJyLgqeRETOIS0tjaVLl7J06VLS0tJo0qQJffr04Z577rngIOS/HTx4kPnz57N8+XIMwyAqKooBAwbQoEGD89bz+3G8LVu2YDabad26NREREXTs2PG0p/QZhsG2bdtISEhg5cqVZGdnU69eveIQ6mKfJlde0tLS+OCDD1iyZAlBQUEMGTKE6Ojoc3aJnUtycjITJkxg/fr13HPPPTzzzDNUrly5jKoWEREREZH/peBJROQ83G43a9euJS4ujnXr1uHn58d9991HdHT0Jc0Qys7OZsmSJSxYsIC0tDRat25NTEwMd95553mPx508ebI4hPr5558BaNmyJZGRkXTs2PG0Id0ul4sff/yRhIQEvv32WwoLC2nevDldu3blnnvuOS2wutykpKQwc+ZMli9fTuXKlRk2bBjdu3e/oBlWhmGQkJDA22+/TVFREY899hh9+vS5Io4gioiIiIhc6RQ8iYhcgJSUFJYsWcLnn39ORkYGt9xyC7179yYyMvKCu3F+53K5SEpK4tNPP2XHjh3UqVOHAQMGcN9995VovlRGRgbffvstiYmJbNy4EYBbb72VyMhI7r777tM6fPLz81m9ejUJCQmsW7cOk8nEHXfcQVRUFB06dLikTq6ylJycTGxsLCtWrKB69eoMHz6cqKgoLBZLidew2+1MmTKFJUuWcNNNN/G3v/2Nhg0blmHVIiIiIiKi4ElE5CI4nU5Wr15NXFwcGzZsICgoiO7duxMdHU2dOnUuak3DMPjll1+YO3cuq1atwt/fn169etGvXz+qVatWojUyMzNZvXo1SUlJrF+/Ho/Hwy233EJERASdOnUiPDz8tGu//vpr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rVu3Qv831uFwsH37dlauXMm+ffsoX748/fv3p1evXkXSONvhcPDDDz8QHR3N1q1bSUxMJCgoKG87XoMGDcjJyeGrr75iy5Yt7Ny5E6fTyb333kvXrl156KGHSryBd2ZmJh999BH/7//9P7Kysnj00Ud56qmnCAgIuOp1hw8f5o033uDXX38lNDSU4cOH6zNPREREROQKFDyJiNzinE4ne/fuJTIyki+//BIXFxc6depEWFgY9evXL/QqqF9//ZXVq1fz2Wef4ebmRq9evfjb3/5GxYoVi6zeffv2ERUVxdatW0lISKB06dK0b9+ejh070rhxY9LS0oiOjmbz5s388MMPWK1WHnzwQbp27UqrVq1wdXUtkloKIj09nZUrV/Kf//wHp9NJ//79eeKJJ676OeZ0Ovnkk09YuHAh7u7uPPfcc3Tu3FnNx0VERERE/kTBk4jIbeTChQusW7eONWvWcPbsWWrVqkVYWBhdu3bF09OzUHOdP3+ejz/+mIiICGw2G23btiU8PJwmTZoUWYDidDrZv38/0dHRREdHEx8fT0BAAO3bt6dDhw40bdqUhIQEPvvsM7Zs2cKRI0fw9fWlQ4cOdO3alcaNG5fYyXg2m40PPviAVatWYbFYePzxxwkPD7/qSqzz58/z1ltvERUVxX333ceECROoVKlSidQrIiIiInI7UPAkInIbcjqdfPvtt3zyySfs2LEDd3d3unTpQlhYGLVr1y7UXNnZ2WzatIlVq1Zx/PhxateuTXh4OA8//DBWq7VIaz5w4EBeCHX27Fn8/f156KGH6NixI82aNSMmJobNmzezZcsWzp49S9myZfNOxqtZs2aJrChKTEzk/fff55NPPsHd3Z2///3v9OvXDw8Pjytes3PnTmbMmEFCQgLPPvssTzzxRJG+dyIiIiIitysFTyIit7m4uDjWrVvH2rVriY+Pp169ejz66KM8/PDDVw1L/swwDL777jtWrlzJN998Q2BgIH379iU0NPSafY8KyzAMDh48SFRUFNHR0Zw5cwZfX1/atWtHx44dad68ed7JeF988QUpKSlUq1Yt72S8gpxEd6Pi4+P5v//7P9auXYuvry9PP/00YWFhVwyUsrKy+Ne//sV//vMfKlWqxIsvvkjTpk2LvU4RERERkVuZgicRkTuEw+Fgx44dREREsGvXLry8vOjWrRthYWFUr169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Cp5EREREbjJXV1fefPNNWrRowdixY9m9e/cNzVetWjXmz5/P4cOHmTBhArm5uUVUqYiIiEjhKHgSERERuQVYrVZmzpxJ8+bNGT16NHv27Lmh+Ro0aMCsWbP49ttvmTJlCk6ns4gqFRERESk4BU8iIiIitwir1crs2bNp1qwZo0eP5vvvv7+h+Vq2bMmUKVPYvHkz8+bNwzCMIqpUREREpGAUPImIiIjcQv4Inxo3bsyoUaP44Ycfbmi+Tp06MX78eFauXMl7771XRFWKiIiIFIyCJxEREZFbjJubG2+99RYNGjRg1KhR/PTTTzc0X9++fRk0aBCLFy8mMjKyiKoUERERuTYFTyIiIiK3IHd3d+bMmUO9evUYMWIE+/fvv6H5/vGPf9CvXz+mT59OdHR0EVUpIiIicnUKnkRERERuUR4eHsybN4/atWszfPhwfvnll+uey2QyMW7cODp16sRLL710wyfniYiIiBSEgicRERGRW5iHhwfz58+nZs2aDBs2jF9//fW65zKbzUyePJl7772XsWPH3tBcIiIiIgWh4ElERETkFufp6cmCBQuoXr06w4YN4+DBg9c9l6urKzNmzKBmzZqMGDGC33//vegKFREREfkTBU8iIiIit4E/wqfKlSszbNgwDh8+fN1z/bGFLzAwkGHDhhEXF1eElYqIiIj8j4InERERkduEl5cXCxcupGLFigwZMoQjR45c91y+vr4sXLgQs9nMsGHDSE5OLrpCRURERP5LwZOIiIjIbcTb25tFixZRoUIFhgwZwtGjR697rqCgIBYtWkRKSgqjRo0iIyOjCCsVERERUfAkIiIictvx8fFh0aJFlCtXjiFDhnD8+PHrniskJIQFCxZw4sQJnn/+eex2exFWKiIiInc7BU8iIiIityFfX18WL15MmTJlGDx48A2FT3Xq1GHu3Ln8+OOPvPLKKzidziKsVERERO5mCp5EREREblN+fn4sXryYgIAABg8efEMn1DVr1oxp06axdetWZsyYgWEYRVeoiIiI3LUUPImIiIjcxvz9/VmyZAn+/v4MHjyYmJiY656rXbt2TJo0iYiICJYtW1aEVYqIiMjdSsGTiIiIyG2uVKlSLF26FB8fHwYNGnRD4VOvXr0YOXIk77zzDqtXry7CKkVERORupOBJRERE5A4QEBDA0qVL8fLyYvDgwZw+ffq653ryySd54oknmD17Nps3by7CKkVERORuo+BJRERE5A4RGBjI0qVLcXd3Z9CgQZw5c+a65xo5ciQ9evRg8uTJ7Ny5swirFBERkbuJgicRERGRO0jp0qVZunQpVquVQYMGERsbe13zmEwmXnrpJVq3bs348eP56aefirhSERERuRsoeBIRERG5wwQFBbFs2TIsFguDBw/m3Llz1zWPxWJh+vTp1K9fn9GjR3P06NEirlRERETudAqeRERERO5Af4RPAIMGDSIuLu665nFzc2POnDkEBwczfPjw615BJSIiIncnBU8iIiIid6hy5cqxbNkynE4ngwYNIj4+/rrm8fb2ZuHChXh4eDB06FASExOLuFIRERG5Uyl4EhEREbmDBQcHs2zZMnJzcxk8eDDnz5+/rnkCAgJYtGgRWVlZDB8+nLS0tCKuVERERO5ECp5ERERE7nDly5dn2bJlZGVlMXjwYBISEq57noULF3L27Fmee+457HZ7EVcqIiIidxoFTyIiIiJ3gQoVKrBs2TIyMzMZPHjwdW+Xq1GjBvPmzePAgQNMnDgRh8NRxJWKiIjInUTBk4iIiMhdolKlSixdupS0tLQbCp8aNWrEzJkz2bFjB2+88QaGYRRxpSIiInKnUPAkIiIichcJCQlh2bJlpKSkMGTIEJKTk69rntatWzN58mTWr1/PggULirZIERERuWMoeBIRERG5y1SuXJmlS5eSlJTEkCFDSElJua55unbtyrhx4/j3v//Nv//97yKuUkRERO4ECp5ERERE7kJVq1Zl6dKlJCQkMGTIEGw223XN079/f5599lnefvtt1q9fX8RVioiIyO1OwZOIiIjIXapatWosWbKE+Ph4hg4det3h0+DBgwkNDWXq1Kls27ataIsUERGR25qCJxEREZG7WI0aNVi8eDGxsbEMHz6c1NTUQs9hMpmYMGEC7du358UXX+T7778vhkpFRETkdqTgSUREROQuV6tWLZYuXcrp06cZPnw4aWlphZ7DbDYzZcoUGjduzJgxYzh06FAxVCoiIiK3GwVPIiIiIkKtWrVYvHgxMTExjBgxgvT09ELPYbVamT17NlWqVGHEiBHExMQUQ6UiIiJyO1HwJCIiIiIA1KlTh0WLFnHixAlGjBhBRkZGoefw9PTk7bffxs/Pj2HDhhEfH18MlYqIiMjtQsGTiIiIiOSpV68eixYt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maYZh6QAgMbIsGqxxMLv98vr9crn8yk1NbU+cgGN0tSpUzV9+nRJ+1ZCud1ubd++XZKUl5cnt9tdM9bn88myLL377rtq3bq1vl2/XTN+90+t3Vwoy5RSktxK9LiP6LG4aNSUv7JagVBYHpdTl55zikZef6HSUmO7fxQAAGj8wuGw7rvvPn322WeaOXOmzjjjjAPGLF26VJMmTdINN9ygcePG8fg+AJzAatsVUTwBdcA0Tf3xj3/U/PnzVV1draKiIiUmJqqkpEQul0u5ublyOPZ/iWRBQYGuuOIKPfPMMzWfhcIRffzl9/r7+1/q6++3KBAMyzAMuV1OuV0OuZ0OGYYhwzBkWZaipqlgKKJgKKxgOCJDkjclURefdbIG9e+pzm1b8A0hAACotVAopHvvvVcrVqzQ7Nmz1adPnwPGvPbaa3r88cc1cuRI3XbbbXFICQBoCCiegHpSXFysBx98UCtXrtStt96q2267TYMGDdLy5cuVlpam3NzcAx5xq66ult/v10svvaR+/fod9Lrrt+7Se59/p2/Xb9cPW3aqsjqoUDgi07JkyJBkyW63ye1yKj01SV3btVTPzq114RndWOEEAACOWigU0t13360vv/xSs2fP1mmnnXbAmEWLFmnRokWaNGmSrrrqqjikBADEW227IschjwA4rI8++kgPPfSQnE6nFixYoF69eumpp56Sz+dT+/btVVJSctANw0tLS9WlSxf17dv3kNdu36qZ2rdqJkkKR6LaWrhH23eVKBgKK2qacjkdSkrw6KTcpmqakcrKJgAAUCdcLpeefPJJ3XXXXRo7dqzmzZunU089db8xv/3tb1VWVqbHHntMXq9X5513XpzSAgAaOlY84bhnWZZ27/Vr264SBYJhhSNRuZx2JSV41CYnS96UxCO+ZjAY1OzZs/Xaa6+pX79+euCBB+RyuTRhwgT9+9//1vjx49W7d29dd9112rJli3JycmqKoUgkoqKiIk2fPl233nprXd8uAABAnQgGgxo3bpxWr16tefPmqWfPnvsdN01T999/v95//33NnTv3oCujAADHLx61wwmtqMSn9z77Tt9tLNB3Gwq011ehYCgiy7JkWZYMw5DNtm/vpOZN0tStfUt175Cn8/p0VUqS52evvX79ek2aNEkFQj03lwAAN9xJREFUBQW68847dc0112j37t0aO3asduzYoccff7xmM86vv/5aN910k8rKytSsWTMZhqGSkhIlJyfr448/VlpaWj38aQAAABydQCCgcePG6dtvv9X8+fN1yimn7Hc8HA7rzjvv1KpVq7Rw4UJ16dIlTkkBAPWN4gknHNM09fXarfrHh1/pw5VrVVkVkCXJ7XTI7XLK5XTIZjNkyJAlS9HofzfmDocViUQlSRneZA085xQN7Nez5jG3H1mWpVdffVVz5sxRXl6epk2bprZt2+r777/X2LFj5XA4NGfOHJ100kn7nffWW29p1KhRMk1TmZmZ2rFjh4YNG6YpU6bU058MAADA0auurtbYsWO1du1azZ8/XyeffPIBx0eMGKHt27frueeeU+vWreMTFABQryiecELZvqtET77wpr5Ys0nhSEQJHpdSEj0HbOr9cyLRqPwV1QqGI0pwuzSoXw8N/38XyJuSqNLSUk2dOlWffPKJrr/+eo0ZM0Yul0vLli3TxIkT1bZtW82aNUuZmZkHvfYzzzyjhx9+WKZpyuPx6M0331Tnzp3r6vYBAABiqrq6WmPGjNG6dev09NNPq1u3bvsd9/v9uv3221VZWanf/e53atq0aZySAgDqC8UTTgimaepv763UotfeV0lZhdJSEuVxO49po23LslReFVBlVVCtWjTRpX1a67Xf5ysajWrKlCnq27evLMvSn/70J82aNUsDBgzQQw89JI/n0I/oWZalyZMna/Hixbrgggv0xz/+8ajzAQAAxENVVZVGjx6tDRs2KD8//4DH6oqLizV48GB5PB4999xz8nq9cUoKAKgPFE847lVWBzX16b/oo5Xfy2YYyvAmy2aruze7hSNRbSssUqCqUu2buvTinAfUtGmWotGonnzySb322mu65ZZbNGrUqFqtrAqFQnriiSc0cODAA94MAwAA0BhUVVVp1KhR2rx5s/Lz89WpU6f9jm/btk2DBw9WixYtlJ+fr8TEI3+JCwCgcaB4wnGtvDKg8bP+rM/XbFBacqISPK46vX4oFFLBjgIFgkGlpmXI6fTo6gtO04jrBmjy5En67LPPNGHCBF111VV1Oi8AAEBDV1lZqZEjR2rbtm3Kz89Xx44d9zu+du1aDR06VCeffLJmzZolp9MZp6QAgFiieMJxqzoQ0vhZf9byr39QhjdJblfdfjNTVlamXbt2yel0KicnRx6PRxVVAfkrq+QJFMnu26AZ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\n", + "image/png": "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KNAPfvCDU3JyHgAAx9LdrKjnvkoCAAAAHwMej0ehUEijR4/W8uXL9cADD+jcc89VIpHQvn37VFdXp1QqpXg8rgMHDvTYvM3Nzfrnf/5n/ehHP9Jll12mJ554gtAJAHDGY6sdAAAA8BGmaeqFF17QRRddpKKiIt1444268cYbtXnzZi1cuFDPPPOMdu3aJbvdrvr6evXt2/ek53zzzTf17//+7zIMQz//+c81Y8aMHngSAABOPYInAAAA4COqq6tVX1+vyy67rMvrw4YN07Bhw3TXXXdp+fLlqqqqUllZ2UnNFYlE9POf/1zPPvusZs6cqW9/+9vKzc09qTEBADidEDwBAAAAH/HCCy+of//+Gjt27GGv2+12TZs2TdOmTTupedavX6/vfOc7amho0De/+U1dffXVMgzjpMYEAOB0Q48nAAAA4H3RaFSvvvqqLrnkkrSFQKlUSr/97W916623KiMjQ3/60590zTXXEDoBAD6WqHgCAAAA3vf6668rHA7r0ksvTcv4e/fu1X333ad169bps5/9rP7f//t/cjj4lhwA8PHFVzkAAADgfS+88IImTJig4uLiHh3Xsiw9//zz+ulPf6qcnBz99re/1bhx43p0DgAATkcETwAAAICkxsZGLV++XN/4xjd6dNzW1lbdf//9Wrx4sa644grdc8898vl8PToHAACnK4InAAAAfKyZpqnaxlYFOyKKJ5Jy2G1yOR3q1ydHmX5P532LFi2Sw+HQhRde2GNzL126VN/73veUTCb1k5/8RLNnz+6xsQEAOBMQPAEAAOBjxTRNvbthl6o37NDG7bXasKNW7aGIkilTlmXJkCHDZsjlcKh/Ya7GDOmvYSX99NyCFzVz5kxlZmae9BpisZh++ctf6qmnntK5556r7373u8rPz++BpwMA4MxC8AQAAICPhbaOsF5Zuk5/e3WVtu6pVzKZkiS5XU65XQ75PHYZhmRZB3suxRJJbd1dr007apVKpdTa4lff4QO0ZtMujRs28IRPmdu0aZO+/e1va9++fbr33nv1yU9+khPrAABnLYInAAAAnNFSKVN/fXWVHn56sZqDIdkMKcvvldvlPGrg43Y5Jf/Bf66rq5PN5tCKTfu1+t8fVcWowbr31ks1sF/3q5RM09Qf//hHPfjggyotLdXjjz+u0tLSk308AADOaARPAAAAOGPt2d+kBx5b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x5RXXKaCklFyuDySDDXVblNz7XalUsd/ctoH28aOR319fWd/purqau3evVuSNGjQIFVUVOi2227TxIkT1bfvoaernQqpVEo7duzoDJhqamq0ZcsWJZNJ2e12DR06VBMmTNANN9ygUaNGHRImLly4UM8995xM0zxsc3PLspRIJGS32+VKBpWKBGXzZMhuN2XJkt1m16BBg+Q8wS10J6M9HFWGz6N5543r9bmBswnB0xmgua1DW3fXv/+nTg1NQcUSCRmGIY/bqQGFeRoyoEBDBxWqtH9f+bzuU71kAAAAnIXGjRsny7KUTCbV0dGh9vZ21dbWavHixbLZbHK73fL7/Ro6dKgqKipUF8lVPPFh5cvRuL0ZKpt4gZLxqLZUvapNyxdp9PQrJUnb17ypRCyiCXPmq//wii7vW/v6M2qu3X7cz2JZktt17DCktra2M2iqqqpSbW2tJKm0tFRTp07VF77wBZWXlysvL++419DTLMvSnj17DtkuF41GZRiGBg8erFGjRunyyy/X6NGjNXToULlcrqOO+eUvf1nPP/+8UqnUIcGTaZpKJpOd2+/i8ZgyInWyZYyUlTQlM6WioiL5fL50PvZhmaalcCSuyy6YqL55gV6fHzibEDydpqLxhN5ctVF/f61K723Zo2gscXD/sySbzZChg1+YTcvS0tVbJVlyOOzyelyaWTFCl59frokjB/X6kaoAAAA4e1133XW66667lEgk5HYf/GWoZVkyTVOmaSoSiSgSiaihoUHvvPOOsoeeJ1/BcDXu3yOXyyWfzyd/hl9288hb3IZUzNHujSu1c91SDR43Q76sXIXbmiRJhYNHd7nXsiy11O08oWcxTVN987IOGW/v3r2dIVN1dbXq6upkGIaGDh2qmTNnqry8XBMnTlROTve39aWDZVlqbGzsrGJav369NmzYoPb2dklScXGxRo8erQsuuECjRo3SiBEjTigAOv/885WXl6fGxsYulWyJREKpVEqGYcjtdis/P1/Z2dkybBG1JjuUtPmUk52l3NxDe3P1hqa2duVlZ+i262adkvmBswnB02kmFInpyReX6rnFVao70CpLlvwej3Ky/HLYbUf8TZBlWYonUorG4nrhjXdV+fZaDRlYqE/NO0eXzBhPAAUAAIC0y87O1rBhw7Ru3brO1wzDkN1u77I964PTz1KRNkmWUqmUIpGIwpGw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RERERGeJu9oRERF5mCiKeOutt/DRRx/hH//4B2655RZPL8kjRFHE2rVrcf/998Pf3x9r165l6ERERETUzbHiiYiIyINEUcSKFSvwwQcf4Mknn8Rtt93m6SV5hMFgwLx58/DXX3/hjjvuwLRp06BSqTy9LCIiIiI6RwyeiIiIPGj16tV477338Nhjj+H222/39HI8Yt++fZgxYwbMZjOWLl2KMWPGeHpJRERERNRO2GpHRETkIatXr8bbb7+NRx99FHfddZenl9PpBEHAhx9+iIkTJyI8PBzr1q1j6ERERETUw7DiiYiIyAPeffddrF69GlOnTsXdd9/t6eV0utraWsydOxebNm3Cfffdh8mTJ0OhUHh6WURERETUzhg8ERERdbL33nsPK1aswMMPP4z77rvP08vpdLt27cKsWbPgcDiwbNkyjBgxwtNLIiIiIqIOwlY7IiKiTvThhx9i+fLlmDRpEu6//35PL6dTCYKAt99+G5MnT0ZcXBzWrl3L0ImIiIioh2PFExERUSf56KOPsGzZMjz00EN48MEHPb2cTlVdXY3Zs2djx44dePDBBzFx4kTI5bz+RURERNTTMXgiIiLqBJ988gneeOMNPPDAA+dd6LR161bMmTMHMpkMK1aswJAhQzy9JCIiIiLqJLzUSERE1MHWrl2LV199Fffffz8mT54MmUzm6SV1CqfTieXLl2PatGno27cv1q1bx9CJiIiI6DzDiiciIqIO9M9//hNLly7FPffcgylTppw3oVNFRQVmzpyJffv2STv3sbWOiIiI6PzD4ImIiKiDfPrpp3j55Zdx9913Y9q0aedN6LRhwwbMnTsXGo0Gb7/9NgYNGuTpJRERERGRhzB4IiIi6gCfffYZlixZgjvuuAOPPPLIeRE6ORwOvPXWW1izZg1Gjx6NefPmwc/Pz9PLIiIiIiIPYvBERETUzr744gssXrwYt99+Ox5//PHzInQqLS3FzJkzkZ2djSeeeAK33377efG8iYiIiOj0GDwRERG1oy+//BKLFi3CrbfeiieeeOK8CF/++OMPzJ8/Hz4+PnjvvfeQmprq6SURERERURfB4ImIiKidfPPNN3j++edx88034x//+EePD51sNhtef/11/Otf/8LFF1+MOXPmwMfHx9PLIiIiIqIuhMETERFRO/j222+xYMEC3HjjjXj66ad7fOhUVFSEGTNm4OjRo3jmmWdw44039vjnTERERERtx+CJiIjoHH3//feYP38+rr/+ekyfPr3HBzA///wzFi5ciKCgIHzwwQfo16+fp5dERERERF0UgyciIqJz8MMPP2DevHm49tprkZmZCblc7ukldRir1YpXXnkFX3zxBS6//HLMmjULOp3O08siIiIioi6MwRMREdFZ+umnnzBv3jxMmDABM2fO7NGhU35+PjIzM1FYWIjZs2fj2muv7fGVXURERER07nruK2QiIqIO9PPPP+PZZ5/F1VdfjdmzZ/fo0On777/HnXfeCafTiTVr1uC6665j6ERERERErcKKJyIiojb65ZdfMHv2bFxxxRWYM2dOjw2dzGYzXnzxRXz33Xe45ppr8PTTT8PLy8vTyyIiIiKiboTBExERURv89ttvmDVrFi6//HLMmzevx4ZOubm5yMzMRHl5OebPn4+rrrrK00siIiIiom6oZ75aJiIi6gB//PEHZs6cicsuuwzPPfdcjwydRFHEl19+ibvvvhtKpRJr1qxh6EREREREZ40VT0RERK3w559/IjMzE5dccgnmz5/fI0Mno9GI559/Hj///DNuuOEG/OMf/4BGo/H0soiIiIioG2PwREREdAZ//fUXnnnmGYwdOxYLFiyAQqHw9JLa3aFDh5CZmYnq6mosWrQI48aN8/SSiIiIiKgH6HmXa4mIiNrR+vXrMX36dIwZMwYLFy7scaGTKIr49NNPce+990Kv1+OTTz5h6ERERERE7YYVT0RERKewceNGTJ8+HaNHj8aiRYugVPasH5sNDQ1YsGABfv/9d9x666149NFHoVarPb0sIiIiIupBetYraCIionayadMmPP300xg5cmSPDJ0OHDiAmTNnoqGhAS+//DL+9re/eXpJRERERNQDsdWOiIjoJFu2bMFTTz2F4cOHY/HixVCpVJ5eUrsRRREff/wxHnjgAQQGBuKTTz5h6EREREREHaZnXb4lIiI6R9u2bcOTTz6JoUOH9rjQqb6+HvPmzcP69etx99134+GHH+5xlVxERERE1LXw1SYREdF/bd++HY8//jiGDBmCJUuW9Kh5R3v27MHMmTNhtVrx2muvYdSoUZ5eEhERERGdB9hqR0REBGDnzp14/PHHMXjwYLz88ss9JnQSBAHvv/8+HnroIURFRWHdunUMnYiIiIio07DiiYiIznu7du3CY489hrS0NLzyyis9JnSqqanBs88+i61bt+L+++/HQw89BIVC4ellEREREdF5hMETERGd13bv3o3HHnsMAwcOxNKlS3tM6LR9+3bMnj0boijizTffxLBhwzy9JCIiIiI6D7HVjoiIzlt79+7Fo48+iv79+2Pp0qXQaDSeXtI5EwQBq1evxsMPP4xevXph3bp1DJ2IiIiIyGNY8UREROelffv24ZFHHkFKSgqWLl0KrVbr6SWds8rKSsyePRu7d+/GpEmTcP/990Mu5zUmIiIiIvIcBk9ERHTe2b9/P6ZNm4akpCS89tpr8PLy8vSSztnmzZvx7LPPQqlUYuXKlcjIyPD0koiIiIiI2GpHRETnl4MHD2LatGno27dvjwidnE4n3nzzTTzyyCNITk7G2rVrGToRERERUZfBiiciIjpvZGVlYerUqejTpw/eeOMN6HQ6Ty/pnJSXl2PmzJnYv38/Hn30Udx5551srSMiIiKiLoXBExERnReys7MxdepU9OrVq0eETn/99RfmzZsHnU6Hd955BwMHDvT0koiIiIiImmHwREREPd6hQ4cwdepUxMXFYdmyZdDr9Z5e0lmz2+1YtmwZ1q5dizFjxmDevHnw9fX19LKIiIiIiFrE4ImIiHq0w4cPY8qUKYiJicGbb77ZrUOn0tJSZGZm4vDhw/jHP/6BW2+9FTKZzNPLIiIiIiI6JQZPRETUYx05cgRTpkxBdHQ03nzzTXh7e3t6SWft999/x/z58+Hn54f33nsPKSkpnl4SEREREdEZMXgiIqIe6ejRo5gyZQoiIiLw5ptvwsfHx9NLOis2mw2vvfYaPv30U1xyySWYM2dOtw7QiIiIiOj8wuCJiIh6nGPHjmHy5MkIDQ3F8uXLu+0MpMLCQmRmZiI/Px8zZszADTfcwNY6IiIiIupWGDwREVGP4gqdQkJCsGLFim4bOv30009YtGgRgoOD8cEHH6Bv376eXhIRERERUZsxeCIioh4jPz8fkydPRmBgIJYvXw4/Pz9PL6nNLBYLXnrpJXz99de48sorMWPGDOh0Ok8vi4iIiIjorDB4IiKiHqGgoACTJk1CQEAAVqxYAX9/f08vqc2OHTuGzMxMlJSU4Nlnn8WECRPYWkdERERE3Zrc0wsgIiI6V4WFhZg0aRL8/PywYsUKBAQEeHpJbSKKIr799lvcfffdAIA1a9bgmmuuYehERERERN0eK56IiKhbKyoqwqRJk+Dj44OVK1ciMDDQ00tqE5PJhMWLF+OHH37Atddei6effhpardbTyyIiIiIiahcMnoiIqNsqLi7GpEmToNfru2XodOTIEWRmZqKiogILFizAlVde6eklERERERG1K7baERFRt1RSUoJJkyZBq9Vi5cqVCAoK8vSSWk0URXzxxRe45557oNFo8MknnzB0IiIiIqIeiRVPRETU7ZSWlmLSpEnQaDRYtWoVgoODPb2kVjMajVi4cCF++eUX3HTTTXjiiSegVqs9vSwiIiIiog7B4ImIiLqV48ePY9KkSVAqlVi5ciVCQkI8vaRWy87OxowZM1BbW4vFixfj0ksv9fSSiIiIiIg6FFvtiIio2ygrK8OkSZMgl8uxatUqhIaGenpJrSKKIv75z3/ivvvug6+vL9auXcvQiYiIiIjOC6x4IiKibqG8vByTJk0CAKxatQphYWEeXlHrGAwGzJ8/H//5z39w++2345FHHoFKpfL0soiIiIiIOgWDJyIi6vIqKiowadIkiKKIVatWITw83NNLapX9+/dj5syZMBqNWLp0KcaMGePpJRERERERdSoGT0RE1KVVVlZi8uTJcDgcWL16NSIiIjy9pDMSBAEff/wx3nrrLaSmpuLtt9/uNmEZEREREVF7YvBERERdVlVVFSZNmgSr1YrVq1cjMjLS00s6o7q6OsydOxcbN27EPffcgylTpkCp5I9bIiIiIjo/8ZUwERF1SdXV1Zg0aRIsFgtWr16NqKgoTy/pjHbt2oVZs2bBbrfjjTfewMiRIz29JCIiIiIij+KudkRE1OXU1NRg8uTJMJlMWLVqFaKjoz29pNMSBAHvvvsuJk+ejJiYGKxbt46hExERERERWPFERERdjCt0amhowOrVqxETE+PpJZ1WdXU15syZg+3bt2PixImYOHEiFAqFp5dFRERERNQlMHgiIqIuo7a2FlOmTEF9fT1Wr16N2NhYTy/ptLZt24bZs2dDJpPhrbfewtChQz29JCIiIiKiLoWtdkRE1CXU1dXh4YcfRm1tLVatWoW4uDhPL+mUnE4nVq5cialTp6JPnz5Yt24dQyciIiIiohaw4omIiDyuvr4eDz/8MKqrq7Fy5UrEx8d7ekmnVFFRgdmzZ2PPnj2YMmUK7r33XsjlvI5DRERERNQSBk9ERORRBoMBDz/8MCorK7Fq1Sr06tXL00s6pU2bNuHZZ5+FWq3GqlWrkJ6e7uklERERERF1aQyeiIjIY1yhU3l5OVauXNllQyeHw4Hly5fjo48+woUXXojnnnsO/v7+nl4WEREREVGXx+CJiIg8oqGhAdOmTcPx48excuVK9OnTx9NLatHx48cxc+ZMZGVl4fHHH8ftt9/O1joiIiIiolZi8ERERJ2usbERU6dORXFxMVauXInExERPL6lFf/75J5577jno9Xq88847GDBggKeXRERERETUrTB4IiKiTmU0GjFt2jQUFxdjxYoV6Nu3r6eX1IzNZsOyZcuwbt06jB07FnPmzIGvr6+nl0VERERE1O0weCIiok5jMpnwyCOPoKCgAMuXL0e/fv08vaRmiouLMWPGDOTm5mL69Om46aabIJPJPL0sIiIiIqJuicETERF1ClfodOzYMSxfvhzJycmeXlIzv/zyCxYuXIiAgAC89957XXKNRERERETdCYMnIiLqcCaTCY8++ihyc3OxfPlypKSkeHpJbqxWK5YuXYrPP/8c48aNw6xZs6DX6z29LCIiIiKibo/BExERdSiz2YzHH38chw8fxvLly5GamurpJbkpKChAZmYmCgoKMHPmTFx//fVsrSMiIiIiaifcD5qIiDqMxWLB448/jpycHLz55pvo37+/p5fk5ocffsCdd94Ju92ODz/8EDfccANDJyIiIiKidsSKJyIi6hAWiwVPPPEEsrKy8Oabb2LgwIGeXpLEbDbjpZdewjfffIOrr74azzzzDHQ6naeXRURERETU4zB4IiKidme1WvHkk0/iwIEDeOONNzBo0CBPL0ly7NgxZGZmorS0FPPmzcP48eM9vSQiIiIioh6LrXZERNSuXKHTvn378PrrryM9Pd3TSwIAiKKIr7/+GnfddRdkMhnWrFnD0ImIiIiIqIOx4omIiNqNzWbD008/jT179uCNN95ARkaGp5cEoGlXvUWLFuGnn37C9ddfj6eeegoajcbTyyIiIiIi6vEYPBERUbuw2Wx46qmnsGPHDrz++usYPHiwp5cEADh8+DAyMzNRVVWF559/Hpdffrmnl0REREREdN5g8EREROfMZrNh+vTp2LFjB1577TVccMEFnl4SRFHEZ599hldffRUJCQn4+OOPERsb6+llERERERGdVxg8ERHRObHb7cjMzMS2bduwdOlSDB061NNLQkNDAxYuXIjffvsNN998Mx5//HGo1WpPL4uIiIiI6LzD4ImIiM6aK3TavHkzXnnlFQwfPtzTS0JWVhYyMzNhMBiwZMkSXHzxxZ5eEhERERHReYu72hER0VlxOByYOXMmNm3ahJdffhkjR4706HpEUcTatWtx//33IyAgAGvXrmXoRERERETkYax4IiKiNnOFTuvXr8dLL72ECy+80KPrMRgMmDdvHv766y/ceeedmDp1KlQqlUfXREREREREDJ6IiKiNnE4nZs+ejb/++gtLlizB6NGjPbqevXv3YubMmTCbzXj11Vc9vh4iIiIiIvofttoREVGrOZ1OzJkzB3/88QdefPFFjBkzxmNrEQQBH3zwAR588EGEh4dj3bp1DJ2IiIiIiLoYVjwREVGrCIKAuXPn4rfffsPixYtx0UUXeWwtNTU1mDt3LrZs2YL77rsPkyZNgkKh8Nh6iIiIiIioZQyeiIjojARBwLx58/Dzzz9j8eLFGDt2rMfWsnPnTsyaNQtOpxPLli3rEjvpERERERFRy9hqR0REpyUIAp577jn89NNPWLRokcd2ihMEAatXr8aUKVMQHx+PdevWMXQiIiIiIuriWPFERESnJAgCFixYgB9//BELFy7EpZde6pF1VFVVYfbs2di1axcefPBBPPDAA5DLee2EiIiIiKirY/BEREQtEgQBCxcuxPfff4/58+dj3LhxHlnHli1bMGfOHCgUCqxYsQKDBw/2yDqIiIiIiKjteLmYiIiaEQQBixYtwrfffot58+bhiiuu6PQ1OJ1OLF++HI888giSkpKwdu1ahk5ERERERN0MK56IiMiNIAhYvHgxvv76a8ybNw9XXXVVp6+hvLwcM2fOxP79+zF16lTcfffdbK0jIiIiIuqGGDwREZFEFEUsWbIEX375JZ599llcffXVnb6GDRs24Nlnn4WXlxfefvttDBo0qNPXQERERERE7YPBExERAWgKnV566SV89tlnePbZZzFhwoROPb/dbsdbb72Fjz/+GGPGjMHcuXPh5+fXqWsgIiIiIqL2xeCJiIggiiJeeeUVfPrpp5g9ezauueaaTj1/aWkpZsyYgUOHDuHJJ5/EbbfdBplM1qlrICIiIiKi9sfgiYjoPCeKIl599VX885//xMyZM3Hdddd16vl///13zJ8/H76+vnj33XeRmpraqecnIiIiIqKOw+CJiOg8JooiXnvtNaxduxaZmZm44YYbOu3cNpsNr732Gj799FNcfPHFmDNnDnx8fDrt/ERERERE1PEYPBERnadEUcSyZcvwySefYPr06bjxxhs77dxFRUXIzMzEsWPH8Mwzz+DGG29kax0RERERUQ/E4ImI6DwkiiLefPNNfPTRR3j66adx8803d9q5f/75ZyxcuBDBwcH48MMP0bdv3047NxERERERdS4GT0RE5xlRFLFixQp8+OGHePLJJ3HLLbd0ynmtVitefvllfPnll7jiiiswc+ZM6HS6Tjk3ERERERF5BoMnIqLziCiKWLlyJd577z088cQTuP322zvlvHl5ecjMzERxcTHmzJmDa665hq11RERERETnAbmnF0BERJ3n7bffxrvvvovHHnsMd9xxR6ec87vvvsNdd90FQRDw0Ucf4dprr2XoRERERER0nmDFExHReeLtt9/G6tWr8cgjj+Cuu+7q8POZTCa8+OKL+P7773HNNdfg6aefhpeXV4efl4iIiIiIug4GT0RE54H33nsPq1atwtSpU3HPPfd0+PmOHDmCGTNmoLy8HPPnz8dVV13V4eckIiIiIqKuh612REQ93Pvvv4/ly5djypQpuO+++zr0XKIo4osvvsA999wDlUqFNWvWMHQiIiIiIjqPseKJiKgH++ijj/DWW29h0qRJeOCBBzr0XEajEc8//zx+/vln/P3vf8eTTz4JjUbToeckIiIiIqKujcETEVEPtWbNGrzxxht48MEH8eCDD3bouXJycpCZmYmamhq88MILuOyyyzr0fERERERE1D2w1Y6IqAdau3YtXn/9dTzwwAN46KGHOuw8oijiX//6F+677z74+Phg7dq1DJ2IiIiIiEjCiicioh5m3bp1WLp0Ke677z5MnjwZMpmsQ85jMBiwYMEC/PHHH7jtttvwyCOPQK1Wd8i5iIiIiIioe2LwRETUg/zrX//CK6+8gnvuuQcPP/xwh4VOBw4cwIwZM9DY2IiXX34Zf/vb3zrkPERERERE1L2x1Y6IqIf49NNP8dJLL+Guu+7CtGnTOiR0EgQBa9aswQMPPIDg4GCsXbuWoRMREREREZ0SK56IiHqAzz//HEuWLMEdd9yBRx99tENCp7q6OsybNw8bNmzA3XffjYcffhhKJX+MEBERERHRqfE3BiKibu6LL77ACy+8gNtuuw2PP/54h4ROu3fvxqxZs2Cz2fDGG29g5MiR7X4OIiIiIiLqedhqR0TUjX311VdYtGgRbrnlFjz55JPtHjoJgoD33nsPkyZNQlRUFNauXcvQiYiIiIiIWo0VT0RE3dQ333yD559/HjfffDOeeuqpdg+dampqMGfOHGzbtg0PPPAAHnzwQSgUinY9BxERERER9WwMnoiIuqHvvvsOCxYswN///nc8/fTT7R46bdu2DbNnzwYAvPXWWxg6dGi7Hp+IiIiIiM4PbLUjIupmfvjhBzz33HO4/vrrMX369HYNnQRBwKpVqzB16lT06dMH69atY+hERERERERnjRVPRETdyI8//oi5c+fi2muvRWZmJuTy9rt+UFFRgdmzZ2PPnj2YMmUK7r333nY9PhERERERnX8YPBERdRP//ve/MXfuXEyYMAEzZ85s11Bo06ZNePbZZ6FSqbBy5UpkZGS027GJiIiIiOj8xUvZRETdwM8//4w5c+bg6quvxuzZs9stdHI4HFi2bBkeffRRpKSkYO3atQydiIiIiIio3bDiiYioi/v1118xe/ZsXHHFFZgzZ067hU5lZWWYOXMmDh48iEcffRR33nknW+uIiIiIiKhdMXgiIurCfv/9d8ycOROXX3455s2b127B0F9//YV58+ZBp9Ph7bffxsCBA9vluERERERERCdi8ERE1EX98ccfmDFjBi677DI899xz7RI62e12LFu2DGvXrsXf/vY3PPvss/D19W2H1RIRERERETXH4ImIqAv6888/kZmZiUsuuQTz589vl9CppKQEM2bMwOHDh/HUU0/hlltugUwma4fVEhERERERtYzBExFRF/PXX3/hmWeewdixY7FgwQIoFIpzPuavv/6KBQsWwN/fH++99x5SUlLaYaVERERERESnx+CJiKgL2bBhA6ZPn44xY8Zg4cKF5xw62Ww2LF26FJ999hkuu+wyzJo1C97e3u20WiIiIiIiotNj8ERE1EVs2rQJTz/9NEaPHo1FixZBqTy3b9EFBQWYMWMG8vPzMXPmTFx//fVsrSMiIiIiok7F4ImIqAvYvHkznnrqKYwcObJdQqcffvgBL7zwAkJDQ/HBBx+gb9++7bRSIiIiIiKi1mPwRETkYVu2bME//vEPDB8+HIsXL4ZKpTrrY1ksFixZsgTffPMNrrrqKmRmZkKn07XjaomIiIiIiFqPwRMRkQdt27YNTz75JIYOHXrOodOxY8eQmZmJ0tJSzJ07F+PHj2drHRERERERedS5789NRERnZfv27XjiiScwZMgQLFmyBGq1+qyOI4oivvnmG9x1110AgI8++ggTJkxg6ERERERERB7HiiciIg/YuXMnHn/8cWRkZODll18+69DJZDLhhRdewI8//ojrrrsOTz31FLRabTuvloiIiIiI6OwweCIi6mS7du3CY489hrS0tHMKnQ4fPozMzExUVVVh4cKFuOKKK9p5pUREREREROeGwRMRUSfavXs3HnvsMQwcOBBLly6FRqNp8zFEUcTnn3+OpUuXIj4+Hh9//DFiY2M7YLVERERERETnhsETEVEn2bt3Lx577DGkpqaedejU2NiIhQsX4tdff8XNN9+Mxx9//KwrpoiIiIiIiDoagyciok6wb98+PPLII0hOTsarr756VnOYsrKykJmZCYPBgCVLluDiiy/ugJUSERERERG1H+5qR0TUwQ4cOIBp06YhKSkJr732Gry8vNr0eFEUsXbtWtx///3w9/fHJ598wtCJiIiIiIi6BVY8ERF1oIMHD2Lq1Kno27fvWYVOBoMB8+bNw19//YU77rgD06ZNg0ql6qDVEhERERERtS8GT0REHSQrKwtTp05F79698cYbb0Cn07Xp8fv27cOMGTNgNpuxdOlSjBkzpoNWSkRERERE1DHYakdE1AFycnIwdepU9OrVC8uWLWtT6CQIAj788ENMnDgRYWFhWLt2LUMnIiIiIiLqlljxRETUzg4dOoSHH34YcXFxeOONN6DX61v92NraWsydOxebNm3Cfffdh0mTJkGp5LdqIiIiIiLqnvjbDBFROzp8+DCmTJmC6OhovPnmm/D29m71Y3ft2oVZs2bB4XBg2bJlGDFiRAeulIiIiIiIqOOx1Y6IqJ0cOXJECp3eeuutVodOgiDg7bffxuTJkxEbG4u1a9cydCIiIiIioh6BFU9ERO3g6NGjmDJlCiIiIvDmm2/Cx8enVY+rqqrCnDlzsGPHDjz44IOYOHEi5HJeEyAiIiIiop6BwRMR0Tk6duwYJk+ejNDQUCxfvhy+vr6tetzWrVsxZ84cyGQyLF++HBdccEEHr5SIiIiIiKhz8bI6EdE5cIVOISEhWLFiRatCJ6fTieXLl2PatGno27cv1q1bx9CJiIiIiIh6JFY8ERGdpfz8fEyePBmBgYFYvnw5/Pz8zviYiooKzJw5E/v27cPDDz+Me+65h611RERERETUYzF4IiI6CwUFBZg0aRICAgKwYsUK+Pv7n/ExGzZswNy5c6HRaLB69WqkpaV1+DqJiIiIiIg8icETEVEbFRYWYtKkSfDz88OKFSsQEBBw2vvb7XYsX74ca9aswejRozFv3rxWVUcRERERERF1dwyeiIjaoKioCJMnT4aPjw9WrlyJwMDA096/tLQUM2fORHZ2Np544gncfvvtkMlknbRaIiIiIiIiz2LwRETUSsXFxZg0aRJ0Ol2rQqfff/8dCxYsgI+PD9577z2kpqZ20kqJiIiIiIi6BgZPREStUFJSgkmTJkGr1WLlypUICgo65X1tNhtee+01fPrpp7j44osxZ84c+Pj4dOJqiYiIiIiIugYGT0REZ1BaWopJkyZBo9Fg1apVCA4OPuV9i4qKMGPGDBw9ehTTp0/HTTfdxNY6IiIiIiI6bzF4IiI6jePHj2Py5MlQKpVYuXIlQkJCTnnfn3/+GQsXLkRQUBA++OAD9OvXrxNXSkRERERE1PUweCIiOoWysjJMmjQJMpkMq1atQmhoaIv3s1qteOWVV/DFF19g3LhxmDVrFvR6fSevloiIiIiIqOth8ERE1IKKigpMmjQJALBq1SqEhYW1eL+8vDzMmDEDhYWFmD17Nq699lq21hEREREREf2X3NMLICLqDCtXrsSrr74KQRDOeN+Kigo89NBDEEURq1atQnh4eIv3++6773DXXXfB6XTio48+wnXXXcfQiYiIiIiI6ASseCKiHs9isWDlypWoqKhAfX09nn32WcjlLefulZWVmDx5MhwOB1avXo2IiIhm9zGbzXjxxRfx3XffYcKECZg+fTq8vLw6+mkQERERERF1OwyeiKjH27x5M6qqqqBWq/H222/D6XTiiSeegF6vh0ajke5XVVWFSZMmwWq1YvXq1YiMjGx2rNzcXGRmZqKsrAzPPfccrr766s58KkRERERERN0KW+2IqMf79ddf4XA4EBwcDL1ej3feeQdDhgzBPffcA5vNBgCorq7G5MmTYbFYsGrVKkRFRbkdQxRFfPnll7j77ruhVCrx8ccfM3QiIiIiIiI6A1Y8EVGPZrPZ8OOPP0qVTb6+vmhsbERBQQEqKirw+uuv44EHHsDkyZNhNBqxevVqREdHux3DaDTi+eefx88//4wbbrgB//jHP9wqpYiIiIiIiKhlDJ6IqEfbsmULKioqEBAQAKCpcqmxsREymQwWiwULFizA999/D61Wi9WrVyMmJsbt8Tk5OZgxYwaqq6uxaNEijBs3zhNPg4iIiIiIqFti8EREPZqrzc5VoVRXVweLxQKVSgVBENDQ0IDNmzfjP//5D2JjY6XHiaKI//u//8Orr76K3r1744033mgWShEREREREdHpMXgioi6v0WSByWyF3emEUqGARqWEn48OMpnstI+z2+1ubXaiKKKiogIAIJPJ4HQ6IZPJYLfb8cADD2DXrl3QarUwGAxYsGAB/vjjD9xyyy147LHHoFarO/x5EhERERER9TQMnoioSxFFETl5pdh/pAi5BWU4kFuM0oo6OAUBoihCJpNBLpch0M8bqb2j0C8+Akm9IpGeHA+lQuF2rO3bt6OsrAx+fn4AmqqdrFYrFAoFbDYbRFGERqOBIAg4dOgQrrzySixduhRz585FQ0MDXnrpJYwdO9YTnwYiIiIiIqIegcETEXUJZosN/9meha9+24EDR0tgs9kBoKnCSa2EWqWADDKIECEIIiqq61FUVo1/b9wHpUKB2IggXHvxEFx+4UAE+XsDaGqzs9vt0Gg0UrWTKIqw2+0QRRFqtRpyuRxyuRyCIODPP//EJZdcgvHjx2PlypWIjIz05KeEiIiIiIio22PwREQeJQgCvvljF975/A9U1BggAvDVaxHQilY6F6vNjvzSKrz60Q945/M/cOO4obhr/IX4/vvvoVarIZPJUFNTA4vFAlEU3UInoKnKyvV3fX091Go1goODO+opExERERERnTcYPBGRxxSX1+CVD77Hpj1HIJMBgX7eUCkVZ37gSTRqFUIDVXAKAgyNZrz/5Z/48c8dOF5rga+vr1Tt5JrpdGLoJAgCbDZb03E0GjgcDqxduxZarRZLly7lbCciIiIiIqJzIPf0Aojo/PTL5v14YM5qrN95CD56LUICfM8qdDqRQi5HgK8eQf4+yC2sACKGwOnXC9XV1TCZTM1CJ4fDAZvNBrlcDo1GI7XdWSwW/Otf/8K///3v9niqRERERERE5y1WPBFRp/v8l214bc2PsNmdCAvyg1zeupa61lIq5bBbGiCTARZtJBrUNYCsSAqdXHOeBEGAQqGQdrYDAIVCAb1eD6VSicDAwHZdFxERERER0fmGFU9E1Km+/mMnXv3oRzidAkICfNo9dAIAs8kMu90GOZxw2CzQRSQhsM8IaYi4xWKR2u5cO+X5+fkhNjYWSUlJ6Nu3L0RRRGZmJmpqatp9fUREREREROcLBk9E1Gm27svFKx98D6cgINDPu9XDw9vKYDBAFEQ47A447VYIDju8wpOgCk6ExWIBAKhUKvj5+SEmJgZJSUmIj49HQEAAlEolZDIZwsPDceTIEWRmZkIQhA5ZJxERERERUU/HVjsi6hQNRgte/uB7WKx2hAb6dljoJEJEXV0dnILzf7vVOW0Q5HLoowdCMFYi2FcDHx8fqFQq98eKIhwOB6xWKywWC+x2O/7973/j+++/x4QJEzpkvURERERERD0Zgyci6hSr/+835JVUIsTfp8NCJwAwGU0wm80QBdH9Aw4rVF4+CO8/Fj6NhyA4HTCZTLBarbBarXA6nQAAuVwOrVaLwMBAjB49GsnJyRg0aFCHrZeIiIiIiKgnY/BERB1u58E8fPnbDui9NFCe4851Z1JTUwNRFKHVamG1WgE0hUkKhQKiwwqrQgeTWQ1nTTE0Gg28vLyQkpKC/v37IzExEX369EGfPn0QERHRoQEZERERERHR+YDBExF1uE//vQUWmx3hQX7tetyqkqPY8vVKJA65DP2GjgMAREVFISg4CIcPH4YoipAr5JDL5ZDJZFCplJCrNAhIuRAz7pqB5KS+iI+Ph1qtbtd1ERERERERURMGT0TUoYqOV2Pz3iPw9tI0qyD6bvnT0PuHYOzt09vtfHK5HGq1GhqNBvoAPby9vaHVaqHRaKBQKGCzO1DbYIRPWAL69u3bbuclIiIiIiKi5rirHRF1qB/W74HJYoNep+20cyoVSiQnJSM2NhaBgYHQ6XRQKJpa/NQqJURBxFe/7+y09RAREREREZ2vGDwRUYcRRRE/bdgLlVIBeReal+St02JPTj5KK2o9vRQiIiIiIqIeja12RNRhyqvrUVXXCC9N62YoHdr2M47s+AXDr50Mq9GAo7v/QGNdJVQaL0T0HoTkEVdBoVSd8Th2qxnbf/wANaV5SB11DRIGjnL7uJdGjaq6BhwpLENkaMBZPTciIiIiIiI6M1Y8EVGHyS0sh9Vmh0bdtow7f/9G7PvPZ/AODEdc/xFQabyQv38D9v7xf2d8rMVowKavVqCurOD/27uXGDvLOo7jv3fmzJmZ3oZCabXttNhOLFJaEKFgFQSk1YQqqYIXjCYKJkpMTIwxujLGxIUujAs3unBjXBgTF5p4i0aJN2IgouAlkqkiFEoLtnOGuZ0553VRIGmmtTO1zxm0n8/yXN7nfzaTzDfP+7y5Zt/dC6JTkvT39700HwAAAOXY8QQU89jjR1InabxwvtJiHXvib7nxro9n1dr1SZLO9e3c/+0v5/Bjv88Ve2/P0MrTPx1v8vjRPPC9r6c9M5Xrbv9QLh098+HhdV3nr4cOL2kuAAAAlsaOJ6CYp47+K3VdL/l7r9r9xpeiU5L0NwaycezqpK5z4uiTp/3O8SP/zK+/+9V05udywx0f+Y/RKUkGGo38/fCxJc8GAADA4tnxBBQzM9tOlt6dMnLp5gWvDa86ucupPTu94L3nnjqU8Yfvz+Dwyuw5cG9WXXTpWdeoqmR2rr304QAAAFg0O56AYjrdbnIOD7NrNIcWvFb1nfxzVdfdBe9NHHsynfZs1qzbmJVrLlnUGlVVpXsOu7EAAABYPOEJKGZo8OxPoDsfLtv1hoy+Zk+eHn8kD/3kW+l2O2f9Tl3XGRyw6RMAAKAk/3UBxVy0emX6qnPY8rRkVXbffGeqqsrjf3ogSfLafe9NX9+ZDzWf73Rz8ciqHswGAABw4RKegGK2j65PXdfp1nXxAFVVVXa96Z1Jqjz+p98mqfPafXefMT51u91csX1T0ZkAAAAudMITUMzYllekOdDI3Nx8T267Oxmf3pGqqvKPR3+Tuq5zzf73LYhP3bpO/cJ8AAAAlOOMJ6CYrRvXZcVQMzOneXpc3T15SPh/uh3uXFRVlStvOpitV+7N0+N/zEM//ma6nVPPfJqbm09zoJGxLRvO69oAAACcyo4noJjmQCPX7x7Lj371h2T1ilPem52ZPPmZ4ZUvvbZjz/7s2LP/tNcavfy6jF5+3Smvrdu0PQfu+9KCz1ZVlV03Hcyumw6e9lqtqels3nBxto8KTwAAACXZ8QQUdeDma9Lo71+w6+nIoUeTJBet39LTebrdbjqdbu645XUZaJzf3VYAAACcyo4noKjrdm7LZZsuzfgTRzJ08Uj+9uBP03ru6Tz12B/S32hm684bejpPa2omq1YM5S1v2N3TdQEAAC5EdjwBRfX39+XgbdemrpO59nzGf/+LPPP3P2fd5rG8/o6PZMWai3s2S7fbzdT0XG7Zc0XWXzLSs3UBAAAuVHY8AcXdccu1+cH9D+eRx/6Z/R/6XKqqWpY5nj0xmXVrV+fed96yLOsDAABcaOx4AoobbDbyqXsOZMXwYI63ppZlhqmZudR1ct979mXj+rXLMgMAAMCFRngCeuI12zblA2+/MXPt+UzPzPV07fZ8JydaU7nxdTty4E1X93RtAACAC5nwBPTM+9/2xtx6/c4cn5zKzGz77F84D+Y7nRz7VyuXb3tlPn3P29PX588eAABAr/gPDOiZ5kAjn/3oO3LjNTtyvPV8pgrvfGrPd3L0uVbGtmzIFz9xd9atXV10PQAAAE4lPAE9NTzUzBc+/u7s27srk1PTOXa8lW5dn9c16rrOxOTJa18xtilf+cwHnOsEAACwDDzVDui54aFmPv+xu3L1jq352nd+liPPnsja1SszNDjwX1+7Pd/Js8cnM9hs5H23782H77w1q1YMnYepAQAAWCrhCVgW/f19eddbb8j1u8fypW98P797ZDzHJ5/PquGhrBweTFVVi75WXdeZmWtnYnI6depsH92QT37w9ly7c1vBXwAAAMDZVHV99ntcJiYmMjIykhMnTmTNmjW9mAu4gHQ63dz/4F/yvZ8/lN89Mp7p2bn09/VlqDmQwWYjzYHGKSGqruu05zuZnZvP7Fw77U4nzUYjr77sFTn45mtz2+t3ZeXw4DL+IgAAgP9vi21FwhPwsjL+xDP54S8fzoOPHsqhJ49mZrad9vz8gvDU39+XweZANq1fm6t2bM3+vbty1Y4tnloHAADQA4ttRW61A15Wtm1en/vesy9JMj0zl/Enn8mhJ45mano2s+35DDT6M9QcyOgrL8nYlg0ZWbVimScGAADgTIQn4GVreKiZnds3Z+f2zcs9CgAAAOfAPSkAAAAAFCE8AQAAAFCE8AQAAABAEcITAAAAAEUITwAAAAAUITwBAAAAUITwBAAAAEARwhMAAAAARQhPAAAAABQhPAEAAABQhPAEAAAAQBHCEwAAAABFCE8AAAAAFCE8AQAAAFCE8AQAAABAEcITAAAAAEUITwAAAAAUITwBAAAAUITwBAAAAEARwhMAAAAARQhPAAAAABQhPAEAAABQhPAEAAAAQBHCEwAAAABFCE8AAAAAFCE8AQAAAFCE8AQAAABAEcITAAAAAEUITwAAAAAUITwBAAAAUITwBAAAAEARwhMAAAAARQhPAAAAABQhPAEAAABQhPAEAAAAQBHCEwAAAABFCE8AAAAAFCE8AQAAAFCE8AQAAABAEcITAAAAAEUITwAAAAAUITwBAAAAUITwBAAAAEARwhMAAAAARTQW86G6rpMkExMTRYcBAAAA4OXvxUb0YjM6k0WFp1arlSQZHR39L8cCAAAA4P9Fq9XKyMjIGd+v6rOlqSTdbjeHDx/O6tWrU1XVeR0QAAAAgP8tdV2n1Wpl48aN6es780lOiwpPAAAAALBUDhcHAAAAoAjhCQAAAIAihCcAAAAAihCeAAAAAChCeAIAAACgCOEJAAAAgCKEJwAAAACK+DeJHt5yFBvkhAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -132,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 29, "id": "e75376cb-d467-47fd-92bd-84ef21a35f4f", "metadata": {}, "outputs": [ @@ -148,11 +148,15 @@ "source": [ "# Our dataset is comprised of discrete valued data, so we will utilize the\n", "# G^2 (Chi-square) CI test.\n", - "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", + "ci_estimator = GSquareCITest(data_type='discrete')\n", + "# ci_estimator = CategoricalCITest(lambda_='log-likelihood')\n", + "# ci_estimator = CausalLearnCITest()\n", "\n", "# Since our data is entirely discrete, we can also use the G^2 test as our\n", "# CD test.\n", - "cd_estimator = GSquareCITest(data_type=\"discrete\")\n", + "cd_estimator = GSquareCITest(data_type='discrete')\n", + "# cd_estimator = CategoricalCITest(lambda_='log-likelihood')\n", + "# cd_estimator = CausalLearnCITest()\n", "\n", "alpha = 0.05\n", "learner = PsiFCI(\n", @@ -175,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 30, "id": "3d6ac82a-6a5c-4c46-b8c1-7cd09101c5f8", "metadata": { "tags": [] @@ -191,6 +195,8 @@ "Not enough samples. 1200 is too small. Need 1440.\n", "Not enough samples. 1200 is too small. Need 1440.\n", "Not enough samples. 1200 is too small. Need 1440.\n", + "Not enough samples. 1200 is too small. Need 1280.\n", + "Not enough samples. 1200 is too small. Need 1280.\n", "Not enough samples. 1800 is too small. Need 1920.\n", "Not enough samples. 1800 is too small. Need 1920.\n", "Not enough samples. 1800 is too small. Need 1920.\n", @@ -198,7 +204,261 @@ "Not enough samples. 1200 is too small. Need 1440.\n", "Not enough samples. 1200 is too small. Need 1440.\n", "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1280.\n" + "Not enough samples. 1200 is too small. Need 1280.\n", + "Updated separating set for Raf, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Raf, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for PIP3, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for PIP3, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for P38, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for P38, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for P38, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKA, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for Jnk, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for Jnk, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Jnk, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for Plcg, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for Plcg, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for Akt, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Akt, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Erk, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for PIP2, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for PIP2, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for PKC, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKC, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKC, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKC, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKC, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for PKC, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for Mek, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), Plcg with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), Akt with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), PIP2 with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), PIP3 with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), Erk with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), Raf with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), P38 with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 0), Mek with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 4), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 5), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 7), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 8), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 10), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 11), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 13), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 13), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 13), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 13), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 13), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 13), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 13), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", + "Updated separating set for ('F', 1), Raf with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), PIP3 with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), P38 with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), Jnk with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), Plcg with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), Akt with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), Erk with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), PIP2 with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 1), Mek with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), Raf with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), P38 with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), Plcg with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), Erk with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), PIP2 with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), PIP3 with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), Jnk with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), Akt with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 2), Mek with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 3), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 6), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 9), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 12), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", + "Updated separating set for ('F', 14), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for ('F', 14), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for ('F', 14), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for ('F', 14), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for ('F', 14), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for ('F', 14), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", + "Updated separating set for ('F', 14), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n" ] } ], @@ -209,9 +469,11 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 32, "id": "7c25044c-99f7-4255-87f7-9a5d845b77e6", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [ { "name": "stdout", @@ -235,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 33, "id": "9f3e89fb-9ef6-4ad8-8198-164ba3032dd5", "metadata": {}, "outputs": [ @@ -248,470 +510,486 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "PKC\n", - "\n", - "PKC\n", + "Raf\n", + "\n", + "Raf\n", "\n", - "\n", + "\n", "\n", - "P38\n", - "\n", - "P38\n", + "Mek\n", + "\n", + "Mek\n", "\n", - "\n", + "\n", "\n", - "PKC->P38\n", - "\n", - "\n", - "\n", + "Raf->Mek\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", - "Jnk\n", - "\n", - "Jnk\n", - "\n", - "\n", - "\n", - "PKC->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", "\n", - "Plcg\n", - "\n", - "Plcg\n", + "Jnk\n", + "\n", + "Jnk\n", "\n", - "\n", + "\n", "\n", - "PIP2\n", - "\n", - "PIP2\n", + "P38\n", + "\n", + "P38\n", "\n", - "\n", + "\n", "\n", - "Plcg->PIP2\n", - "\n", - "\n", - "\n", + "Jnk->P38\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "PIP3\n", - "\n", - "PIP3\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", "\n", - "\n", - "\n", - "Plcg->PIP3\n", - "\n", - "\n", + "\n", + "\n", + "Jnk->PKC\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "Raf\n", - "\n", - "Raf\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "Mek\n", - "\n", - "Mek\n", + "PKA\n", + "\n", + "PKA\n", "\n", - "\n", - "\n", - "Raf->Mek\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", "\n", - "\n", + "\n", "\n", - "PIP3->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Jnk->P38\n", - "\n", - "\n", - "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "Akt\n", - "\n", - "Akt\n", - "\n", - "\n", - "\n", - "Erk\n", - "\n", - "Erk\n", + "\n", + "Akt\n", "\n", "\n", "\n", "Akt->Erk\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "PKA\n", - "\n", - "PKA\n", + "\n", + "\n", + "('F', 13)\n", + "\n", + "('F', 13)\n", "\n", - "\n", + "\n", + "\n", + "('F', 13)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 13)->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 12)\n", + "\n", + "('F', 12)\n", + "\n", + "\n", "\n", - "PKA->Erk\n", - "\n", - "\n", - "\n", + "('F', 12)->Raf\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "('F', 12)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "('F', 12)->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "('F', 12)->Plcg\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "('F', 12)->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 11)\n", + "\n", + "('F', 11)\n", + "\n", + "\n", + "\n", + "('F', 11)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 11)->Akt\n", + "\n", + "\n", + "\n", + "\n", "\n", + "('F', 8)\n", + "\n", + "('F', 8)\n", + "\n", + "\n", + "\n", + "('F', 8)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 8)->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)\n", + "\n", + "('F', 14)\n", + "\n", + "\n", + "\n", + "('F', 14)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 14)->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", "('F', 4)\n", - "\n", - "('F', 4)\n", + "\n", + "('F', 4)\n", "\n", "\n", - "\n", + "\n", "('F', 4)->Raf\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->PKA\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 4)->Akt\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 4)->PKA\n", - "\n", - "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg->PIP2\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 10)\n", - "\n", - "('F', 10)\n", - "\n", - "\n", - "\n", - "('F', 10)->PIP3\n", - "\n", - "\n", + "\n", + "('F', 10)\n", "\n", "\n", - "\n", + "\n", "('F', 10)->Jnk\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 10)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 9)\n", - "\n", - "('F', 9)\n", - "\n", - "\n", - "\n", - "('F', 9)->PKC\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 9)->Jnk\n", - "\n", - "\n", + "\n", + "\n", + "('F', 10)->PIP3\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 9)->Akt\n", - "\n", - "\n", + "\n", + "\n", + "('F', 10)->PIP2\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 5)\n", - "\n", - "('F', 5)\n", - "\n", - "\n", - "\n", - "('F', 5)->PIP3\n", - "\n", - "\n", + "\n", + "('F', 5)\n", "\n", "\n", - "\n", + "\n", "('F', 5)->Jnk\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 5)->Akt\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 11)\n", - "\n", - "('F', 11)\n", - "\n", - "\n", - "\n", - "('F', 11)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 11)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 1)\n", - "\n", - "('F', 1)\n", - "\n", - "\n", - "\n", - "('F', 1)->PKC\n", - "\n", - "\n", + "\n", + "\n", + "('F', 5)->PIP3\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 1)->PKA\n", - "\n", - "\n", + "\n", + "\n", + "('F', 5)->PIP2\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 0)\n", - "\n", - "('F', 0)\n", - "\n", - "\n", - "\n", - "('F', 0)->PKC\n", - "\n", - "\n", + "\n", + "('F', 0)\n", "\n", "\n", - "\n", + "\n", "('F', 0)->Jnk\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)->PKC\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 0)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)\n", - "\n", - "('F', 13)\n", - "\n", - "\n", - "\n", - "('F', 13)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)->Erk\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", "('F', 3)\n", - "\n", - "('F', 3)\n", - "\n", - "\n", - "\n", - "('F', 3)->PKC\n", - "\n", - "\n", + "\n", + "('F', 3)\n", "\n", "\n", - "\n", + "\n", "('F', 3)->Jnk\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->PKC\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 3)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 6)\n", - "\n", - "('F', 6)\n", - "\n", - "\n", - "\n", - "('F', 6)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 12)\n", - "\n", - "('F', 12)\n", - "\n", - "\n", - "\n", - "('F', 12)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 12)->Plcg\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 12)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 12)->PIP3\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 2)\n", - "\n", - "('F', 2)\n", + "\n", + "('F', 2)\n", "\n", "\n", - "\n", + "\n", "('F', 2)->PKC\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 2)->PKA\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", "\n", - "\n", - "\n", - "('F', 14)\n", - "\n", - "('F', 14)\n", + "\n", + "\n", + "('F', 1)->PKC\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 14)->PKC\n", - "\n", - "\n", + "\n", + "\n", + "('F', 1)->PKA\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 14)->Raf\n", - "\n", - "\n", + "\n", + "\n", + "('F', 9)\n", + "\n", + "('F', 9)\n", "\n", - "\n", - "\n", - "('F', 14)->Mek\n", - "\n", - "\n", + "\n", + "\n", + "('F', 9)->Jnk\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 14)->Erk\n", - "\n", - "\n", + "\n", + "\n", + "('F', 9)->PKC\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 8)\n", - "\n", - "('F', 8)\n", + "\n", + "\n", + "('F', 9)->Akt\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 8)->Raf\n", - "\n", - "\n", + "\n", + "\n", + "('F', 6)\n", + "\n", + "('F', 6)\n", "\n", - "\n", - "\n", - "('F', 8)->Mek\n", - "\n", - "\n", + "\n", + "\n", + "('F', 6)->PKC\n", + "\n", + "\n", "\n", "\n", "\n", "('F', 7)\n", - "\n", - "('F', 7)\n", + "\n", + "('F', 7)\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 14, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -727,7 +1005,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 21, "id": "afb1ce35-7715-417c-aa77-eccd5ebf8280", "metadata": {}, "outputs": [ @@ -735,7 +1013,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "['Plcg', 'PIP3', ('F', 10), ('F', 5)]\n" + "['Plcg', 'PIP3']\n" ] } ], @@ -745,7 +1023,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 35, "id": "64b61853-3c5e-4cd4-bb9b-5b4e79a9e292", "metadata": {}, "outputs": [ @@ -755,7 +1033,7 @@ "(1, 2)" ] }, - "execution_count": 29, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1080,7 +1358,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 40, "id": "d27c0dab-a6bf-48cf-90b7-f1298ca89b12", "metadata": {}, "outputs": [ @@ -1088,40 +1366,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "{}\n" + "{'obs_skel_graph': , 'pag': }\n", + "2\n" ] } ], "source": [ - "print(ctx.state_variables)" + "print(ctx.state_variables)\n", + "print(learner.skeleton_learner_.n_iters_)" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 37, "id": "b6e4aa12-a6f6-4afd-b810-02a852fdb623", "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'obs_skel_graph'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_2117/2603007690.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mobs_graph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate_variables\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'obs_skel_graph'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m: 'obs_skel_graph'" - ] - } - ], + "outputs": [], "source": [ "obs_graph = ctx.state_variables['obs_skel_graph']" ] }, { "cell_type": "code", - "execution_count": 15, - "id": "b9daa53d-0216-4443-aa31-fbbdf8c19b4a", + "execution_count": 39, + "id": "0b8c3ca6-cc78-43d8-a2fa-b9f0dd299809", "metadata": {}, "outputs": [ { @@ -1133,146 +1401,355 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "PKC\n", - "\n", - "PKC\n", + "Raf\n", + "\n", + "Raf\n", "\n", - "\n", + "\n", "\n", - "P38\n", - "\n", - "P38\n", + "Mek\n", + "\n", + "Mek\n", "\n", - "\n", - "\n", - "PKC->P38\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "Raf->Mek\n", + "\n", + "\n", "\n", - "\n", - "\n", - "Jnk\n", - "\n", - "Jnk\n", + "\n", + "\n", + "Mek->Raf\n", + "\n", + "\n", "\n", - "\n", - "\n", - "PKC->Jnk\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", "\n", "\n", - "\n", + "\n", "Plcg\n", - "\n", - "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "PIP3->Plcg\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "PIP2\n", - "\n", - "PIP2\n", + "\n", + "PIP2\n", "\n", - "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", "Plcg->PIP2\n", - "\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "PIP2->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP2->Plcg\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", "\n", - "PIP3\n", - "\n", - "PIP3\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "P38->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "P38->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Erk->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n", + "Erk->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Akt->Erk\n", + "\n", + "\n", "\n", - "\n", - "\n", - "Plcg->PIP3\n", - "\n", - "\n", "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "dot_graph = draw(obs_graph.to_directed(), direction=\"LR\")\n", + "dot_graph" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "b9daa53d-0216-4443-aa31-fbbdf8c19b4a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "Raf\n", - "\n", - "Raf\n", + "\n", + "Raf\n", "\n", "\n", - "\n", + "\n", "Mek\n", - "\n", - "Mek\n", + "\n", + "Mek\n", "\n", "\n", - "\n", + "\n", "Raf->Mek\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "PIP3->PIP2\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", "\n", "\n", - "\n", + "\n", "Jnk->P38\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "Akt\n", - "\n", - "Akt\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "Jnk->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", "\n", "\n", - "\n", + "\n", "Erk\n", - "\n", - "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", "\n", "\n", "\n", "Akt->Erk\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", "\n", - "PKA\n", - "\n", - "PKA\n", + "PIP2\n", + "\n", + "PIP2\n", "\n", - "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", "\n", - "PKA->Erk\n", - "\n", - "\n", - "\n", + "Plcg->PIP2\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 15, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } diff --git a/doc/references.bib b/doc/references.bib index 8f3c1c376..3b11551d1 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -140,6 +140,23 @@ @article{dai2022independence % Conditional Testing +@article{cressieread1984, + issn = {00359246}, + url = {http://www.jstor.org/stable/2345686}, + abstract = {This article investigates the family {Iλ;λ ∈ R} of power divergence statistics for testing the fit of observed frequencies {Xi;i = 1,...,k} to expected frequencies {Ei;i = 1,...,k}. From the definition 2nIλ = 2/λ(λ + 1) ∑ki = 1 Xi{(Xi/Ei)λ - 1}; λ ∈ R, it can easily be seen that Pearson's X2 (λ = 1), the log likelihood ratio statistic (λ = 0), the Freeman-Tukey statistic (λ = -1/2) the modified log likelihood ratio statistic (λ = -1) and the Neyman modified X2 (λ = -2), are all special cases. Most of the work presented is devoted to an analytic study of the asymptotic difference between different Iλ, however finite sample results have been presented as a check and a supplement to our conclusions. A new goodness-of-fit statistic, where λ = 2/3, emerges as an excellent and compromising alternative to the old warriors, I0 and I1.}, + author = {Noel Cressie and Timothy R. C. Read}, + journal = {Journal of the Royal Statistical Society. Series B (Methodological)}, + number = {3}, + pages = {440--464}, + publisher = {[Royal Statistical Society, Wiley]}, + title = {Multinomial Goodness-of-Fit Tests}, + urldate = {2023-03-16}, + volume = {46}, + year = {1984} +} + + + @article{frenzel_partial_2007, title = {Partial {Mutual} {Information} for {Coupling} {Analysis} of {Multivariate} {Time} {Series}}, volume = {99}, diff --git a/dodiscover/ci/__init__.py b/dodiscover/ci/__init__.py index ecdb6f27a..9ca77702f 100644 --- a/dodiscover/ci/__init__.py +++ b/dodiscover/ci/__init__.py @@ -1,4 +1,5 @@ from .base import BaseConditionalIndependenceTest +from .categorical_test import CategoricalCITest, CausalLearnCITest from .ccmi_test import ClassifierCMITest from .clf_test import ClassifierCITest from .cmi_test import CMITest diff --git a/dodiscover/ci/categorical_test.py b/dodiscover/ci/categorical_test.py new file mode 100644 index 000000000..e9fd0d03c --- /dev/null +++ b/dodiscover/ci/categorical_test.py @@ -0,0 +1,200 @@ +import logging +from functools import reduce +from typing import Optional, Set, Tuple + +import pandas as pd +from scipy import stats + +from dodiscover.ci.base import BaseConditionalIndependenceTest +from dodiscover.typing import Column + + +# copied from pgmpy +def power_divergence(X, Y, Z, data, lambda_="cressie-read"): + """ + Computes the Cressie-Read power divergence statistic [1]. The null hypothesis + for the test is X is independent of Y given Z. A lot of the frequency comparison + based statistics (eg. chi-square, G-test etc) belong to power divergence family, + and are special cases of this test. + + Parameters + ---------- + X: int, string, hashable object + A variable name contained in the data set + + Y: int, string, hashable object + A variable name contained in the data set, different from X + + Z: list, array-like + A list of variable names contained in the data set, different from X and Y. + This is the separating set that (potentially) makes X and Y independent. + Default: [] + + data: pandas.DataFrame + The dataset on which to test the independence condition. + + lambda_: float or string + The lambda parameter for the power_divergence statistic. Some values of + lambda_ results in other well known tests: + "pearson" 1 "Chi-squared test" + "log-likelihood" 0 "G-test or log-likelihood" + "freeman-tukey" -1/2 "freeman-tukey Statistic" + "mod-log-likelihood" -1 "Modified Log-likelihood" + "neyman" -2 "Neyman's statistic" + "cressie-read" 2/3 "The value recommended in the paper + :footcite:`cressieread1984`" + + Returns + ------- + CI Test Results: tuple + Returns a tuple (chi, p_value, dof). `chi` is the + chi-squared test statistic. The `p_value` for the test, i.e. the + probability of observing the computed chi-square statistic (or an even + higher value), given the null hypothesis that X \u27C2 Y | Zs is True. + If boolean = True, returns True if the p_value of the test is greater + than `significance_level` else returns False. + + See Also + -------- + scipy.stats.power_divergence + + References + ---------- + .. footbibliography:: + + Examples + -------- + >>> import pandas as pd + >>> import numpy as np + >>> data = pd.DataFrame(np.random.randint(0, 2, size=(50000, 4)), columns=list('ABCD')) + >>> data['E'] = data['A'] + data['B'] + data['C'] + >>> chi_square(X='A', Y='C', Z=[], data=data, boolean=True, significance_level=0.05) + True + >>> chi_square(X='A', Y='B', Z=['D'], data=data, boolean=True, significance_level=0.05) + True + >>> chi_square(X='A', Y='B', Z=['D', 'E'], data=data, boolean=True, significance_level=0.05) + False + """ + + # Step 1: Check if the arguments are valid and type conversions. + if hasattr(Z, "__iter__"): + Z = list(Z) + else: + raise (f"Z must be an iterable. Got object type: {type(Z)}") + + if (X in Z) or (Y in Z): + raise ValueError(f"The variables X or Y can't be in Z. Found {X if X in Z else Y} in Z.") + + # Step 2: Do a simple contingency test if there are no conditional variables. + if len(Z) == 0: + chi, p_value, dof, expected = stats.chi2_contingency( + data.groupby([X, Y]).size().unstack(Y, fill_value=0), lambda_=lambda_ + ) + + # Step 3: If there are conditionals variables, iterate over unique states and do + # the contingency test. + else: + chi = 0 + dof = 0 + for z_state, df in data.groupby(Z): + try: + c, _, d, _ = stats.chi2_contingency( + df.groupby([X, Y]).size().unstack(Y, fill_value=0), lambda_=lambda_ + ) + chi += c + dof += d + except ValueError: + # If one of the values is 0 in the 2x2 table. + if isinstance(z_state, str): + logging.info( + f"Skipping the test {X} \u27C2 {Y} | {Z[0]}={z_state}. Not enough samples" + ) + else: + z_str = ", ".join([f"{var}={state}" for var, state in zip(Z, z_state)]) + logging.info(f"Skipping the test {X} \u27C2 {Y} | {z_str}. Not enough samples") + p_value = 1 - stats.chi2.cdf(chi, df=dof) + import numpy as np + + if np.isnan(p_value): + print(p_value, chi, c, dof, X, Y, Z) + c, _, d, _ = stats.chi2_contingency( + df.groupby([X, Y]).size().unstack(Y, fill_value=0), lambda_=lambda_ + ) + print(c, d) + # Step 4: Return the values + return chi, p_value, dof + + +class CategoricalCITest(BaseConditionalIndependenceTest): + def __init__(self, lambda_="cressie-read") -> None: + """CI test for categorical data. + + Uses the power-divergence class of test statistics to test categorical data + for (conditional) independences. + + Parameters + ---------- + lambda_ : str, optional + The lambda parameter for the power_divergence statistic, by default 'cressie-read'. + Some values of lambda_ results in other well known tests: + "pearson" 1 "Chi-squared test" + "log-likelihood" 0 "G-test or log-likelihood" + "freeman-tukey" -1/2 "freeman-tukey Statistic" + "mod-log-likelihood" -1 "Modified Log-likelihood" + "neyman" -2 "Neyman's statistic" + "cressie-read" 2/3 "The value recommended in the paper + :footcite:`cressieread1984`" + + See Also + -------- + scipy.stats.power_divergence + + References + ---------- + .. footbibliography:: + """ + self.lambda_ = lambda_ + + def test( + self, + df: pd.DataFrame, + x_vars: Set[Column], + y_vars: Set[Column], + z_covariates: Optional[Set[Column]] = None, + ) -> Tuple[float, float]: + x_vars = reduce(lambda x: x, x_vars) # type: ignore + y_vars = reduce(lambda x: x, y_vars) # type: ignore + stat, pvalue, dof = power_divergence( + x_vars, y_vars, z_covariates, data=df, lambda_=self.lambda_ + ) + self.dof_ = dof + return stat, pvalue + + +class CausalLearnCITest(BaseConditionalIndependenceTest): + def __init__(self, method_name="gsq") -> None: + self.method_name = method_name + + def test( + self, + df: pd.DataFrame, + x_vars: Set[Column], + y_vars: Set[Column], + z_covariates: Optional[Set[Column]] = None, + ) -> Tuple[float, float]: + import numpy as np + from causallearn.utils.cit import Chisq_or_Gsq + + data = df.to_numpy() + x_vars = reduce(lambda x: x, x_vars) # type: ignore + y_vars = reduce(lambda x: x, y_vars) # type: ignore + x = np.argwhere(df.columns == x_vars) + y = np.argwhere(df.columns == y_vars) + z = [] + if z_covariates is not None: + for _z in z_covariates: + z.append(np.argwhere(df.columns == _z).squeeze()) + z = np.array(z) + + tester = Chisq_or_Gsq(data, method_name=self.method_name) + return np.nan, tester(x, y, z) diff --git a/dodiscover/ci/g_test.py b/dodiscover/ci/g_test.py index 0942447f9..5f34e93af 100644 --- a/dodiscover/ci/g_test.py +++ b/dodiscover/ci/g_test.py @@ -187,6 +187,7 @@ def _calculate_g_statistic(contingency_tble): nlevels_x, nlevels_y, dof_count = contingency_tble.shape # now compute marginal terms across all degrees of freedom + # (nlevels_x, dof_count) and (nlevels_y, dof_count) arrays tx_dof = contingency_tble.sum(axis=1) ty_dof = contingency_tble.sum(axis=0) diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 78221e207..b51c99087 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -385,7 +385,7 @@ def _apply_rule4( # now check if u is in SepSet(v, c) # handle edge case where sep_set is empty. if last_node in sep_set: - if is_in_sep_set(u, sep_set, last_node, c, "any"): # u in sep_set[last_node][c]: + if is_in_sep_set(u, sep_set, last_node, c, "any"): # orient u -> c graph.remove_edge(c, u, graph.circle_edge_name) if graph.has_edge(u, c, graph.circle_edge_name): diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index cf66f244c..fa44e6a4d 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -144,6 +144,7 @@ def learn_skeleton( ) self.skeleton_learner_.fit(data, context) + self.context_ = self.skeleton_learner_.context_.copy() skel_graph = self.skeleton_learner_.adj_graph_ sep_set = self.skeleton_learner_.sep_set_ self.n_ci_tests += self.skeleton_learner_.n_ci_tests diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index b825926f9..bb864beaa 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -2,11 +2,12 @@ from collections import defaultdict from copy import deepcopy from itertools import chain, combinations -from typing import Callable, Generator, Iterable, List, Optional, Set, SupportsFloat, Tuple, Union +from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple import networkx as nx import numpy as np import pandas as pd +from joblib import Parallel, delayed from dodiscover.cd import BaseConditionalDiscrepancyTest from dodiscover.ci import BaseConditionalIndependenceTest @@ -22,20 +23,38 @@ def _parallel_test_xy_edges( - conditional_test_func, x_var, y_var, cond_set, data -) -> Tuple[float, float]: - """Private function used to test edges between X and Y in parallel. + conditional_test_func: Callable[ + [pd.DataFrame, Column, Column, Optional[Set[Column]]], Tuple[float, float] + ], + x_var: Column, + y_var: Column, + alpha: float, + size_cond_set: int, + max_combinations: Optional[int], + possible_variables: Set[Column], + data: pd.DataFrame, +) -> Dict[str, Any]: + """Private function used to test edge between X and Y in parallel for candidate separating sets. Parameters ---------- conditional_test_func : Callable Conditional test function. - x_var : Columns + x_var : Column The 'X' variable name. y_var : Column The 'Y' variable name. - cond_set : Set[Column] - A set of variables to condition on. Can be the empty set. + alpha : float + The significance level for the conditional independence test. + size_cond_set : int + The current size of the conditioning set. This value will then generate + ``(N choose 'size_cond_set')`` sets of candidate separating sets to test, where + ``N`` is the size of 'possible_variables'. + max_combinations : int + The maximum number of conditional independence tests to run from the set + of possible conditioning sets. + possible_variables : Set[Column] + A set of variables that are candidates for the conditioning set. data : pandas.Dataframe The dataset with variables as columns and samples as rows. @@ -46,15 +65,52 @@ def _parallel_test_xy_edges( pvalue : float Pvalue. """ - # compute conditional independence test - test_stat, pvalue = conditional_test_func(data, x_var, y_var, set(cond_set)) - return test_stat, pvalue + prev_pvalue = 0.0 + + # generate iterator through the conditioning sets + conditioning_sets = _iter_conditioning_set( + possible_variables=possible_variables, + x_var=x_var, + y_var=y_var, + size_cond_set=size_cond_set, + ) + + # now iterate through the possible parents + for comb_idx, cond_set in enumerate(conditioning_sets): + # check the number of combinations of possible parents we have tried + # to use as a separating set + if max_combinations is not None and comb_idx >= max_combinations: + break + + try: + # compute conditional independence test + test_stat, pvalue = conditional_test_func(data, x_var, y_var, set(cond_set)) + except Exception as e: + print(e) + test_stat = np.inf + pvalue = 0.0 + + # if any "independence" is found through inability to reject + # the null hypothesis, then we will break the loop comparing X and Y + # and say X and Y are conditionally independent given 'cond_set' + if pvalue > alpha: + break + else: + pvalue = max(pvalue, prev_pvalue) + + result: Dict[str, Any] = dict() + result["x_var"] = x_var + result["y_var"] = y_var + result["cond_set"] = list(cond_set) + result["test_stat"] = test_stat + result["pvalue"] = pvalue + return result def _iter_conditioning_set( possible_variables: Iterable, - x_var: Union[SupportsFloat, str], - y_var: Union[SupportsFloat, str], + x_var: Column, + y_var: Column, size_cond_set: int, ) -> Iterable[Set]: """Iterate function to generate the conditioning set. @@ -133,19 +189,34 @@ def _find_neighbors_along_path(G: nx.Graph, start, end) -> Set: class BaseSkeletonLearner: - """Base class for constraint-based skeleton learning algorithms.""" + """Base class for constraint-based skeleton learning algorithms. + + Attributes + ---------- + adj_graph_ : nx.Graph + The learned skeleton graph. + sep_set_ : SeparatingSet + The learned separating sets. + context_ : Context + The resulting causal context. + n_iters_ : int + The number of iterations of the skeleton learning process that were performed. + This helps track iteration of algorithms that perform the entire skeleton + discovery phase multiple times. + """ alpha: float + n_jobs: Optional[int] adj_graph_: nx.Graph context_: Context sep_set_: SeparatingSet + n_iters_: int + min_cond_set_size_: int max_cond_set_size_: int max_combinations_: int - n_iters_: int - _cont: bool def _learn_skeleton( @@ -158,9 +229,8 @@ def _learn_skeleton( """Core function for learning the skeleton of a causal graph. This function is a "stateful" function of Skeleton learners. It requires - the following state to be preserved as attributes of self. - - - context_ : a Context object + the ``context_`` object to be preserved as attributes of self. It also keeps + track of ``_cont`` private attribute, which helps determine stopping conditions. Parameters ---------- @@ -169,7 +239,8 @@ def _learn_skeleton( context : Context A context object. conditional_test_func : Callable - The conditional test function that + The conditional test function that takes in three arguments 'x_var', 'y_var' + and an optional 'z_var', where 'z_var' is the conditioning set of variables. possible_x_nodes : set of nodes, optional The nodes to initialize as X variables. How to initialize variables to test in the second loop of the algorithm. See Notes for details. @@ -247,44 +318,10 @@ def _learn_skeleton( # wrt which edges are removed at each process of the algorithm remove_edges = set() - # determine whether or not to continue - # loop through every node that we want to test - for x_var in possible_x_nodes: - possible_adjacencies = set(adj_graph.neighbors(x_var)) - logger.info(f"Considering node {x_var}...\n\n") - - for y_var in possible_adjacencies: - # a node cannot be a parent to itself in DAGs - if y_var == x_var: - continue - - if (x_var, y_var) in context.included_edges.edges: - continue - - # compute the possible variables used in the conditioning set - possible_variables = self._compute_candidate_conditioning_sets( - adj_graph, - x_var, - y_var, - ) - - logger.debug( - f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " - f"with p={size_cond_set}. The possible variables to condition on are: " - f"{possible_variables}." - ) - - # check that number of adjacencies is greater then the - # cardinality of the conditioning set - if len(possible_variables) < size_cond_set: - logger.debug( - f"\n\nBreaking for {x_var}, {y_var}, {len(possible_adjacencies)}, " - f"{size_cond_set}, {possible_variables}" - ) - continue - else: - self._cont = True - + if self.n_jobs == 1: + for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( + possible_x_nodes, adj_graph, context, size_cond_set + ): # generate iterator through the conditioning sets conditioning_sets = _iter_conditioning_set( possible_variables=possible_variables, @@ -309,6 +346,8 @@ def _learn_skeleton( data, x_var, y_var, set(cond_set) ) except Exception as e: + # allow us to catch exceptions that are due to not enough samples + # if so, we cannot remove the edge and just proceed print(e) test_stat = np.inf pvalue = 0.0 @@ -320,14 +359,52 @@ def _learn_skeleton( break # post-process the CI test results - removed_edge = self._postprocess_ci_test( - adj_graph, x_var, y_var, cond_set, test_stat, pvalue + self._postprocess_ci_test(adj_graph, x_var, y_var, test_stat, pvalue) + + # two variables found to be independent given a separating set + if pvalue > self.alpha: + self.sep_set_[x_var][y_var].append(set(cond_set)) + self.sep_set_[y_var][x_var].append(set(cond_set)) + remove_edges.add((x_var, y_var, pvalue)) + + # summarize the comparison of XY + self._summarize_xy_comparison(x_var, y_var, pvalue > self.alpha, pvalue) + else: + # run parallelized loop + out = Parallel(n_jobs=self.n_jobs)( + delayed(_parallel_test_xy_edges)( + conditional_test_func, + x_var, + y_var, + self.alpha, + size_cond_set, + self.max_combinations_, + possible_variables, + data, + ) + for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( + possible_x_nodes, adj_graph, context, size_cond_set ) - if removed_edge: + ) + + for result in out: + test_stat = result["test_stat"] + pvalue = result["pvalue"] + x_var = result["x_var"] + y_var = result["y_var"] + cond_set = result["cond_set"] + + # post-process the CI test results + self._postprocess_ci_test(adj_graph, x_var, y_var, test_stat, pvalue) + + # two variables found to be independent given a separating set + if pvalue > self.alpha: + self.sep_set_[x_var][y_var].append(set(cond_set)) + self.sep_set_[y_var][x_var].append(set(cond_set)) remove_edges.add((x_var, y_var, pvalue)) # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, removed_edge, pvalue) + self._summarize_xy_comparison(x_var, y_var, pvalue > self.alpha, pvalue) # finally remove edges after performing # conditional independence tests @@ -349,8 +426,27 @@ def _learn_skeleton( self.n_iters_ += 1 def _generate_pairs_with_sepset( - self, possible_x_nodes, adj_graph, context, size_cond_set - ): # -> Generator[Column, Column, Set[Column]]: + self, possible_x_nodes: Set[Column], adj_graph: Graph, context: Context, size_cond_set: int + ) -> Generator[Tuple[Column, Column, Set[Column]], None, None]: + """Generate X, Y and Z pairs for conditional testing. + + Parameters + ---------- + possible_x_nodes : Set[Column] + Nodes that we want to test edges of. + adj_graph : Graph + The graph encoding adjacencies and current state of the learned undirected graph. + context : Context + The causal context. + size_cond_set : int + The current size of the conditioning set to consider. + + Yields + ------ + Generator[Tuple[Column, Column, Set[Column]], None, None] + Generates 'X' variable, 'Y' variable and canddiate 'Z' (i.e. possible separating set + variables). + """ # loop through every node that we want to test for x_var in possible_x_nodes: possible_adjacencies = set(adj_graph.neighbors(x_var)) @@ -387,22 +483,7 @@ def _generate_pairs_with_sepset( continue else: self._cont = True - - # generate iterator through the conditioning sets - conditioning_sets = _iter_conditioning_set( - possible_variables=possible_variables, - x_var=x_var, - y_var=y_var, - size_cond_set=size_cond_set, - ) - - # now iterate through the possible parents - for comb_idx, cond_set in enumerate(conditioning_sets): - # check the number of combinations of possible parents we have tried - # to use as a separating set - if self.max_combinations_ is not None and comb_idx >= self.max_combinations_: - break - yield x_var, y_var, cond_set + yield x_var, y_var, possible_variables def _compute_candidate_conditioning_sets( self, adj_graph: nx.Graph, x_var: Column, y_var: Column @@ -447,10 +528,28 @@ def _postprocess_ci_test( adj_graph: nx.Graph, x_var: Column, y_var: Column, - cond_set: Set[Column], test_stat: float, pvalue: float, - ) -> bool: + ): + """Post-processing of CI tests. + + The basic values any learner keeps track of is the pvalue/test-statistic of each + remaining edge. This is a heuristic estimate of the "dependency" of any node + with its neighbors. + + Parameters + ---------- + adj_graph : nx.Graph + The adjacency graph. + x_var : Column + X variable. + y_var : Column + Y variable. + test_stat : float + The test statistic. + pvalue : float + The pvalue of the test statistic. + """ # keep track of the smallest test statistic, meaning the highest pvalue # meaning the "most" independent. keep track of the maximum pvalue as well if pvalue > adj_graph.edges[x_var, y_var]["pvalue"]: @@ -458,13 +557,6 @@ def _postprocess_ci_test( if test_stat < adj_graph.edges[x_var, y_var]["test_stat"]: adj_graph.edges[x_var, y_var]["test_stat"] = test_stat - # two variables found to be independent given a separating set - if pvalue > self.alpha: - self.sep_set_[x_var][y_var].append(set(cond_set)) - self.sep_set_[y_var][x_var].append(set(cond_set)) - return True - return False - def _summarize_xy_comparison( self, x_var: Column, y_var: Column, removed_edge: bool, pvalue: float ) -> None: @@ -550,6 +642,8 @@ class LearnSkeleton(BaseSkeletonLearner): by its dependencies from strongest to weakest (i.e. largest CI test statistic value to lowest). This can be used in conjunction with ``max_combinations`` parameter to only test the "strongest" dependences. + n_jobs : int, optional + Number of CPUs to use, by default None. Attributes ---------- @@ -608,11 +702,13 @@ def __init__( max_combinations: Optional[int] = None, condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, keep_sorted: bool = False, + n_jobs: Optional[int] = None, ) -> None: self.ci_estimator = ci_estimator self.sep_set = sep_set self.alpha = alpha self.condsel_method = condsel_method + self.n_jobs = n_jobs # control of the conditioning set self.min_cond_set_size = min_cond_set_size @@ -858,6 +954,8 @@ class LearnSemiMarkovianSkeleton(LearnSkeleton): The number of iterations the skeleton has been learned. max_path_length_ : int Th inferred maximum path length any single discriminating path is allowed to take. + n_jobs : int, optional + Number of CPUs to use, by default None. Notes ----- @@ -904,6 +1002,7 @@ def __init__( ] = ConditioningSetSelection.PDS, keep_sorted: bool = False, max_path_length: Optional[int] = None, + n_jobs: Optional[int] = None, ) -> None: super().__init__( ci_estimator, @@ -914,6 +1013,7 @@ def __init__( max_combinations, condsel_method, keep_sorted, + n_jobs=n_jobs, ) self.second_stage_condsel_method = second_stage_condsel_method @@ -1084,6 +1184,8 @@ class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): to only test the "strongest" dependences. max_path_length : int, optional The maximum length of any discriminating path, or None if unlimited. + n_jobs : int, optional + Number of CPUs to use, by default None. Notes ----- @@ -1114,6 +1216,7 @@ def __init__( keep_sorted: bool = False, max_path_length: Optional[int] = None, known_intervention_targets: bool = False, + n_jobs: Optional[int] = None, ) -> None: super().__init__( ci_estimator, @@ -1126,6 +1229,7 @@ def __init__( second_stage_condsel_method, keep_sorted, max_path_length, + n_jobs=n_jobs, ) self.cd_estimator = cd_estimator @@ -1199,7 +1303,7 @@ def evaluate_fnode_edge( self, data: List[pd.DataFrame], X: Column, - Y: Set[Column], + Y: Column, Z: Set[Column], ) -> Tuple[float, float]: """Test an edge from an F-node to a regular node for X || Y | Z. @@ -1240,7 +1344,7 @@ def evaluate_fnode_edge( # indicates which distribution data came from # test graphically if Y is d-separated from F-node given Z # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, Y, set({X}), Z) + test_stat, pvalue = self.cd_estimator.test(data, set({Y}), set({X}), Z) self.n_ci_tests += 1 return test_stat, pvalue @@ -1274,30 +1378,13 @@ def _compute_candidate_conditioning_sets( if y_var in f_nodes: raise RuntimeError("This should not be the case") - # get only neighboring sets of Y-vars, or PDS that depend on Y + # get candidate conditioning sets that do not include the F-nodes possible_variables = super()._compute_candidate_conditioning_sets( adj_graph, x_var, y_var ) - set(f_nodes) return possible_variables - def _postprocess_ci_test( - self, - adj_graph: nx.Graph, - x_var: Column, - y_var: Column, - cond_set: Set[Column], - test_stat: float, - pvalue: float, - ) -> bool: - # post-process the CI test results - f_nodes = self.context_.f_nodes - if x_var in f_nodes: - all_other_fnodes = f_nodes.copy() - all_other_fnodes.remove(x_var) - cond_set = cond_set.union(all_other_fnodes) - return super()._postprocess_ci_test(adj_graph, x_var, y_var, cond_set, test_stat, pvalue) - def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): state_variables = context.state_variables.copy() self.context_ = make_context(context, create_using=InterventionalContextBuilder).build() @@ -1450,3 +1537,24 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # now, we'll fit the data using interventional data by looping over all # combinations of F-nodes and their neighbors self._learn_skeleton_with_interventions(data, self.context_) + + for x_var, y_vars in self.sep_set_.items(): + for y_var in y_vars: + f_node = None + if x_var in f_nodes: + f_node = x_var + if y_var in f_nodes: + f_node = y_var + + if f_node is None: + continue + + f_nodes_without_this = f_nodes.copy() + f_nodes_without_this.remove(f_node) + sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + if len(sep_sets) > 0: + print( + f"Updated separating set for {x_var}, {y_var} with {f_nodes_without_this}" + ) + for idx in range(len(sep_sets)): + self.sep_set_[x_var][y_var][idx].update(f_nodes_without_this) diff --git a/dodiscover/testdata/adult.csv b/dodiscover/testdata/adult.csv new file mode 100644 index 000000000..fdc5a2fc6 --- /dev/null +++ b/dodiscover/testdata/adult.csv @@ -0,0 +1,30163 @@ +"Age","Education","MaritalStatus","Race","Sex","HoursPerWeek","Immigrant","Income" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","<20","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +">65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","Non-White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"50-65","College-Associate","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no",">50K" +">65","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","yes","<=50K" +">65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +">65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","yes",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +">65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","yes",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","<20","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","yes",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +">65","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +">65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"<20","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Was-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","Non-White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no",">50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","<20","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","<20","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","yes",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","<20","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no",">50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","<20","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"<20","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +">65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","yes","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no",">50K" +">65","College-Associate","Was-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","yes",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","<20","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","yes",">50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","<20","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +">65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +">65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +">65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","<20","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"<20","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","yes","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","yes",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes",">50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Was-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"<20","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","<20","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"<20","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"50-65","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"<20","HS-grad","Is-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","<20","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","<20","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","<20","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","<20","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","yes","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","yes",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","yes",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","<20","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","<20","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +">65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","Non-White","Female","20-39","yes",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","Non-White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +">65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","yes",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","yes","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","<20","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +">65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","yes","<=50K" +">65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"<20","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","<20","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","yes","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","yes",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"<20","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","<20","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","<20","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +">65","Academic-Degree","Is-Married","White","Female","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","yes",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","<20","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","<20","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Never-married","Non-White","Female",">40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","no",">50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female",">40","yes",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","yes",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","20-39","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","<20","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +">65","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes",">50K" +">65","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Female",">40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Female","20-39","yes",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"50-65","College-Associate","Never-married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","<20","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +">65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","yes","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +">65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","yes","<=50K" +">65","Academic-Degree","Was-Married","White","Male","<20","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","yes",">50K" +">65","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","yes",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","<20","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","Non-White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","yes",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","yes",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +">65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","<20","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +">65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Never-married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","<20","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","<20","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","<20","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","20-39","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +">65","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes",">50K" +"50-65","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","<20","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","yes",">50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","<20","yes","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"<20","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male",">40","yes",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","<20","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +">65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","yes",">50K" +">65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +">65","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","<20","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +">65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","<20","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","<20","no","<=50K" +">65","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male","20-39","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","yes",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male",">40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","yes","<=50K" +">65","Non-HS-Grad","Is-Married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +">65","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Was-Married","White","Male","<20","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +">65","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","<20","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"<20","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +">65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","<20","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","<20","yes","<=50K" +">65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","HS-grad","Was-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","<20","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Female","<20","no",">50K" +">65","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","Non-White","Male","<20","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","<20","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","yes","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","<20","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +">65","Academic-Degree","Was-Married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Was-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"50-65","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +">65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","<20","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","<20","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Never-married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","20-39","yes","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Female","<20","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","<20","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","yes",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +">65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","yes","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"50-65","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +">65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +">65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","yes",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes",">50K" +"<20","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +">65","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","no","<=50K" +"<20","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Female","40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Female","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +">65","College-Associate","Was-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","yes","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","yes","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","20-39","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male",">40","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","<20","no",">50K" +"<20","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","yes",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female",">40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","<20","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","yes",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","yes","<=50K" +">65","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Never-married","White","Male","<20","yes","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","20-39","yes",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","<20","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +">65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","yes",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","Non-White","Female","20-39","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +">65","Non-HS-Grad","Is-Married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Was-Married","Non-White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","yes","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","yes",">50K" +"<20","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"<20","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +">65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","Non-White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","Non-White","Male","<20","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +">65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"<20","College-Associate","Never-married","White","Male","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","Non-White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no","<=50K" +">65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male",">40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Female","40","yes","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","<20","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","yes","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female",">40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","yes","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Is-Married","Non-White","Female","<20","yes",">50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Never-married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Never-married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"<20","HS-grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","yes","<=50K" +"20-34","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","<20","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"<20","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no",">50K" +"50-65","College-Associate","Never-married","White","Female","<20","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Male","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no",">50K" +"<20","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","College-Associate","Was-Married","White","Female",">40","no","<=50K" +">65","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"35-49","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +">65","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male","40","yes",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","20-39","yes","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","20-39","no","<=50K" +"50-65","College-Associate","Was-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Never-married","White","Male","40","yes",">50K" +"50-65","College-Associate","Was-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"<20","Non-HS-Grad","Never-married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Female","40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","yes",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Male","20-39","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female","<20","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Male","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","20-39","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Female","40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Female","<20","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","40","yes","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Never-married","Non-White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Was-Married","White","Female","40","no","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female","40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","<20","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","40","yes","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","yes","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"20-34","HS-grad","Never-married","Non-White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male",">40","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Was-Married","White","Male","<20","yes",">50K" +"20-34","College-Associate","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Female",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","<20","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","<20","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male",">40","yes","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Never-married","White","Female","40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Never-married","Non-White","Male","40","yes",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","yes",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","HS-grad","Was-Married","Non-White","Female","40","yes","<=50K" +"20-34","HS-grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","yes","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Male",">40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male","40","no",">50K" +"50-65","Non-HS-Grad","Never-married","Non-White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","College-Associate","Was-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Female","20-39","no","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Female","20-39","yes","<=50K" +"35-49","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","Non-White","Female","40","yes","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"50-65","Non-HS-Grad","Was-Married","White","Female",">40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Male",">40","yes","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"20-34","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"<20","HS-grad","Never-married","White","Male",">40","no","<=50K" +">65","Academic-Degree","Is-Married","White","Male","20-39","no",">50K" +"20-34","Academic-Degree","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","College-Associate","Never-married","Non-White","Male","40","no","<=50K" +"<20","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female",">40","no","<=50K" +"50-65","HS-grad","Was-Married","Non-White","Female","20-39","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","20-39","yes","<=50K" +"20-34","Academic-Degree","Is-Married","Non-White","Male",">40","no",">50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","Academic-Degree","Is-Married","White","Male","<20","yes","<=50K" +"50-65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male",">40","no",">50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +">65","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Never-married","White","Male",">40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Male",">40","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","Non-White","Female","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"50-65","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","20-39","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Is-Married","Non-White","Female","20-39","no","<=50K" +"50-65","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","Non-White","Female","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Female","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male",">40","no","<=50K" +"<20","Non-HS-Grad","Never-married","White","Male","20-39","no","<=50K" +"20-34","HS-grad","Never-married","White","Female","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Never-married","Non-White","Male","40","no","<=50K" +"20-34","Non-HS-Grad","Was-Married","White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Male",">40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no","<=50K" +"50-65","Academic-Degree","Was-Married","White","Female",">40","no",">50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no","<=50K" +"35-49","Non-HS-Grad","Was-Married","Non-White","Female","20-39","yes","<=50K" +"20-34","HS-grad","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","40","no","<=50K" +"35-49","Academic-Degree","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Is-Married","Non-White","Male",">40","no","<=50K" +">65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"35-49","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"50-65","HS-grad","Is-Married","White","Male","40","no",">50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no",">50K" +"20-34","HS-grad","Never-married","White","Female",">40","no","<=50K" +"20-34","HS-grad","Is-Married","Non-White","Male","40","no","<=50K" +"50-65","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Male",">40","no","<=50K" +"20-34","College-Associate","Never-married","White","Female","<20","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","White","Male","40","no","<=50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","HS-grad","Is-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Academic-Degree","Is-Married","White","Male",">40","no",">50K" +"50-65","Academic-Degree","Is-Married","Non-White","Male",">40","yes",">50K" +"35-49","College-Associate","Was-Married","White","Female","20-39","no","<=50K" +"20-34","Non-HS-Grad","Never-married","Non-White","Male","20-39","no","<=50K" +"20-34","Academic-Degree","Never-married","White","Female",">40","no",">50K" +"20-34","HS-grad","Never-married","Non-White","Male",">40","no","<=50K" +"35-49","Academic-Degree","Was-Married","Non-White","Female",">40","no",">50K" +"35-49","HS-grad","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female",">40","no","<=50K" +"20-34","Academic-Degree","Was-Married","Non-White","Female","20-39","no","<=50K" +"35-49","College-Associate","Is-Married","White","Female","20-39","no",">50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","yes","<=50K" +"50-65","Academic-Degree","Never-married","White","Male",">40","no","<=50K" +"35-49","College-Associate","Was-Married","White","Female","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Non-HS-Grad","Is-Married","Non-White","Male","40","no","<=50K" +"35-49","College-Associate","Is-Married","White","Male",">40","no","<=50K" +"20-34","Academic-Degree","Never-married","Non-White","Male","<20","yes","<=50K" +"50-65","Academic-Degree","Is-Married","White","Male","40","no",">50K" +"20-34","College-Associate","Never-married","White","Male","40","no","<=50K" +"20-34","College-Associate","Is-Married","White","Female","20-39","no","<=50K" +"35-49","HS-grad","Is-Married","White","Male","40","no",">50K" +"50-65","HS-grad","Was-Married","White","Female","40","no","<=50K" +"20-34","HS-grad","Never-married","White","Male","20-39","no","<=50K" +"50-65","HS-grad","Is-Married","White","Female","40","no",">50K" diff --git a/tests/unit_tests/conditional/ci/test_chisq_test.py b/tests/unit_tests/conditional/ci/test_chisq_test.py new file mode 100644 index 000000000..5bd66d094 --- /dev/null +++ b/tests/unit_tests/conditional/ci/test_chisq_test.py @@ -0,0 +1,156 @@ +import numpy as np +import pandas as pd +from numpy.testing import assert_almost_equal + +from dodiscover.ci import CategoricalCITest + +df_adult = pd.read_csv("dodiscover/testdata/adult.csv") + + +def test_chisquare_adult_dataset(): + # Comparision values taken from dagitty (DAGitty) + ci_est = CategoricalCITest("pearson") + coef, p_value = ci_est.test(x_vars={"Age"}, y_vars={"Immigrant"}, z_covariates=[], df=df_adult) + assert_almost_equal(coef, 57.75, decimal=1) + assert_almost_equal(np.log(p_value), -25.47, decimal=1) + assert ci_est.dof_ == 4 + + coef, p_value = ci_est.test(x_vars={"Age"}, y_vars={"Race"}, z_covariates=[], df=df_adult) + assert_almost_equal(coef, 56.25, decimal=1) + assert_almost_equal(np.log(p_value), -24.75, decimal=1) + assert ci_est.dof_ == 4 + + coef, p_value = ci_est.test(x_vars={"Age"}, y_vars={"Sex"}, z_covariates=[], df=df_adult) + assert_almost_equal(coef, 289.62, decimal=1) + assert_almost_equal(np.log(p_value), -139.82, decimal=1) + assert ci_est.dof_ == 4 + + coef, p_value = coef, p_value = ci_est.test( + x_vars={"Education"}, + y_vars={"HoursPerWeek"}, + z_covariates=["Age", "Immigrant", "Race", "Sex"], + df=df_adult, + ) + assert_almost_equal(coef, 1460.11, decimal=1) + assert_almost_equal(p_value, 0, decimal=1) + assert ci_est.dof_ == 316 + + coef, p_value = ci_est.test(x_vars={"Immigrant"}, y_vars={"Sex"}, z_covariates={}, df=df_adult) + assert_almost_equal(coef, 0.2724, decimal=1) + assert_almost_equal(np.log(p_value), -0.50, decimal=1) + assert ci_est.dof_ == 1 + + coef, p_value = ci_est.test( + x_vars={"Education"}, y_vars={"MaritalStatus"}, z_covariates=["Age", "Sex"], df=df_adult + ) + assert_almost_equal(coef, 481.96, decimal=1) + assert_almost_equal(p_value, 0, decimal=1) + assert ci_est.dof_ == 58 + + # Values differ (for next 2 tests) from dagitty because dagitty ignores grouped + # dataframes with very few samples. Update: Might be same from scipy_vars=1.7.0 + coef, p_value = ci_est.test( + x_vars={"Income"}, + y_vars={"Race"}, + z_covariates=["Age", "Education", "HoursPerWeek", "MaritalStatus"], + df=df_adult, + ) + + assert_almost_equal(coef, 66.39, decimal=1) + assert_almost_equal(p_value, 0.99, decimal=1) + assert ci_est.dof_ == 136 + + coef, p_value = ci_est.test( + x_vars={"Immigrant"}, + y_vars={"Income"}, + z_covariates=["Age", "Education", "HoursPerWeek", "MaritalStatus"], + df=df_adult, + ) + assert_almost_equal(coef, 65.59, decimal=1) + assert_almost_equal(p_value, 0.999, decimal=2) + assert ci_est.dof_ == 131 + + +def test_discrete_tests(): + for t in [ + CategoricalCITest("pearson"), # chi-square + CategoricalCITest("log-likelihood"), # G^2 + CategoricalCITest("freeman-tukey"), # freeman-tukey + CategoricalCITest("mod-log-likelihood"), # Modified log-likelihood + CategoricalCITest("neyman"), # Neyman + CategoricalCITest("cressie-read"), # Cressie-read + ]: + assert ( + t.test( + x_vars={"Age"}, + y_vars={"Immigrant"}, + z_covariates=[], + df=df_adult, + )[1] + < 0.05 + ) + + assert ( + t.test( + x_vars={"Age"}, + y_vars={"Race"}, + z_covariates=[], + df=df_adult, + )[1] + < 0.05 + ) + + assert ( + t.test( + x_vars={"Age"}, + y_vars={"Sex"}, + z_covariates=[], + df=df_adult, + )[1] + < 0.05 + ) + assert not ( + t.test( + x_vars={"Immigrant"}, + y_vars={"Sex"}, + z_covariates=[], + df=df_adult, + )[1] + < 0.05 + ) + + # XXX: Test returns nan... + # assert ( + # t.test( + # x_vars={"Education"}, + # y_vars={"HoursPerWeek"}, + # z_covariates=["Age", "Immigrant", "Race", "Sex"], + # df=df_adult, + # )[1] < 0.05 + # ) + # assert ( + # t.test( + # x_vars={"Education"}, + # y_vars={"MaritalStatus"}, + # z_covariates=["Age", "Sex"], + # df=df_adult, + # )[1] < 0.05 + # ) + + +def test_exactly_same_vars(): + x = np.random.choice([0, 1], size=1000) + y = x.copy() + df = pd.DataFrame({"x": x, "y": y}) + + for t in [ + CategoricalCITest("pearson"), # chi-square + CategoricalCITest("log-likelihood"), # G^2 + CategoricalCITest("freeman-tukey"), # freeman-tukey + CategoricalCITest("mod-log-likelihood"), # Modified log-likelihood + CategoricalCITest("neyman"), # Neyman + CategoricalCITest("cressie-read"), # Cressie-read + ]: + stat, p_value = t.test(x_vars={"x"}, y_vars={"y"}, z_covariates=[], df=df) + assert t.dof_ == 1 + assert_almost_equal(p_value, 0, decimal=5) From 4df103b6ccf9da9234e72431368f659e3165e334 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Sun, 9 Apr 2023 22:42:36 -0400 Subject: [PATCH 35/61] Fix oetry lock Signed-off-by: Adam Li --- poetry.lock | 371 ++++++++++-------- tests/unit_tests/constraint/test_psifcialg.py | 1 + 2 files changed, 200 insertions(+), 172 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6fcfe4649..0085bcfc1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -96,14 +96,14 @@ yaml = ["PyYAML"] [[package]] name = "beautifulsoup4" -version = "4.12.0" +version = "4.12.2" description = "Screen-scraping library" category = "dev" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, - {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] [package.dependencies] @@ -585,63 +585,63 @@ test-no-images = ["pytest"] [[package]] name = "coverage" -version = "7.2.2" +version = "7.2.3" description = "Code coverage measurement for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7"}, - {file = "coverage-7.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2"}, - {file = "coverage-7.2.2-cp310-cp310-win32.whl", hash = "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292"}, - {file = "coverage-7.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab"}, - {file = "coverage-7.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b"}, - {file = "coverage-7.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57"}, - {file = "coverage-7.2.2-cp311-cp311-win32.whl", hash = "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d"}, - {file = "coverage-7.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512"}, - {file = "coverage-7.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9"}, - {file = "coverage-7.2.2-cp37-cp37m-win32.whl", hash = "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8"}, - {file = "coverage-7.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25"}, - {file = "coverage-7.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6"}, - {file = "coverage-7.2.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2"}, - {file = "coverage-7.2.2-cp38-cp38-win32.whl", hash = "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3"}, - {file = "coverage-7.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8"}, - {file = "coverage-7.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d"}, - {file = "coverage-7.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be"}, - {file = "coverage-7.2.2-cp39-cp39-win32.whl", hash = "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc"}, - {file = "coverage-7.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef"}, - {file = "coverage-7.2.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968"}, - {file = "coverage-7.2.2.tar.gz", hash = "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, + {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, + {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, + {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, + {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, + {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, + {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, + {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, + {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, + {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, + {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, + {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, + {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, + {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, + {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, + {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, + {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, + {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, + {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, + {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, + {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, + {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, + {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, + {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, + {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, + {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, + {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, + {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, ] [package.dependencies] @@ -664,29 +664,30 @@ files = [ [[package]] name = "debugpy" -version = "1.6.6" +version = "1.6.7" description = "An implementation of the Debug Adapter Protocol for Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "debugpy-1.6.6-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:0ea1011e94416e90fb3598cc3ef5e08b0a4dd6ce6b9b33ccd436c1dffc8cd664"}, - {file = "debugpy-1.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dff595686178b0e75580c24d316aa45a8f4d56e2418063865c114eef651a982e"}, - {file = "debugpy-1.6.6-cp310-cp310-win32.whl", hash = "sha256:87755e173fcf2ec45f584bb9d61aa7686bb665d861b81faa366d59808bbd3494"}, - {file = "debugpy-1.6.6-cp310-cp310-win_amd64.whl", hash = "sha256:72687b62a54d9d9e3fb85e7a37ea67f0e803aaa31be700e61d2f3742a5683917"}, - {file = "debugpy-1.6.6-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:78739f77c58048ec006e2b3eb2e0cd5a06d5f48c915e2fc7911a337354508110"}, - {file = "debugpy-1.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23c29e40e39ad7d869d408ded414f6d46d82f8a93b5857ac3ac1e915893139ca"}, - {file = "debugpy-1.6.6-cp37-cp37m-win32.whl", hash = "sha256:7aa7e103610e5867d19a7d069e02e72eb2b3045b124d051cfd1538f1d8832d1b"}, - {file = "debugpy-1.6.6-cp37-cp37m-win_amd64.whl", hash = "sha256:f6383c29e796203a0bba74a250615ad262c4279d398e89d895a69d3069498305"}, - {file = "debugpy-1.6.6-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:23363e6d2a04d726bbc1400bd4e9898d54419b36b2cdf7020e3e215e1dcd0f8e"}, - {file = "debugpy-1.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b5d1b13d7c7bf5d7cf700e33c0b8ddb7baf030fcf502f76fc061ddd9405d16c"}, - {file = "debugpy-1.6.6-cp38-cp38-win32.whl", hash = "sha256:70ab53918fd907a3ade01909b3ed783287ede362c80c75f41e79596d5ccacd32"}, - {file = "debugpy-1.6.6-cp38-cp38-win_amd64.whl", hash = "sha256:c05349890804d846eca32ce0623ab66c06f8800db881af7a876dc073ac1c2225"}, - {file = "debugpy-1.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771739902b1ae22a120dbbb6bd91b2cae6696c0e318b5007c5348519a4211c6"}, - {file = "debugpy-1.6.6-cp39-cp39-win32.whl", hash = "sha256:549ae0cb2d34fc09d1675f9b01942499751d174381b6082279cf19cdb3c47cbe"}, - {file = "debugpy-1.6.6-cp39-cp39-win_amd64.whl", hash = "sha256:de4a045fbf388e120bb6ec66501458d3134f4729faed26ff95de52a754abddb1"}, - {file = "debugpy-1.6.6-py2.py3-none-any.whl", hash = "sha256:be596b44448aac14eb3614248c91586e2bc1728e020e82ef3197189aae556115"}, - {file = "debugpy-1.6.6.zip", hash = "sha256:b9c2130e1c632540fbf9c2c88341493797ddf58016e7cba02e311de9b0a96b67"}, + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, ] [[package]] @@ -849,18 +850,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.10.7" +version = "3.11.0" description = "A platform independent file lock." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, - {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, + {file = "filelock-3.11.0-py3-none-any.whl", hash = "sha256:f08a52314748335c6460fc8fe40cd5638b85001225db78c2aa01c8c0db83b318"}, + {file = "filelock-3.11.0.tar.gz", hash = "sha256:3618c0da67adcc0506b015fd11ef7faf1b493f0b40d87728e19986b536890c37"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] @@ -920,14 +921,14 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2023.3.0" +version = "2023.4.0" description = "File-system specification" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.3.0-py3-none-any.whl", hash = "sha256:bf57215e19dbfa4fe7edae53040cc1deef825e3b1605cca9a8d2c2fadd2328a0"}, - {file = "fsspec-2023.3.0.tar.gz", hash = "sha256:24e635549a590d74c6c18274ddd3ffab4753341753e923408b1904eaabafe04d"}, + {file = "fsspec-2023.4.0-py3-none-any.whl", hash = "sha256:f398de9b49b14e9d84d2c2d11b7b67121bc072fe97b930c4e5668ac3917d8307"}, + {file = "fsspec-2023.4.0.tar.gz", hash = "sha256:bf064186cd8808f0b2f6517273339ba0a0c8fb1b7048991c28bc67f58b8b67cd"}, ] [package.extras] @@ -935,7 +936,9 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] fuse = ["fusepy"] gcs = ["gcsfs"] git = ["pygit2"] @@ -1086,14 +1089,14 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.1.0" +version = "6.2.1" description = "Read metadata from Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, - {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, + {file = "importlib_metadata-6.2.1-py3-none-any.whl", hash = "sha256:f65e478a7c2177bd19517a3a15dac094d253446d8690c5f3e71e735a04312374"}, + {file = "importlib_metadata-6.2.1.tar.gz", hash = "sha256:5a66966b39ff1c14ef5b2d60c1d842b0141fefff0f4cc6365b4bc9446c652807"}, ] [package.dependencies] @@ -1936,14 +1939,14 @@ files = [ [[package]] name = "nbclient" -version = "0.7.2" +version = "0.7.3" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "nbclient-0.7.2-py3-none-any.whl", hash = "sha256:d97ac6257de2794f5397609df754fcbca1a603e94e924eb9b99787c031ae2e7c"}, - {file = "nbclient-0.7.2.tar.gz", hash = "sha256:884a3f4a8c4fc24bb9302f263e0af47d97f0d01fe11ba714171b320c8ac09547"}, + {file = "nbclient-0.7.3-py3-none-any.whl", hash = "sha256:8fa96f7e36693d5e83408f5e840f113c14a45c279befe609904dbe05dad646d1"}, + {file = "nbclient-0.7.3.tar.gz", hash = "sha256:26e41c6dca4d76701988bc34f64e1bfc2413ae6d368f13d7b5ac407efb08c755"}, ] [package.dependencies] @@ -1954,19 +1957,19 @@ traitlets = ">=5.3" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme"] -test = ["ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.2.10" +version = "7.3.0" description = "Converting Jupyter Notebooks" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "nbconvert-7.2.10-py3-none-any.whl", hash = "sha256:e41118f81698d3d59b3c7c2887937446048f741aba6c367c1c1a77810b3e2d08"}, - {file = "nbconvert-7.2.10.tar.gz", hash = "sha256:8eed67bd8314f3ec87c4351c2f674af3a04e5890ab905d6bd927c05aec1cf27d"}, + {file = "nbconvert-7.3.0-py3-none-any.whl", hash = "sha256:8983a83d0b083d56b076019f0a319f63bc16af70c9372892b86a0aab0a264b1d"}, + {file = "nbconvert-7.3.0.tar.gz", hash = "sha256:b970a13aba97529c223d805dd0706c2fe04dfc05e250ad4e6f7ae33daf6fede1"}, ] [package.dependencies] @@ -2507,14 +2510,14 @@ ptyprocess = ">=0.5" [[package]] name = "pgmpy" -version = "0.1.21" +version = "0.1.22" description = "A library for Probabilistic Graphical Models" category = "dev" optional = false python-versions = "*" files = [ - {file = "pgmpy-0.1.21-py3-none-any.whl", hash = "sha256:3c442320e7822892813b4eb56e048729d3bde053a707b5bb032685af6b372246"}, - {file = "pgmpy-0.1.21.tar.gz", hash = "sha256:90e9abf636629b6c1528df5847d2861b06220d103b5da414fcc74df0ee94cbf1"}, + {file = "pgmpy-0.1.22-py3-none-any.whl", hash = "sha256:c5385498869364a36782601b78555669ae4c02f4850932918084bde47674a2ca"}, + {file = "pgmpy-0.1.22.tar.gz", hash = "sha256:b2deb8126ee4763ba3dcd35c5f0b9424750ddb1b7a9db090d57a8378f9e91e04"}, ] [package.dependencies] @@ -2548,79 +2551,82 @@ files = [ [[package]] name = "pillow" -version = "9.4.0" +version = "9.5.0" description = "Python Imaging Library (Fork)" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, - {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, - {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, - {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, - {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, - {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, - {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, - {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, - {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, - {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, - {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, - {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, - {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, - {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, - {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, - {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, - {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, - {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, - {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, - {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, - {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, - {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, - {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, - {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, - {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, - {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, - {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, - {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] @@ -2686,6 +2692,28 @@ tomli = ">=1.2.2" [package.extras] poetry-plugin = ["poetry (>=1.0,<2.0)"] +[[package]] +name = "pooch" +version = "1.7.0" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, + {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + [[package]] name = "portray" version = "1.8.0" @@ -2711,14 +2739,14 @@ yaspin = ">=0.15.0,<3" [[package]] name = "pre-commit" -version = "3.2.1" +version = "3.2.2" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pre_commit-3.2.1-py2.py3-none-any.whl", hash = "sha256:a06a7fcce7f420047a71213c175714216498b49ebc81fe106f7716ca265f5bb6"}, - {file = "pre_commit-3.2.1.tar.gz", hash = "sha256:b5aee7d75dbba21ee161ba641b01e7ae10c5b91967ebf7b2ab0dfae12d07e1f1"}, + {file = "pre_commit-3.2.2-py2.py3-none-any.whl", hash = "sha256:0b4210aea813fe81144e87c5a291f09ea66f199f367fa1df41b55e1d26e1e2b4"}, + {file = "pre_commit-3.2.2.tar.gz", hash = "sha256:5b808fcbda4afbccf6d6633a56663fed35b6c2bc08096fd3d47ce197ac351d9d"}, ] [package.dependencies] @@ -2939,14 +2967,14 @@ files = [ [[package]] name = "pymdown-extensions" -version = "9.10" +version = "9.11" description = "Extension pack for Python Markdown." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-9.10-py3-none-any.whl", hash = "sha256:31eaa76ce6f96aabfcea98787c2fff2c5c0611b20a53a94213970cfbf05f02b8"}, - {file = "pymdown_extensions-9.10.tar.gz", hash = "sha256:562c38eee4ce3f101ce631b804bfc2177a8a76c7e4dc908871fb6741a90257a7"}, + {file = "pymdown_extensions-9.11-py3-none-any.whl", hash = "sha256:a499191d8d869f30339de86fcf072a787e86c42b6f16f280f5c2cf174182b7f3"}, + {file = "pymdown_extensions-9.11.tar.gz", hash = "sha256:f7e86c1d3981f23d9dc43294488ecb54abadd05b0be4bf8f0e15efc90f7853ff"}, ] [package.dependencies] @@ -3019,18 +3047,17 @@ files = [ [[package]] name = "pytest" -version = "7.2.2" +version = "7.3.0" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.3.0-py3-none-any.whl", hash = "sha256:933051fa1bfbd38a21e73c3960cebdad4cf59483ddba7696c48509727e17f201"}, + {file = "pytest-7.3.0.tar.gz", hash = "sha256:58ecc27ebf0ea643ebfdf7fb1249335da761a00c9f955bcd922349bcb68ee57d"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" @@ -3039,7 +3066,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -3142,7 +3169,7 @@ viz = ["pygraphviz"] type = "git" url = "https://github.com/py-why/pywhy-graphs.git" reference = 'main' -resolved_reference = "ac6333bcf01a3ec77c3265831060d1ae9dc03024" +resolved_reference = "c1b410746fd5f6f640eb8ddc43d3e61760fd3a36" [[package]] name = "pywin32" @@ -4389,4 +4416,4 @@ viz = ["pygraphviz"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "07dc28f742cc74f0541e30f2ddee2613b3c17aae72bd9388cd4d9ecfbe71402a" \ No newline at end of file +content-hash = "42ef6a94d2ed75d315fca3d7e7d9e9d846a42abde2ba0bc514f0a146a0069775" diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index 97b0c801e..e9090f481 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -247,6 +247,7 @@ def test_figure2_skeleton(self): assert nx.is_isomorphic(subgraph, learned_graph.get_graphs(edge_type)) +@pytest.mark.skip() def test_psifci_withsachs(): bnlearn.import_DAG() From d414b0f17e96b3b0321b038fd87af85a59ae9430 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 12:25:09 -0400 Subject: [PATCH 36/61] Final merge Signed-off-by: Adam Li --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 189680275..db96614c7 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ In the future we plan on trying to integrate the two libraries. [pywhy-graphs](https://github.com/py-why/pywhy-graphs) is the home of graph data structures and graph algorithms in PyWhy. -[py-indep](https://github.com/py-why/py-indep) serves as a repository for implementations of (un)conditional independence tests, which can be utilized in various tasks, such as causal discovery. +[pywhy-stats](https://github.com/py-why/pywhy-stats) serves as a repository for implementations of (un)conditional independence tests, which can be utilized in various tasks, such as causal discovery. # dodiscover is moving to causal-learn eventually! @@ -91,7 +91,6 @@ Minimally, dodiscover requires: For explicit graph functionality for representing various causal graphs, such as ADMG, or CPDAGs, you will also need: * pywhy-graphs - * graphs # this is a development version for PRable MixedEdgeGraph to networkx For explicitly representing causal graphs, we recommend using `pywhy-graphs` package, but if you have a graph library that adheres to the graph protocols we require, then you can in principle use those graphs. From f0bc1367f9f170ce315b72725efab27d197016ca Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 12:26:19 -0400 Subject: [PATCH 37/61] Cleanup Signed-off-by: Adam Li --- .../conditional/ci/test_chisq_test.py | 156 ------------------ 1 file changed, 156 deletions(-) delete mode 100644 tests/unit_tests/conditional/ci/test_chisq_test.py diff --git a/tests/unit_tests/conditional/ci/test_chisq_test.py b/tests/unit_tests/conditional/ci/test_chisq_test.py deleted file mode 100644 index 5bd66d094..000000000 --- a/tests/unit_tests/conditional/ci/test_chisq_test.py +++ /dev/null @@ -1,156 +0,0 @@ -import numpy as np -import pandas as pd -from numpy.testing import assert_almost_equal - -from dodiscover.ci import CategoricalCITest - -df_adult = pd.read_csv("dodiscover/testdata/adult.csv") - - -def test_chisquare_adult_dataset(): - # Comparision values taken from dagitty (DAGitty) - ci_est = CategoricalCITest("pearson") - coef, p_value = ci_est.test(x_vars={"Age"}, y_vars={"Immigrant"}, z_covariates=[], df=df_adult) - assert_almost_equal(coef, 57.75, decimal=1) - assert_almost_equal(np.log(p_value), -25.47, decimal=1) - assert ci_est.dof_ == 4 - - coef, p_value = ci_est.test(x_vars={"Age"}, y_vars={"Race"}, z_covariates=[], df=df_adult) - assert_almost_equal(coef, 56.25, decimal=1) - assert_almost_equal(np.log(p_value), -24.75, decimal=1) - assert ci_est.dof_ == 4 - - coef, p_value = ci_est.test(x_vars={"Age"}, y_vars={"Sex"}, z_covariates=[], df=df_adult) - assert_almost_equal(coef, 289.62, decimal=1) - assert_almost_equal(np.log(p_value), -139.82, decimal=1) - assert ci_est.dof_ == 4 - - coef, p_value = coef, p_value = ci_est.test( - x_vars={"Education"}, - y_vars={"HoursPerWeek"}, - z_covariates=["Age", "Immigrant", "Race", "Sex"], - df=df_adult, - ) - assert_almost_equal(coef, 1460.11, decimal=1) - assert_almost_equal(p_value, 0, decimal=1) - assert ci_est.dof_ == 316 - - coef, p_value = ci_est.test(x_vars={"Immigrant"}, y_vars={"Sex"}, z_covariates={}, df=df_adult) - assert_almost_equal(coef, 0.2724, decimal=1) - assert_almost_equal(np.log(p_value), -0.50, decimal=1) - assert ci_est.dof_ == 1 - - coef, p_value = ci_est.test( - x_vars={"Education"}, y_vars={"MaritalStatus"}, z_covariates=["Age", "Sex"], df=df_adult - ) - assert_almost_equal(coef, 481.96, decimal=1) - assert_almost_equal(p_value, 0, decimal=1) - assert ci_est.dof_ == 58 - - # Values differ (for next 2 tests) from dagitty because dagitty ignores grouped - # dataframes with very few samples. Update: Might be same from scipy_vars=1.7.0 - coef, p_value = ci_est.test( - x_vars={"Income"}, - y_vars={"Race"}, - z_covariates=["Age", "Education", "HoursPerWeek", "MaritalStatus"], - df=df_adult, - ) - - assert_almost_equal(coef, 66.39, decimal=1) - assert_almost_equal(p_value, 0.99, decimal=1) - assert ci_est.dof_ == 136 - - coef, p_value = ci_est.test( - x_vars={"Immigrant"}, - y_vars={"Income"}, - z_covariates=["Age", "Education", "HoursPerWeek", "MaritalStatus"], - df=df_adult, - ) - assert_almost_equal(coef, 65.59, decimal=1) - assert_almost_equal(p_value, 0.999, decimal=2) - assert ci_est.dof_ == 131 - - -def test_discrete_tests(): - for t in [ - CategoricalCITest("pearson"), # chi-square - CategoricalCITest("log-likelihood"), # G^2 - CategoricalCITest("freeman-tukey"), # freeman-tukey - CategoricalCITest("mod-log-likelihood"), # Modified log-likelihood - CategoricalCITest("neyman"), # Neyman - CategoricalCITest("cressie-read"), # Cressie-read - ]: - assert ( - t.test( - x_vars={"Age"}, - y_vars={"Immigrant"}, - z_covariates=[], - df=df_adult, - )[1] - < 0.05 - ) - - assert ( - t.test( - x_vars={"Age"}, - y_vars={"Race"}, - z_covariates=[], - df=df_adult, - )[1] - < 0.05 - ) - - assert ( - t.test( - x_vars={"Age"}, - y_vars={"Sex"}, - z_covariates=[], - df=df_adult, - )[1] - < 0.05 - ) - assert not ( - t.test( - x_vars={"Immigrant"}, - y_vars={"Sex"}, - z_covariates=[], - df=df_adult, - )[1] - < 0.05 - ) - - # XXX: Test returns nan... - # assert ( - # t.test( - # x_vars={"Education"}, - # y_vars={"HoursPerWeek"}, - # z_covariates=["Age", "Immigrant", "Race", "Sex"], - # df=df_adult, - # )[1] < 0.05 - # ) - # assert ( - # t.test( - # x_vars={"Education"}, - # y_vars={"MaritalStatus"}, - # z_covariates=["Age", "Sex"], - # df=df_adult, - # )[1] < 0.05 - # ) - - -def test_exactly_same_vars(): - x = np.random.choice([0, 1], size=1000) - y = x.copy() - df = pd.DataFrame({"x": x, "y": y}) - - for t in [ - CategoricalCITest("pearson"), # chi-square - CategoricalCITest("log-likelihood"), # G^2 - CategoricalCITest("freeman-tukey"), # freeman-tukey - CategoricalCITest("mod-log-likelihood"), # Modified log-likelihood - CategoricalCITest("neyman"), # Neyman - CategoricalCITest("cressie-read"), # Cressie-read - ]: - stat, p_value = t.test(x_vars={"x"}, y_vars={"y"}, z_covariates=[], df=df) - assert t.dof_ == 1 - assert_almost_equal(p_value, 0, decimal=5) From 5879bda1408741f5a8c8abd4e6a3dfb180ef8952 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 14:34:24 -0400 Subject: [PATCH 38/61] Fixed Signed-off-by: Adam Li --- dodiscover/constraint/skeleton.py | 68 +++++-------------- .../constraint/test_intervene_skeleton.py | 10 +++ 2 files changed, 28 insertions(+), 50 deletions(-) diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index bb864beaa..da709ea6a 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1093,11 +1093,6 @@ def _compute_candidate_conditioning_sets( def _prep_second_stage_skeleton(self) -> Context: import pywhy_graphs as pgraphs - if self.max_path_length is None: - self.max_path_length_ = np.inf - else: - self.max_path_length_ = self.max_path_length - # convert the undirected skeleton graph to a PAG, where # all left-over edges have a "circle" endpoint sep_set = self.sep_set_ @@ -1126,6 +1121,14 @@ def _prep_second_stage_skeleton(self) -> Context: ) return context + def _initialize_params(self) -> None: + if self.max_path_length is None: + self.max_path_length_ = np.inf + else: + self.max_path_length_ = self.max_path_length + + return super()._initialize_params() + def fit(self, data: pd.DataFrame, context: Context): # initially learn the skeleton without using PDS information super().fit(data, context) @@ -1235,41 +1238,6 @@ def __init__( self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets - def _initialize_params(self) -> None: - """Initialize parameters for learning skeleton. - - Basic parameters that are used by any constraint-based causal discovery algorithms. - """ - # error checks of passed in arguments - if self.max_combinations is not None and self.max_combinations <= 0: - raise RuntimeError(f"Max combinations must be at least 1, not {self.max_combinations}") - - if self.condsel_method not in ConditioningSetSelection: - raise ValueError( - f"Skeleton method must be one of {ConditioningSetSelection}, not " - f"{self.condsel_method}." - ) - - if self.sep_set is None and not hasattr(self, "sep_set_"): - # keep track of separating sets - self.sep_set_ = defaultdict(lambda: defaultdict(list)) - elif not hasattr(self, "sep_set_"): - self.sep_set_ = self.sep_set # type: ignore - - # control of the conditioning set - if self.max_cond_set_size is None: - self.max_cond_set_size_ = np.inf - else: - self.max_cond_set_size_ = self.max_cond_set_size - if self.min_cond_set_size is None: - self.min_cond_set_size_ = 0 - else: - self.min_cond_set_size_ = self.min_cond_set_size - if self.max_combinations is None: - self.max_combinations_ = np.inf - else: - self.max_combinations_ = self.max_combinations - def evaluate_edge( self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None ) -> Tuple[float, float]: @@ -1336,8 +1304,8 @@ def evaluate_fnode_edge( data_j = data[distribution_idx[1]].copy() # name the group column the F-node, so Oracle works as expected - data_i[X] = 1 - data_j[X] = 0 + data_i[X] = 0 + data_j[X] = 1 data = pd.concat((data_i, data_j), axis=0) # compare conditional distributions P(Y | X) vs P'(Y | X), where 'group_col' @@ -1531,8 +1499,14 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # orient colliders self._orient_unshielded_triples(pag, sep_set) - # convert the adjacency graph - self.context_.add_state_variable("pag", pag) + # convert the adjacency graph into a PAG + # Note: in order to preserve PDS sets for PAG augmented with the F-node, we simply have + # to make it fully-connected, since at this stage, the intermediate PAG learned from FCI + # has not done anything with the F-node edges. + for f_node in f_nodes: + for node in non_f_nodes: + pag.add_edge(f_node, node, pag.directed_edge_name) + self.context_.add_state_variable("PAG", pag) # now, we'll fit the data using interventional data by looping over all # combinations of F-nodes and their neighbors @@ -1552,9 +1526,3 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: f_nodes_without_this = f_nodes.copy() f_nodes_without_this.remove(f_node) sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore - if len(sep_sets) > 0: - print( - f"Updated separating set for {x_var}, {y_var} with {f_nodes_without_this}" - ) - for idx in range(len(sep_sets)): - self.sep_set_[x_var][y_var][idx].update(f_nodes_without_this) diff --git a/tests/unit_tests/constraint/test_intervene_skeleton.py b/tests/unit_tests/constraint/test_intervene_skeleton.py index d0797741d..ef4291a4b 100644 --- a/tests/unit_tests/constraint/test_intervene_skeleton.py +++ b/tests/unit_tests/constraint/test_intervene_skeleton.py @@ -92,6 +92,11 @@ def test_fnode_skeleton_unknown_targets(): obs_expected_skeleton = expected_skeleton.copy() obs_expected_skeleton.remove_node(("F", 0)) + # import pywhy_graphs.networkx as pywhy_nx + # # 0 y ('F', 0) {'x'} + # print(pywhy_nx.m_separated(graph, {'y'}, ('F', 0), {'x'})) + # print(oracle.test(dummy_sample(graph), {'y'}, {('F', 0)}, {'x'})) + # define the learner and the context learner = LearnInterventionSkeleton( ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=False @@ -110,6 +115,11 @@ def test_fnode_skeleton_unknown_targets(): obs_skel_graph = learner.context_.state_variable("obs_skel_graph") assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + print(expected_skeleton.edges()) + print(skel_graph.edges()) + for edge in skel_graph.edges(): + if not expected_skeleton.has_edge(*edge): + print(edge) assert nx.is_isomorphic(expected_skeleton, skel_graph) From 4e383aa97c296145ac01622b4cfe0fa2932fdaf1 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 14:58:16 -0400 Subject: [PATCH 39/61] Fix slowness Signed-off-by: Adam Li --- .github/workflows/main.yml | 2 +- CONTRIBUTING.md | 4 ++-- DEVELOPING.md | 6 +++--- dodiscover/constraint/_classes.py | 3 +++ dodiscover/constraint/fcialg.py | 3 +++ dodiscover/constraint/intervention.py | 3 +++ dodiscover/constraint/pcalg.py | 3 +++ examples/plot_psifci_alg.py | 8 ++------ pyproject.toml | 6 +++--- 9 files changed, 23 insertions(+), 15 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2af725ceb..8c0ecb6e5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -43,7 +43,7 @@ jobs: # check formatting of the code style - name: Check code formatting - run: poetry run poe check_format + run: poetry run poe format_check # this applies various linting - name: Lint codebase diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2f167e81b..807dbb847 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -157,11 +157,11 @@ You can verify that your code will pass certain style, formatting and lint check ``verify`` runs a sequence of tests that can also be run individually. For example, you can check code formatting with black: - poetry run poe check_format + poetry run poe format_check If you would like to automatically black format your changes: - poetry run poe apply_format + poetry run poe format You can then check for code style and general linting: diff --git a/DEVELOPING.md b/DEVELOPING.md index 11870bf37..c14d3e4a3 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -10,8 +10,8 @@ There are a series of top-level tasks available through Poetry. These can each b `poetry run poe ` ### Basic Verification -* **apply_format** - runs the suite of formatting tools applying tools to make code compliant -* **check_format** - runs the suite of formatting tools checking for compliance +* **format** - runs the suite of formatting tools applying tools to make code compliant +* **format_check** - runs the suite of formatting tools checking for compliance * **lint** - runs the suite of linting tools * **typecheck** - performs static typechecking of the codebase using mypy * **unit_test** - executes fast unit tests @@ -31,7 +31,7 @@ Here we provide some details to understand the development process. For convenience ``poetry`` provides a command line interface for running all the necessary development commands: - poetry run poe apply_format + poetry run poe format This will run isort and black on the entire repository. This will auto-format the code to comply with our coding style. diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index fdf617b76..091a17c8d 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -99,6 +99,7 @@ def __init__( condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, apply_orientations: bool = True, keep_sorted: bool = False, + n_jobs: Optional[int] = None, ): self.alpha = alpha self.ci_estimator = ci_estimator @@ -117,6 +118,8 @@ def __init__( self.max_combinations = max_combinations self.keep_sorted = keep_sorted + self.n_jobs = n_jobs + # initialize the result properties we want to fit self.separating_sets_ = defaultdict(lambda: defaultdict(list)) self.graph_ = None diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index b51c99087..d6083b0a6 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -104,6 +104,7 @@ def __init__( max_path_length: Optional[int] = None, selection_bias: bool = True, pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, + n_jobs: Optional[int] = None, ): super().__init__( ci_estimator, @@ -114,6 +115,7 @@ def __init__( condsel_method=condsel_method, keep_sorted=keep_sorted, apply_orientations=apply_orientations, + n_jobs=n_jobs, ) self.max_iter = max_iter self.max_path_length = max_path_length @@ -833,6 +835,7 @@ def learn_skeleton( second_stage_condsel_method=self.pds_condsel_method, keep_sorted=self.keep_sorted, max_path_length=self.max_path_length, + n_jobs=self.n_jobs, ) skel_alg.fit(data, context) diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index fa44e6a4d..d3e0ff174 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -107,6 +107,7 @@ def __init__( max_path_length: Optional[int] = None, pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, known_intervention_targets: bool = False, + n_jobs: Optional[int] = None, ): super().__init__( ci_estimator, @@ -121,6 +122,7 @@ def __init__( max_path_length=max_path_length, selection_bias=False, pds_condsel_method=pds_condsel_method, + n_jobs=n_jobs, ) self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets @@ -141,6 +143,7 @@ def learn_skeleton( second_stage_condsel_method=self.pds_condsel_method, keep_sorted=False, max_path_length=self.max_path_length, + n_jobs=self.n_jobs, ) self.skeleton_learner_.fit(data, context) diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index 0af030357..74e51cb53 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -99,6 +99,7 @@ def __init__( apply_orientations: bool = True, keep_sorted: bool = False, max_iter: int = 1000, + n_jobs: Optional[int] = None, ): super().__init__( ci_estimator, @@ -109,6 +110,7 @@ def __init__( condsel_method=condsel_method, apply_orientations=apply_orientations, keep_sorted=keep_sorted, + n_jobs=n_jobs, ) self.max_iter = max_iter @@ -169,6 +171,7 @@ def learn_skeleton( max_combinations=self.max_combinations, condsel_method=self.condsel_method, keep_sorted=self.keep_sorted, + n_jobs=self.n_jobs, ) skel_alg.fit(data, context) diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 75792976e..38ba5ebf1 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -94,16 +94,12 @@ cd_estimator = GSquareCITest(data_type="discrete") alpha = 0.05 -learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha) +learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha, n_jobs=-1) # create context with information about the interventions ctx_builder = make_context(create_using=InterventionalContextBuilder) ctx: Context = ( - ctx_builder.variables(data=data[0]) - # .intervention_targets(intervention_targets) - .num_distributions(6) - .obs_distribution(False) - .build() + ctx_builder.variables(data=data[0]).num_distributions(6).obs_distribution(False).build() ) print(ctx.init_graph) diff --git a/pyproject.toml b/pyproject.toml index 4d7bbff0f..56495ade8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -158,11 +158,11 @@ ignore_fail = 'return_non_zero' sequence = ['_flake8', '_bandit', '_codespell', '_pydocstyle'] ignore_fail = 'return_non_zero' -[[tool.poe.tasks.apply_format]] +[[tool.poe.tasks.format]] sequence = ['_black', '_isort'] ignore_fail = 'return_non_zero' -[[tool.poe.tasks.check_format]] +[[tool.poe.tasks.format_check]] sequence = ['_black_check', '_isort_check'] ignore_fail = 'return_non_zero' @@ -170,7 +170,7 @@ ignore_fail = 'return_non_zero' # a standard verification sequence for use in pull requests # [[tool.poe.tasks.verify]] -sequence = ['apply_format', 'lint', 'type_check', 'unit_test'] +sequence = ['format', 'lint', 'type_check', 'unit_test'] ignore_fail = "return_non_zero" [[tool.poe.tasks.release]] From c2404f324ec4d3b5024aa98331a6dc8ce75aa4d2 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 15:02:07 -0400 Subject: [PATCH 40/61] Extend build time Signed-off-by: Adam Li --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0de35ee79..643b90ec8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -95,6 +95,7 @@ jobs: name: Build documentation command: | poetry run poe build_docs + no_output_timeout: 20m # Save the example test results - store_test_results: path: doc/_build/test-results From 5fb38f0acad861b524676ebf013098fdba0241c2 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 15:03:20 -0400 Subject: [PATCH 41/61] Remove unnecessary lines Signed-off-by: Adam Li --- dodiscover/_version.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/dodiscover/_version.py b/dodiscover/_version.py index 369e226dc..7d7c1b1a9 100644 --- a/dodiscover/_version.py +++ b/dodiscover/_version.py @@ -1,9 +1,5 @@ """Version number.""" -# TODO: Remove try/except once the minimum python requirement is bumped to 3.8 -try: - from importlib.metadata import version # type: ignore -except ImportError: - from importlib_metadata import version # type: ignore +from importlib.metadata import version # type: ignore __version__ = version(__package__) From 98fb727260f38a44c4179d2cc1f6284d1891db19 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 15:11:58 -0400 Subject: [PATCH 42/61] Remove jupyter notebook Signed-off-by: Adam Li --- Untitled.ipynb | 1796 ------------------------------------------------ 1 file changed, 1796 deletions(-) delete mode 100644 Untitled.ipynb diff --git a/Untitled.ipynb b/Untitled.ipynb deleted file mode 100644 index 26a3d7477..000000000 --- a/Untitled.ipynb +++ /dev/null @@ -1,1796 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "c742672f-1415-4035-af44-ac501d009785", - "metadata": {}, - "outputs": [], - "source": [ - "from pywhy_graphs.viz import draw\n", - "from dodiscover.ci import GSquareCITest, CategoricalCITest, CausalLearnCITest\n", - "from dodiscover import PsiFCI, Context, make_context, InterventionalContextBuilder\n", - "import networkx as nx\n", - "import pandas as pd\n", - "import bnlearn\n", - "import numpy as np\n", - "from pprint import pprint\n", - "from itertools import combinations\n", - "import pooch\n", - "\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "4c709a7c-1620-4d72-8905-f25306dc10d3", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[bnlearn] >Set node properties.\n", - "[bnlearn] >Set edge properties.\n", - "[bnlearn] >Plot based on Bayesian model\n", - " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk INT\n", - "0 1 1 1 2 3 2 1 3 1 2 1 8\n", - "1 1 1 1 1 3 3 2 3 1 2 1 8\n", - "2 1 1 2 2 3 2 1 3 2 1 1 8\n", - "3 1 1 1 1 3 2 1 3 1 3 1 8\n", - "4 1 1 1 1 3 2 1 3 1 1 1 8\n", - "(5400, 12)\n" - ] - }, - { - "data": { - "image/png": "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KNAPfvCDU3JyHgAAx9LdrKjnvkoCAAAAHwMej0ehUEijR4/W8uXL9cADD+jcc89VIpHQvn37VFdXp1QqpXg8rgMHDvTYvM3Nzfrnf/5n/ehHP9Jll12mJ554gtAJAHDGY6sdAAAA8BGmaeqFF17QRRddpKKiIt1444268cYbtXnzZi1cuFDPPPOMdu3aJbvdrvr6evXt2/ek53zzzTf17//+7zIMQz//+c81Y8aMHngSAABOPYInAAAA4COqq6tVX1+vyy67rMvrw4YN07Bhw3TXXXdp+fLlqqqqUllZ2UnNFYlE9POf/1zPPvusZs6cqW9/+9vKzc09qTEBADidEDwBAAAAH/HCCy+of//+Gjt27GGv2+12TZs2TdOmTTupedavX6/vfOc7amho0De/+U1dffXVMgzjpMYEAOB0Q48nAAAA4H3RaFSvvvqqLrnkkrSFQKlUSr/97W916623KiMjQ3/60590zTXXEDoBAD6WqHgCAAAA3vf6668rHA7r0ksvTcv4e/fu1X333ad169bps5/9rP7f//t/cjj4lhwA8PHFVzkAAADgfS+88IImTJig4uLiHh3Xsiw9//zz+ulPf6qcnBz99re/1bhx43p0DgAATkcETwAAAICkxsZGLV++XN/4xjd6dNzW1lbdf//9Wrx4sa644grdc8898vl8PToHAACnK4InAAAAfKyZpqnaxlYFOyKKJ5Jy2G1yOR3q1ydHmX5P532LFi2Sw+HQhRde2GNzL126VN/73veUTCb1k5/8RLNnz+6xsQEAOBMQPAEAAOBjxTRNvbthl6o37NDG7bXasKNW7aGIkilTlmXJkCHDZsjlcKh/Ya7GDOmvYSX99NyCFzVz5kxlZmae9BpisZh++ctf6qmnntK5556r7373u8rPz++BpwMA4MxC8AQAAICPhbaOsF5Zuk5/e3WVtu6pVzKZkiS5XU65XQ75PHYZhmRZB3suxRJJbd1dr007apVKpdTa4lff4QO0ZtMujRs28IRPmdu0aZO+/e1va9++fbr33nv1yU9+khPrAABnLYInAAAAnNFSKVN/fXWVHn56sZqDIdkMKcvvldvlPGrg43Y5Jf/Bf66rq5PN5tCKTfu1+t8fVcWowbr31ks1sF/3q5RM09Qf//hHPfjggyotLdXjjz+u0tLSk308AADOaARPAAAAOGPt2d+kBx5b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x5RXXKaCklFyuDySDDXVblNz7XalUsd/ctoH28aOR319fWd/purqau3evVuSNGjQIFVUVOi2227TxIkT1bfvoaernQqpVEo7duzoDJhqamq0ZcsWJZNJ2e12DR06VBMmTNANN9ygUaNGHRImLly4UM8995xM0zxsc3PLspRIJGS32+VKBpWKBGXzZMhuN2XJkt1m16BBg+Q8wS10J6M9HFWGz6N5543r9bmBswnB0xmgua1DW3fXv/+nTg1NQcUSCRmGIY/bqQGFeRoyoEBDBxWqtH9f+bzuU71kAAAAnIXGjRsny7KUTCbV0dGh9vZ21dbWavHixbLZbHK73fL7/Ro6dKgqKipUF8lVPPFh5cvRuL0ZKpt4gZLxqLZUvapNyxdp9PQrJUnb17ypRCyiCXPmq//wii7vW/v6M2qu3X7cz2JZktt17DCktra2M2iqqqpSbW2tJKm0tFRTp07VF77wBZWXlysvL++419DTLMvSnj17DtkuF41GZRiGBg8erFGjRunyyy/X6NGjNXToULlcrqOO+eUvf1nPP/+8UqnUIcGTaZpKJpOd2+/i8ZgyInWyZYyUlTQlM6WioiL5fL50PvZhmaalcCSuyy6YqL55gV6fHzibEDydpqLxhN5ctVF/f61K723Zo2gscXD/sySbzZChg1+YTcvS0tVbJVlyOOzyelyaWTFCl59frokjB/X6kaoAAAA4e1133XW66667lEgk5HYf/GWoZVkyTVOmaSoSiSgSiaihoUHvvPOOsoeeJ1/BcDXu3yOXyyWfzyd/hl9288hb3IZUzNHujSu1c91SDR43Q76sXIXbmiRJhYNHd7nXsiy11O08oWcxTVN987IOGW/v3r2dIVN1dbXq6upkGIaGDh2qmTNnqry8XBMnTlROTve39aWDZVlqbGzsrGJav369NmzYoPb2dklScXGxRo8erQsuuECjRo3SiBEjTigAOv/885WXl6fGxsYulWyJREKpVEqGYcjtdis/P1/Z2dkybBG1JjuUtPmUk52l3NxDe3P1hqa2duVlZ+i262adkvmBswnB02kmFInpyReX6rnFVao70CpLlvwej3Ky/HLYbUf8TZBlWYonUorG4nrhjXdV+fZaDRlYqE/NO0eXzBhPAAUAAIC0y87O1rBhw7Ru3brO1wzDkN1u77I964PTz1KRNkmWUqmUIpGIwpGw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RERERGeJu9oRERF5mCiKeOutt/DRRx/hH//4B2655RZPL8kjRFHE2rVrcf/998Pf3x9r165l6ERERETUzbHiiYiIyINEUcSKFSvwwQcf4Mknn8Rtt93m6SV5hMFgwLx58/DXX3/hjjvuwLRp06BSqTy9LCIiIiI6RwyeiIiIPGj16tV477338Nhjj+H222/39HI8Yt++fZgxYwbMZjOWLl2KMWPGeHpJRERERNRO2GpHRETkIatXr8bbb7+NRx99FHfddZenl9PpBEHAhx9+iIkTJyI8PBzr1q1j6ERERETUw7DiiYiIyAPeffddrF69GlOnTsXdd9/t6eV0utraWsydOxebNm3Cfffdh8mTJ0OhUHh6WURERETUzhg8ERERdbL33nsPK1aswMMPP4z77rvP08vpdLt27cKsWbPgcDiwbNkyjBgxwtNLIiIiIqIOwlY7IiKiTvThhx9i+fLlmDRpEu6//35PL6dTCYKAt99+G5MnT0ZcXBzWrl3L0ImIiIioh2PFExERUSf56KOPsGzZMjz00EN48MEHPb2cTlVdXY3Zs2djx44dePDBBzFx4kTI5bz+RURERNTTMXgiIiLqBJ988gneeOMNPPDAA+dd6LR161bMmTMHMpkMK1aswJAhQzy9JCIiIiLqJLzUSERE1MHWrl2LV199Fffffz8mT54MmUzm6SV1CqfTieXLl2PatGno27cv1q1bx9CJiIiI6DzDiiciIqIO9M9//hNLly7FPffcgylTppw3oVNFRQVmzpyJffv2STv3sbWOiIiI6PzD4ImIiKiDfPrpp3j55Zdx9913Y9q0aedN6LRhwwbMnTsXGo0Gb7/9NgYNGuTpJRERERGRhzB4IiIi6gCfffYZlixZgjvuuAOPPPLIeRE6ORwOvPXWW1izZg1Gjx6NefPmwc/Pz9PLIiIiIiIPYvBERETUzr744gssXrwYt99+Ox5//PHzInQqLS3FzJkzkZ2djSeeeAK33377efG8iYiIiOj0GDwRERG1oy+//BKLFi3CrbfeiieeeOK8CF/++OMPzJ8/Hz4+PnjvvfeQmprq6SURERERURfB4ImIiKidfPPNN3j++edx88034x//+EePD51sNhtef/11/Otf/8LFF1+MOXPmwMfHx9PLIiIiIqIuhMETERFRO/j222+xYMEC3HjjjXj66ad7fOhUVFSEGTNm4OjRo3jmmWdw44039vjnTERERERtx+CJiIjoHH3//feYP38+rr/+ekyfPr3HBzA///wzFi5ciKCgIHzwwQfo16+fp5dERERERF0UgyciIqJz8MMPP2DevHm49tprkZmZCblc7ukldRir1YpXXnkFX3zxBS6//HLMmjULOp3O08siIiIioi6MwRMREdFZ+umnnzBv3jxMmDABM2fO7NGhU35+PjIzM1FYWIjZs2fj2muv7fGVXURERER07nruK2QiIqIO9PPPP+PZZ5/F1VdfjdmzZ/fo0On777/HnXfeCafTiTVr1uC6665j6ERERERErcKKJyIiojb65ZdfMHv2bFxxxRWYM2dOjw2dzGYzXnzxRXz33Xe45ppr8PTTT8PLy8vTyyIiIiKiboTBExERURv89ttvmDVrFi6//HLMmzevx4ZOubm5yMzMRHl5OebPn4+rrrrK00siIiIiom6oZ75aJiIi6gB//PEHZs6cicsuuwzPPfdcjwydRFHEl19+ibvvvhtKpRJr1qxh6EREREREZ40VT0RERK3w559/IjMzE5dccgnmz5/fI0Mno9GI559/Hj///DNuuOEG/OMf/4BGo/H0soiIiIioG2PwREREdAZ//fUXnnnmGYwdOxYLFiyAQqHw9JLa3aFDh5CZmYnq6mosWrQI48aN8/SSiIiIiKgH6HmXa4mIiNrR+vXrMX36dIwZMwYLFy7scaGTKIr49NNPce+990Kv1+OTTz5h6ERERERE7YYVT0RERKewceNGTJ8+HaNHj8aiRYugVPasH5sNDQ1YsGABfv/9d9x666149NFHoVarPb0sIiIiIupBetYraCIionayadMmPP300xg5cmSPDJ0OHDiAmTNnoqGhAS+//DL+9re/eXpJRERERNQDsdWOiIjoJFu2bMFTTz2F4cOHY/HixVCpVJ5eUrsRRREff/wxHnjgAQQGBuKTTz5h6EREREREHaZnXb4lIiI6R9u2bcOTTz6JoUOH9rjQqb6+HvPmzcP69etx99134+GHH+5xlVxERERE1LXw1SYREdF/bd++HY8//jiGDBmCJUuW9Kh5R3v27MHMmTNhtVrx2muvYdSoUZ5eEhERERGdB9hqR0REBGDnzp14/PHHMXjwYLz88ss9JnQSBAHvv/8+HnroIURFRWHdunUMnYiIiIio07DiiYiIznu7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RORRBoMBDz/8MCorK7Fq1Sr06tXL00s6pU2bNuHZZ5+FWq3GqlWrkJ6e7uklERERERF1aQyeiIjIY1yhU3l5OVauXNllQyeHw4Hly5fjo48+woUXXojnnnsO/v7+nl4WEREREVGXx+CJiIg8oqGhAdOmTcPx48excuVK9OnTx9NLatHx48cxc+ZMZGVl4fHHH8ftt9/O1joiIiIiolZi8ERERJ2usbERU6dORXFxMVauXInExERPL6lFf/75J5577jno9Xq88847GDBggKeXRERERETUrTB4IiKiTmU0GjFt2jQUFxdjxYoV6Nu3r6eX1IzNZsOyZcuwbt06jB07FnPmzIGvr6+nl0VERERE1O0weCIiok5jMpnwyCOPoKCgAMuXL0e/fv08vaRmiouLMWPGDOTm5mL69Om46aabIJPJPL0sIiIiIqJuicETERF1ClfodOzYMSxfvhzJycmeXlIzv/zyCxYuXIiAgAC89957XXKNRERERETdCYMnIiLqcCaTCY8++ihyc3OxfPlypKSkeHpJbqxWK5YuXYrPP/8c48aNw6xZs6DX6z29LCIiIiKibo/BExERdSiz2YzHH38chw8fxvLly5GamurpJbkpKChAZmYmCgoKMHPmTFx//fVsrSMiIiIiaifcD5qIiDqMxWLB448/jpycHLz55pvo37+/p5fk5ocffsCdd94Ju92ODz/8EDfccANDJyIiIiKidsSKJyIi6hAWiwVPPPEEsrKy8Oabb2LgwIGeXpLEbDbjpZdewjfffIOrr74azzzzDHQ6naeXRURERETU4zB4IiKidme1WvHkk0/iwIEDeOONNzBo0CBPL0ly7NgxZGZmorS0FPPmzcP48eM9vSQiIiIioh6LrXZERNSuXKHTvn378PrrryM9Pd3TSwIAiKKIr7/+GnfddRdkMhnWrFnD0ImIiIiIqIOx4omIiNqNzWbD008/jT179uCNN95ARkaGp5cEoGlXvUWLFuGnn37C9ddfj6eeegoajcbTyyIiIiIi6vEYPBERUbuw2Wx46qmnsGPHDrz++usYPHiwp5cEADh8+DAyMzNRVVWF559/Hpdffrmnl0REREREdN5g8EREROfMZrNh+vTp2LFjB1577TVccMEFnl4SRFHEZ599hldffRUJCQn4+OOPERsb6+llERERERGdVxg8ERHRObHb7cjMzMS2bduwdOlSDB061NNLQkNDAxYuXIjffvsNN998Mx5//HGo1WpPL4uIiIiI6LzD4ImIiM6aK3TavHkzXnnlFQwfPtzTS0JWVhYyMzNhMBiwZMkSXHzxxZ5eEhERERHReYu72hER0VlxOByYOXMmNm3ahJdffhkjR4706HpEUcTatWtx//33IyAgAGvXrmXoRERERETkYax4IiKiNnOFTuvXr8dLL72ECy+80KPrMRgMmDdvHv766y/ceeedmDp1KlQqlUfXREREREREDJ6IiKiNnE4nZs+ejb/++gtLlizB6NGjPbqevXv3YubMmTCbzXj11Vc9vh4iIiIiIvofttoREVGrOZ1OzJkzB3/88QdefPFFjBkzxmNrEQQBH3zwAR588EGEh4dj3bp1DJ2IiIiIiLoYVjwREVGrCIKAuXPn4rfffsPixYtx0UUXeWwtNTU1mDt3LrZs2YL77rsPkyZNgkKh8Nh6iIiIiIioZQyeiIjojARBwLx58/Dzzz9j8eLFGDt2rMfWsnPnTsyaNQtOpxPLli3rEjvpERERERFRy9hqR0REpyUIAp577jn89NNPWLRokcd2ihMEAatXr8aUKVMQHx+PdevWMXQiIiIiIuriWPFERESnJAgCFixYgB9//BELFy7EpZde6pF1VFVVYfbs2di1axcefPBBPPDAA5DLee2EiIiIiKirY/BEREQtEgQBCxcuxPfff4/58+dj3LhxHlnHli1bMGfOHCgUCqxYsQKDBw/2yDqIiIiIiKjteLmYiIiaEQQBixYtwrfffot58+bhiiuu6PQ1OJ1OLF++HI888giSkpKwdu1ahk5ERERERN0MK56IiMiNIAhYvHgxvv76a8ybNw9XXXVVp6+hvLwcM2fOxP79+zF16lTcfffdbK0jIiIiIuqGGDwREZFEFEUsWbIEX375JZ599llcffXVnb6GDRs24Nlnn4WXlxfefvttDBo0qNPXQERERERE7YPBExERAWgKnV566SV89tlnePbZZzFhwoROPb/dbsdbb72Fjz/+GGPGjMHcuXPh5+fXqWsgIiIiIqL2xeCJiIggiiJeeeUVfPrpp5g9ezauueaaTj1/aWkpZsyYgUOHDuHJJ5/EbbfdBplM1qlrICIiIiKi9sfgiYjoPCeKIl599VX885//xMyZM3Hdddd16vl///13zJ8/H76+vnj33XeRmpraqecnIiIiIqKOw+CJiOg8JooiXnvtNaxduxaZmZm44YYbOu3cNpsNr732Gj799FNcfPHFmDNnDnx8fDrt/ERERERE1PEYPBERnadEUcSyZcvwySefYPr06bjxxhs77dxFRUXIzMzEsWPH8Mwzz+DGG29kax0RERERUQ/E4ImI6DwkiiLefPNNfPTRR3j66adx8803d9q5f/75ZyxcuBDBwcH48MMP0bdv3047NxERERERdS4GT0RE5xlRFLFixQp8+OGHePLJJ3HLLbd0ynmtVitefvllfPnll7jiiiswc+ZM6HS6Tjk3ERERERF5BoMnIqLziCiKWLlyJd577z088cQTuP322zvlvHl5ecjMzERxcTHmzJmDa665hq11RERERETnAbmnF0BERJ3n7bffxrvvvovHHnsMd9xxR6ec87vvvsNdd90FQRDw0Ucf4dprr2XoRERERER0nmDFExHReeLtt9/G6tWr8cgjj+Cuu+7q8POZTCa8+OKL+P7773HNNdfg6aefhpeXV4efl4iIiIiIug4GT0RE54H33nsPq1atwtSpU3HPPfd0+PmOHDmCGTNmoLy8HPPnz8dVV13V4eckIiIiIqKuh612REQ93Pvvv4/ly5djypQpuO+++zr0XKIo4osvvsA999wDlUqFNWvWMHQiIiIiIjqPseKJiKgH++ijj/DWW29h0qRJeOCBBzr0XEajEc8//zx+/vln/P3vf8eTTz4JjUbToeckIiIiIqKujcETEVEPtWbNGrzxxht48MEH8eCDD3bouXJycpCZmYmamhq88MILuOyyyzr0fERERERE1D2w1Y6IqAdau3YtXn/9dTzwwAN46KGHOuw8oijiX//6F+677z74+Phg7dq1DJ2IiIiIiEjCiicioh5m3bp1WLp0Ke677z5MnjwZMpmsQ85jMBiwYMEC/PHHH7jtttvwyCOPQK1Wd8i5iIiIiIioe2LwRETUg/zrX//CK6+8gnvuuQcPP/xwh4VOBw4cwIwZM9DY2IiXX34Zf/vb3zrkPERERERE1L2x1Y6IqIf49NNP8dJLL+Guu+7CtGnTOiR0EgQBa9aswQMPPIDg4GCsXbuWoRMREREREZ0SK56IiHqAzz//HEuWLMEdd9yBRx99tENCp7q6OsybNw8bNmzA3XffjYcffhhKJX+MEBERERHRqfE3BiKibu6LL77ACy+8gNtuuw2PP/54h4ROu3fvxqxZs2Cz2fDGG29g5MiR7X4OIiIiIiLqedhqR0TUjX311VdYtGgRbrnlFjz55JPtHjoJgoD33nsPkyZNQlRUFNauXcvQiYiIiIiIWo0VT0RE3dQ333yD559/HjfffDOeeuqpdg+dampqMGfOHGzbtg0PPPAAHnzwQSgUinY9BxERERER9WwMnoiIuqHvvvsOCxYswN///nc8/fTT7R46bdu2DbNnzwYAvPXWWxg6dGi7Hp+IiIiIiM4PbLUjIupmfvjhBzz33HO4/vrrMX369HYNnQRBwKpVqzB16lT06dMH69atY+hERERERERnjRVPRETdyI8//oi5c+fi2muvRWZmJuTy9rt+UFFRgdmzZ2PPnj2YMmUK7r333nY9PhERERERnX8YPBERdRP//ve/MXfuXEyYMAEzZ85s11Bo06ZNePbZZ6FSqbBy5UpkZGS027GJiIiIiOj8xUvZRETdwM8//4w5c+bg6quvxuzZs9stdHI4HFi2bBkeffRRpKSkYO3atQydiIiIiIio3bDiiYioi/v1118xe/ZsXHHFFZgzZ067hU5lZWWYOXMmDh48iEcffRR33nknW+uIiIiIiKhdMXgiIurCfv/9d8ycOROXX3455s2b127B0F9//YV58+ZBp9Ph7bffxsCBA9vluERERERERCdi8ERE1EX98ccfmDFjBi677DI899xz7RI62e12LFu2DGvXrsXf/vY3PPvss/D19W2H1RIRERERETXH4ImIqAv6888/kZmZiUsuuQTz589vl9CppKQEM2bMwOHDh/HUU0/hlltugUwma4fVEhERERERtYzBExFRF/PXX3/hmWeewdixY7FgwQIoFIpzPuavv/6KBQsWwN/fH++99x5SUlLaYaVERERERESnx+CJiKgL2bBhA6ZPn44xY8Zg4cKF5xw62Ww2LF26FJ999hkuu+wyzJo1C97e3u20WiIiIiIiotNj8ERE1EVs2rQJTz/9NEaPHo1FixZBqTy3b9EFBQWYMWMG8vPzMXPmTFx//fVsrSMiIiIiok7F4ImIqAvYvHkznnrqKYwcObJdQqcffvgBL7zwAkJDQ/HBBx+gb9++7bRSIiIiIiKi1mPwRETkYVu2bME//vEPDB8+HIsXL4ZKpTrrY1ksFixZsgTffPMNrrrqKmRmZkKn07XjaomIiIiIiFqPwRMRkQdt27YNTz75JIYOHXrOodOxY8eQmZmJ0tJSzJ07F+PHj2drHRERERERedS5789NRERnZfv27XjiiScwZMgQLFmyBGq1+qyOI4oivvnmG9x1110AgI8++ggTJkxg6ERERERERB7HiiciIg/YuXMnHn/8cWRkZODll18+69DJZDLhhRdewI8//ojrrrsOTz31FLRabTuvloiIiIiI6OwweCIi6mS7du3CY489hrS0tHMKnQ4fPozMzExUVVVh4cKFuOKKK9p5pUREREREROeGwRMRUSfavXs3HnvsMQwcOBBLly6FRqNp8zFEUcTnn3+OpUuXIj4+Hh9//DFiY2M7YLVERERERETnhsETEVEn2bt3Lx577DGkpqaedejU2NiIhQsX4tdff8XNN9+Mxx9//KwrpoiIiIiIiDoagyciok6wb98+PPLII0hOTsarr756VnOYsrKykJmZCYPBgCVLluDiiy/ugJUSERERERG1H+5qR0TUwQ4cOIBp06YhKSkJr732Gry8vNr0eFEUsXbtWtx///3w9/fHJ598wtCJiIiIiIi6BVY8ERF1oIMHD2Lq1Kno27fvWYVOBoMB8+bNw19//YU77rgD06ZNg0ql6qDVEhERERERtS8GT0REHSQrKwtTp05F79698cYbb0Cn07Xp8fv27cOMGTNgNpuxdOlSjBkzpoNWSkRERERE1DHYakdE1AFycnIwdepU9OrVC8uWLWtT6CQIAj788ENMnDgRYWFhWLt2LUMnIiIiIiLqlljxRETUzg4dOoSHH34YcXFxeOONN6DX61v92NraWsydOxebNm3Cfffdh0mTJkGp5LdqIiIiIiLqnvjbDBFROzp8+DCmTJmC6OhovPnmm/D29m71Y3ft2oVZs2bB4XBg2bJlGDFiRAeulIiIiIiIqOOx1Y6IqJ0cOXJECp3eeuutVodOgiDg7bffxuTJkxEbG4u1a9cydCIiIiIioh6BFU9ERO3g6NGjmDJlCiIiIvDmm2/Cx8enVY+rqqrCnDlzsGPHDjz44IOYOHEi5HJeEyAiIiIiop6BwRMR0Tk6duwYJk+ejNDQUCxfvhy+vr6tetzWrVsxZ84cyGQyLF++HBdccEEHr5SIiIiIiKhz8bI6EdE5cIVOISEhWLFiRatCJ6fTieXLl2PatGno27cv1q1b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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# use pooch to download robustly from a url\n", - "url = \"https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz\"\n", - "file_path = pooch.retrieve(\n", - " url=url,\n", - " known_hash=\"md5:39ee257f7eeb94cb60e6177cf80c9544\",\n", - ")\n", - "\n", - "df = pd.read_csv(file_path, delimiter=\" \")\n", - "\n", - "# the ground-truth dag is shown here: XXX: comment in when errors are fixed\n", - "ground_truth_dag = bnlearn.import_DAG(\"sachs\", verbose=False)\n", - "fig = bnlearn.plot(ground_truth_dag)\n", - "\n", - "# .. note::\n", - "# The Sachs dataset has previously been preprocessed, and the steps are described\n", - "# in bnlearn, at the web-page https://www.bnlearn.com/research/sachs05/.\n", - "print(df.head())\n", - "print(df.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "7a908aeb-d993-454e-80a8-144aadf90923", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OutEdgeView([('Erk', 'Akt'), ('PKA', 'Akt'), ('PKA', 'Erk'), ('PKA', 'Jnk'), ('PKA', 'Mek'), ('PKA', 'P38'), ('PKA', 'Raf'), ('Mek', 'Erk'), ('PKC', 'Jnk'), ('PKC', 'Mek'), ('PKC', 'P38'), ('PKC', 'PKA'), ('PKC', 'Raf'), ('Raf', 'Mek'), ('PIP3', 'PIP2'), ('Plcg', 'PIP2'), ('Plcg', 'PIP3')])\n" - ] - } - ], - "source": [ - "pprint(ground_truth_dag['model'].to_directed().edges)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "1aa43d9a-a88d-459b-9b32-388f794885c0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6 6\n" - ] - } - ], - "source": [ - "# %%\n", - "# Preprocess the dataset\n", - "# ----------------------\n", - "# Since the data is one dataframe, we need to process it into a form\n", - "# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We\n", - "# will form a list of separate dataframes.\n", - "unique_ints = df[\"INT\"].unique()\n", - "\n", - "# get the list of intervention targets and list of dataframe associated with each intervention\n", - "intervention_targets = [df.columns[idx] for idx in unique_ints]\n", - "data_cols = [col for col in df.columns if col != \"INT\"]\n", - "data = []\n", - "for interv_idx in unique_ints:\n", - " _data = df[df[\"INT\"] == interv_idx][data_cols]\n", - " data.append(_data)\n", - "\n", - "print(len(data), len(intervention_targets))" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "e75376cb-d467-47fd-92bd-84ef21a35f4f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Graph with 26 nodes and 325 edges\n", - "[('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n" - ] - } - ], - "source": [ - "# Our dataset is comprised of discrete valued data, so we will utilize the\n", - "# G^2 (Chi-square) CI test.\n", - "ci_estimator = GSquareCITest(data_type='discrete')\n", - "# ci_estimator = CategoricalCITest(lambda_='log-likelihood')\n", - "# ci_estimator = CausalLearnCITest()\n", - "\n", - "# Since our data is entirely discrete, we can also use the G^2 test as our\n", - "# CD test.\n", - "cd_estimator = GSquareCITest(data_type='discrete')\n", - "# cd_estimator = CategoricalCITest(lambda_='log-likelihood')\n", - "# cd_estimator = CausalLearnCITest()\n", - "\n", - "alpha = 0.05\n", - "learner = PsiFCI(\n", - " ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha\n", - ")\n", - "\n", - "# create context with information about the interventions\n", - "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", - "ctx: Context = (\n", - " ctx_builder.variables(data=data[0])\n", - " # .intervention_targets(intervention_targets)\n", - " .num_distributions(6)\n", - " .obs_distribution(False)\n", - " .build()\n", - ")\n", - "\n", - "print(ctx.init_graph)\n", - "print(ctx.f_nodes)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "3d6ac82a-6a5c-4c46-b8c1-7cd09101c5f8", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1280.\n", - "Not enough samples. 1200 is too small. Need 1280.\n", - "Not enough samples. 1800 is too small. Need 1920.\n", - "Not enough samples. 1800 is too small. Need 1920.\n", - "Not enough samples. 1800 is too small. Need 1920.\n", - "Not enough samples. 1800 is too small. Need 1920.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1440.\n", - "Not enough samples. 1200 is too small. Need 1280.\n", - "Updated separating set for Raf, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Raf, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for PIP3, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for PIP3, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for P38, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for P38, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for P38, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKA, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for Jnk, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for Jnk, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Jnk, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for Plcg, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for Plcg, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for Akt, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Akt, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Erk, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 14) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for PIP2, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for PIP2, ('F', 13) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for PKC, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKC, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKC, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKC, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKC, ('F', 8) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for PKC, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 4) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 7) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 10) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 5) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 0) with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 1) with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 2) with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 3) with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 9) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 12) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 6) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for Mek, ('F', 11) with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), Plcg with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), Akt with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), PIP2 with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), PIP3 with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), Erk with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), Raf with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), P38 with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 0), Mek with [('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 4), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 5), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 7), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 8), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 10), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 11), PKC with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 13), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 13), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 13), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 13), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 13), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 13), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 13), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 14)]\n", - "Updated separating set for ('F', 1), Raf with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), PIP3 with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), P38 with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), Jnk with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), Plcg with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), Akt with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), Erk with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), PIP2 with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 1), Mek with [('F', 0), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), Raf with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), P38 with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), Plcg with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), Erk with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), PIP2 with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), PIP3 with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), Jnk with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), Akt with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 2), Mek with [('F', 0), ('F', 1), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 3), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 6), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), Raf with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 9), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), Erk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 12), Mek with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 13), ('F', 14)]\n", - "Updated separating set for ('F', 14), P38 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for ('F', 14), Akt with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for ('F', 14), PIP2 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for ('F', 14), PIP3 with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for ('F', 14), PKA with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for ('F', 14), Jnk with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n", - "Updated separating set for ('F', 14), Plcg with [('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13)]\n" - ] - } - ], - "source": [ - "# `fit` design. All fitted attributes contain an underscore at the end.\n", - "learner = learner.fit(data, ctx)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "7c25044c-99f7-4255-87f7-9a5d845b77e6", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are 47 edges in the resulting PAG\n" - ] - } - ], - "source": [ - "# %%\n", - "# Analyze the results\n", - "# ===================\n", - "# Now that we have learned the graph, we will show it here. Note differences and similarities\n", - "# to the ground-truth DAG that is \"assumed\". Moreover, note that this reproduces Supplementary\n", - "# Figure 8 in :footcite:`Jaber2020causal`.\n", - "est_pag = learner.graph_\n", - "\n", - "print(f\"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG\")" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "9f3e89fb-9ef6-4ad8-8198-164ba3032dd5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Raf\n", - "\n", - "Raf\n", - "\n", - "\n", - "\n", - "Mek\n", - "\n", - "Mek\n", - "\n", - "\n", - "\n", - "Raf->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Jnk\n", - "\n", - "Jnk\n", - "\n", - "\n", - "\n", - "P38\n", - "\n", - "P38\n", - "\n", - "\n", - "\n", - "Jnk->P38\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC\n", - "\n", - "PKC\n", - "\n", - "\n", - "\n", - "Jnk->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC->P38\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKA\n", - "\n", - "PKA\n", - "\n", - "\n", - "\n", - "Erk\n", - "\n", - "Erk\n", - "\n", - "\n", - "\n", - "PKA->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Akt\n", - "\n", - "Akt\n", - "\n", - "\n", - "\n", - "Akt->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)\n", - "\n", - "('F', 13)\n", - "\n", - "\n", - "\n", - "('F', 13)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 13)->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 12)\n", - "\n", - "('F', 12)\n", - "\n", - "\n", - "\n", - "('F', 12)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 12)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP3\n", - "\n", - "PIP3\n", - "\n", - "\n", - "\n", - "('F', 12)->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg\n", - "\n", - "Plcg\n", - "\n", - "\n", - "\n", - "('F', 12)->Plcg\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP2\n", - "\n", - "PIP2\n", - "\n", - "\n", - "\n", - "('F', 12)->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 11)\n", - "\n", - "('F', 11)\n", - "\n", - "\n", - "\n", - "('F', 11)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 11)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 8)\n", - "\n", - "('F', 8)\n", - "\n", - "\n", - "\n", - "('F', 8)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 8)->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 14)\n", - "\n", - "('F', 14)\n", - "\n", - "\n", - "\n", - "('F', 14)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 14)->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 14)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 14)->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 4)\n", - "\n", - "('F', 4)\n", - "\n", - "\n", - "\n", - "('F', 4)->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 4)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 4)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP3->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 10)\n", - "\n", - "('F', 10)\n", - "\n", - "\n", - "\n", - "('F', 10)->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 10)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 10)->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 10)->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)\n", - "\n", - "('F', 5)\n", - "\n", - "\n", - "\n", - "('F', 5)->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 0)\n", - "\n", - "('F', 0)\n", - "\n", - "\n", - "\n", - "('F', 0)->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 0)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 0)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 3)\n", - "\n", - "('F', 3)\n", - "\n", - "\n", - "\n", - "('F', 3)->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 3)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 3)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 2)\n", - "\n", - "('F', 2)\n", - "\n", - "\n", - "\n", - "('F', 2)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 2)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 1)\n", - "\n", - "('F', 1)\n", - "\n", - "\n", - "\n", - "('F', 1)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 1)->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 9)\n", - "\n", - "('F', 9)\n", - "\n", - "\n", - "\n", - "('F', 9)->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 9)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 9)->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 6)\n", - "\n", - "('F', 6)\n", - "\n", - "\n", - "\n", - "('F', 6)->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 7)\n", - "\n", - "('F', 7)\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "# %%\n", - "# Visualize the full graph including the F-node\n", - "dot_graph = draw(est_pag, direction=\"TD\")\n", - "dot_graph\n", - "# dot_graph.render(outfile=\"psi_pag_full.png\", view=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "afb1ce35-7715-417c-aa77-eccd5ebf8280", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['Plcg', 'PIP3']\n" - ] - } - ], - "source": [ - "print(list(est_pag.neighbors('PIP2')))" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "64b61853-3c5e-4cd4-bb9b-5b4e79a9e292", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(1, 2)" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ctx = learner.context_\n", - "\n", - "# get the distribution indices that are associated with the F-node\n", - "ctx.sigma_map[('F', 5)]" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "c12c86b9-d6e5-417e-88ec-9b203100500a", - "metadata": {}, - "outputs": [], - "source": [ - "# get the distributions across the two distributions\n", - "data_i = data[1].copy()\n", - "data_j = data[2].copy()\n", - "\n", - "# name the group column the F-node, so Oracle works as expected\n", - "data_i[('F', 5)] = 1\n", - "data_j[('F', 5)] = 0\n", - "sub_df = pd.concat((data_i, data_j), axis=0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "841a883d-816e-4927-83e6-20a109fc3cc4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "inf\n", - "inf\n" - ] - } - ], - "source": [ - "print(learner.min_cond_set_size)\n", - "print(learner.max_cond_set_size)\n", - "print(learner.max_combinations)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "6a0a1fb5-9938-40e2-a017-15800d8edc17", - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - }, - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "() 6.435791889158532e-18\n", - "('Plcg',) 6.593184879001655e-20\n", - "('Akt',) 1.200266118509522e-11\n", - "('PKC',) 8.024753178107371e-14\n", - "('Jnk',) 2.585768066145771e-11\n", - "('Erk',) 3.900071970577842e-13\n", - "('P38',) 3.299503701434742e-14\n", - "('PIP3',) 7.083138871715661e-05\n", - "('PKA',) 2.1393776567798484e-13\n", - "('Mek',) 3.693790590305435e-13\n", - "('Raf',) 4.606407772216647e-14\n", - "('Plcg', 'Akt') 8.460800997783422e-08\n", - "('Plcg', 'PKC') 8.990500531927801e-12\n", - "('Plcg', 'Jnk') 3.3857765002483844e-08\n", - "('Plcg', 'Erk') 6.590268332067125e-10\n", - "('Plcg', 'P38') 1.5225223700046747e-12\n", - "('Plcg', 'PIP3') 0.007261132771613868\n", - "('Plcg', 'PKA') 3.212849565105484e-10\n", - "('Plcg', 'Mek') 1.2833709367530019e-10\n", - "('Plcg', 'Raf') 1.4163604686420524e-10\n", - "('Akt', 'PKC') 9.873846189581637e-05\n", - "('Akt', 'Jnk') 0.0031219677903327\n", - "('Akt', 'Erk') 0.01369622199818355\n", - "('Akt', 'P38') 6.063070345314021e-05\n", - "('Akt', 'PIP3') 0.9024296015533677\n", - "('Akt', 'PKA') 0.0017714845018109568\n", - "('Akt', 'Mek') 0.003528741899265669\n", - "('Akt', 'Raf') 0.0008991224821112011\n", - "('PKC', 'Jnk') 9.33977408762107e-07\n", - "('PKC', 'Erk') 8.515213761827435e-06\n", - "('PKC', 'P38') 2.246388723926839e-07\n", - "('PKC', 'PIP3') 0.34768142211165515\n", - "('PKC', 'PKA') 6.332152314280369e-06\n", - "('PKC', 'Mek') 9.5098537319553e-06\n", - "('PKC', 'Raf') 1.2688094863821566e-06\n", - "('Jnk', 'Erk') 0.0001566261707614548\n", - "('Jnk', 'P38') 1.5862931844717754e-05\n", - "('Jnk', 'PIP3') 0.38466781469475697\n", - "('Jnk', 'PKA') 0.00021305054793702892\n", - "('Jnk', 'Mek') 0.00036729818160982603\n", - "('Jnk', 'Raf') 0.00013375039556901973\n", - "('Erk', 'P38') 3.025389145329581e-06\n", - "('Erk', 'PIP3') 0.571452260105889\n", - "('Erk', 'PKA') 0.0004884821515207358\n", - "('Erk', 'Mek') 0.0001085690456512515\n", - "('Erk', 'Raf') 7.50123313213848e-05\n", - "('P38', 'PIP3') 0.3624403399481475\n", - "('P38', 'PKA') 3.613841666449476e-06\n", - "('P38', 'Mek') 3.380684744791879e-06\n", - "('P38', 'Raf') 1.4059792077888952e-06\n", - "('PIP3', 'PKA') 0.5191109355735917\n", - "('PIP3', 'Mek') 0.652887562766674\n", - "('PIP3', 'Raf') 0.08503255960096978\n", - "('PKA', 'Mek') 3.275626021425967e-05\n", - "('PKA', 'Raf') 7.463914552917212e-05\n", - "('Mek', 'Raf') 0.00011080182503373675\n", - "('Plcg', 'Akt', 'PKC') 0.7891422366155535\n", - "('Plcg', 'Akt', 'Jnk') 0.9859814485468757\n", - "('Plcg', 'Akt', 'Erk') 0.9998631601456061\n", - "('Plcg', 'Akt', 'P38') 0.6491208080745487\n", - "('Plcg', 'Akt', 'PIP3') 0.9999999999998938\n", - "('Plcg', 'Akt', 'PKA') 0.9954496653208057\n", - "('Plcg', 'Akt', 'Mek') 0.9908709305733735\n", - "('Plcg', 'Akt', 'Raf') 0.9903519248786904\n", - "('Plcg', 'PKC', 'Jnk') 0.272016946202727\n", - "('Plcg', 'PKC', 'Erk') 0.34285852384885324\n", - "('Plcg', 'PKC', 'P38') 0.0178491632841892\n", - "('Plcg', 'PKC', 'PIP3') 0.9999776236130891\n", - "('Plcg', 'PKC', 'PKA') 0.24366692852731484\n", - "('Plcg', 'PKC', 'Mek') 0.2962573810055808\n", - "('Plcg', 'PKC', 'Raf') 0.2547341290948196\n", - "('Plcg', 'Jnk', 'Erk') 0.8750866000635122\n", - "('Plcg', 'Jnk', 'P38') 0.19238205860774288\n", - "('Plcg', 'Jnk', 'PIP3') 0.9999996689409033\n", - "('Plcg', 'Jnk', 'PKA') 0.8665894965460248\n", - "('Plcg', 'Jnk', 'Mek') 0.7819450525990416\n", - "('Plcg', 'Jnk', 'Raf') 0.8022937030878551\n", - "('Plcg', 'Erk', 'P38') 0.2746627826687863\n", - "('Plcg', 'Erk', 'PIP3') 0.9999999992414166\n", - "('Plcg', 'Erk', 'PKA') 0.9720017267019727\n", - "('Plcg', 'Erk', 'Mek') 0.8611375671390413\n", - "('Plcg', 'Erk', 'Raf') 0.914660041195928\n", - "('Plcg', 'P38', 'PIP3') 0.9999579261799895\n", - "('Plcg', 'P38', 'PKA') 0.24945969813307475\n", - "('Plcg', 'P38', 'Mek') 0.22021175370330875\n", - "('Plcg', 'P38', 'Raf') 0.26535481578322995\n", - "('Plcg', 'PIP3', 'PKA') 0.9999999947814776\n", - "('Plcg', 'PIP3', 'Mek') 0.9999999964268261\n", - "('Plcg', 'PIP3', 'Raf') 0.9999989292834803\n", - "('Plcg', 'PKA', 'Mek') 0.7872515434872753\n", - "('Plcg', 'PKA', 'Raf') 0.905685514521774\n", - "('Plcg', 'Mek', 'Raf') 0.8282818367662137\n", - "('Akt', 'PKC', 'Jnk') 0.9971393969975411\n", - "('Akt', 'PKC', 'Erk') 0.9999999458872947\n", - "('Akt', 'PKC', 'P38') 0.9893596174396212\n", - "('Akt', 'PKC', 'PIP3') 1.0\n", - "('Akt', 'PKC', 'PKA') 0.9999954872688738\n", - "('Akt', 'PKC', 'Mek') 0.9999986563760157\n", - "('Akt', 'PKC', 'Raf') 0.999971160867838\n", - "('Akt', 'Jnk', 'Erk') 0.999999993828627\n", - "('Akt', 'Jnk', 'P38') 0.9997396896479096\n", - "('Akt', 'Jnk', 'PIP3') 1.0\n", - "('Akt', 'Jnk', 'PKA') 0.9999999822575754\n", - "('Akt', 'Jnk', 'Mek') 0.9999999979889044\n", - "('Akt', 'Jnk', 'Raf') 0.999999981982114\n", - "('Akt', 'Erk', 'P38') 0.999999700454769\n", - "('Akt', 'Erk', 'PIP3') 1.0\n", - "('Akt', 'Erk', 'PKA') 0.9999999999999994\n", - "('Akt', 'Erk', 'Mek') 0.9999999999998971\n", - "('Akt', 'Erk', 'Raf') 0.999999999999427\n", - "('Akt', 'P38', 'PIP3') 1.0\n", - "('Akt', 'P38', 'PKA') 0.9999908229412479\n", - "('Akt', 'P38', 'Mek') 0.9999947787202634\n", - "('Akt', 'P38', 'Raf') 0.9999754637345232\n", - "('Akt', 'PIP3', 'PKA') 1.0\n", - "('Akt', 'PIP3', 'Mek') 1.0\n", - "('Akt', 'PIP3', 'Raf') 1.0\n", - "('Akt', 'PKA', 'Mek') 0.9999999999274537\n", - "('Akt', 'PKA', 'Raf') 0.9999999999881026\n", - "('Akt', 'Mek', 'Raf') 0.9999999999983371\n", - "('PKC', 'Jnk', 'Erk') 0.9651475133088108\n", - "('PKC', 'Jnk', 'P38') 0.5427124506088234\n", - "('PKC', 'Jnk', 'PIP3') 0.9999990051613937\n", - "('PKC', 'Jnk', 'PKA') 0.9675608555729773\n", - "('PKC', 'Jnk', 'Mek') 0.9769118017786198\n", - "('PKC', 'Jnk', 'Raf') 0.9278947746043861\n", - "('PKC', 'Erk', 'P38') 0.9148685242905765\n", - "('PKC', 'Erk', 'PIP3') 0.9999999999999999\n", - "('PKC', 'Erk', 'PKA') 0.9998858065715381\n", - "('PKC', 'Erk', 'Mek') 0.9995801816450322\n", - "('PKC', 'Erk', 'Raf') 0.9989918666456864\n", - "('PKC', 'P38', 'PIP3') 0.9999999999828385\n", - "('PKC', 'P38', 'PKA') 0.935827568587764\n", - "('PKC', 'P38', 'Mek') 0.9376631156192213\n", - "('PKC', 'P38', 'Raf') 0.891353553265502\n", - "('PKC', 'PIP3', 'PKA') 0.9999999999999962\n", - "('PKC', 'PIP3', 'Mek') 1.0\n", - "('PKC', 'PIP3', 'Raf') 0.9999999994789294\n", - "('PKC', 'PKA', 'Mek') 0.9981343131288912\n", - "('PKC', 'PKA', 'Raf') 0.9990695979081108\n", - "('PKC', 'Mek', 'Raf') 0.9997591440996322\n", - "('Jnk', 'Erk', 'P38') 0.9863194883217228\n", - "('Jnk', 'Erk', 'PIP3') 0.9999999999999992\n", - "('Jnk', 'Erk', 'PKA') 0.9999982941423281\n", - "('Jnk', 'Erk', 'Mek') 0.9999863603496597\n", - "('Jnk', 'Erk', 'Raf') 0.999978853319258\n", - "('Jnk', 'P38', 'PIP3') 0.9999999999923149\n", - "('Jnk', 'P38', 'PKA') 0.9958478989453659\n", - "('Jnk', 'P38', 'Mek') 0.9919983175172655\n", - "('Jnk', 'P38', 'Raf') 0.9880507060776124\n", - "('Jnk', 'PIP3', 'PKA') 1.0\n", - "('Jnk', 'PIP3', 'Mek') 1.0\n", - "('Jnk', 'PIP3', 'Raf') 0.9999999999998467\n", - "('Jnk', 'PKA', 'Mek') 0.9999850493880029\n", - "('Jnk', 'PKA', 'Raf') 0.9999931221643621\n", - "('Jnk', 'Mek', 'Raf') 0.9999980460494133\n", - "('Erk', 'P38', 'PIP3') 0.9999999999999999\n", - "('Erk', 'P38', 'PKA') 0.9998825118150718\n", - "('Erk', 'P38', 'Mek') 0.9987854820233211\n", - "('Erk', 'P38', 'Raf') 0.998993464768293\n", - "('Erk', 'PIP3', 'PKA') 1.0\n", - "('Erk', 'PIP3', 'Mek') 1.0\n", - "('Erk', 'PIP3', 'Raf') 1.0\n", - "('Erk', 'PKA', 'Mek') 0.9999999999490085\n", - "('Erk', 'PKA', 'Raf') 0.9999999998053\n", - "('Erk', 'Mek', 'Raf') 0.9999997290186001\n", - "('P38', 'PIP3', 'PKA') 0.9999999999999999\n", - "('P38', 'PIP3', 'Mek') 1.0\n", - "('P38', 'PIP3', 'Raf') 0.9999999999526511\n", - "('P38', 'PKA', 'Mek') 0.9984454305569591\n", - "('P38', 'PKA', 'Raf') 0.9995944645718454\n", - "('P38', 'Mek', 'Raf') 0.9994200382853249\n", - "('PIP3', 'PKA', 'Mek') 1.0\n", - "('PIP3', 'PKA', 'Raf') 1.0\n", - "('PIP3', 'Mek', 'Raf') 1.0\n", - "('PKA', 'Mek', 'Raf') 0.9999999489322792\n" - ] - }, - { - "ename": "RuntimeError", - "evalue": "Not enough samples. 2400 is too small. Need 3240.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_2117/627510932.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mp\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_non_f_nodes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msep_set\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcombinations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnon_f_nodes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mstat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlearner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msub_df\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'F'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'PIP2'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msep_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 7\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msep_set\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mevaluate_edge\u001b[0;34m(self, data, X, Y, Z)\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 256\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 257\u001b[0;31m \u001b[0mtest_stat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mci_estimator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mY\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 258\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtest_stat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/ci/g_test.py\u001b[0m in \u001b[0;36mtest\u001b[0;34m(self, df, x_vars, y_vars, z_covariates)\u001b[0m\n\u001b[1;32m 459\u001b[0m \u001b[0mstat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg_square_binary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mz_covariates\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 460\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata_type\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"discrete\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 461\u001b[0;31m \u001b[0mstat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mg_square_discrete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mz_covariates\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlevels\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlevels\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 462\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 463\u001b[0m raise ValueError(\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/ci/g_test.py\u001b[0m in \u001b[0;36mg_square_discrete\u001b[0;34m(data, x, y, sep_set, levels)\u001b[0m\n\u001b[1;32m 352\u001b[0m \u001b[0mn_samples_req\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mdof\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mn_samples\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mn_samples_req\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 354\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Not enough samples. {n_samples} is too small. Need {n_samples_req}.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 355\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 356\u001b[0m \u001b[0mcontingency_tble\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mRuntimeError\u001b[0m: Not enough samples. 2400 is too small. Need 3240." - ] - } - ], - "source": [ - "non_f_nodes = ctx.get_non_f_nodes()\n", - "non_f_nodes.remove('PIP2')\n", - "\n", - "for p in range(len(ctx.get_non_f_nodes())):\n", - " for sep_set in combinations(non_f_nodes, p):\n", - " stat, pvalue = learner.evaluate_edge(sub_df, ('F', 5), 'PIP2', set(sep_set))\n", - " \n", - " print(sep_set, pvalue)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "daae0d6c-65cd-43aa-b8b2-b0a3b7b83c53", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[7 4]\n", - "['PKA' 'PIP3']\n" - ] - } - ], - "source": [ - "# the intervention target indices\n", - "print(unique_ints[[2, 4]])\n", - "\n", - "print(np.array(intervention_targets)[[2, 4]])\n", - "# print(intervention_targets[7], intervention_targets[4])" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "c4668302-9da7-411f-9605-bffd863d06a5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('F', 6), ('F', 12), ('F', 9), 'Raf', ('F', 5), ('F', 2), ('F', 8), ('F', 14), ('F', 11), ('F', 1), ('F', 0), ('F', 13), ('F', 3)]\n" - ] - } - ], - "source": [ - "print(list(est_pag.neighbors('Mek')))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "321acf1c-0519-4f92-9a8f-f7f6b6333da8", - "metadata": {}, - "outputs": [], - "source": [ - "for f_node in est_pag.f_nodes:\n", - " print(f_node)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "d27c0dab-a6bf-48cf-90b7-f1298ca89b12", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'obs_skel_graph': , 'pag': }\n", - "2\n" - ] - } - ], - "source": [ - "print(ctx.state_variables)\n", - "print(learner.skeleton_learner_.n_iters_)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "b6e4aa12-a6f6-4afd-b810-02a852fdb623", - "metadata": {}, - "outputs": [], - "source": [ - "obs_graph = ctx.state_variables['obs_skel_graph']" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "0b8c3ca6-cc78-43d8-a2fa-b9f0dd299809", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Raf\n", - "\n", - "Raf\n", - "\n", - "\n", - "\n", - "Mek\n", - "\n", - "Mek\n", - "\n", - "\n", - "\n", - "Raf->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Mek->Raf\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP3\n", - "\n", - "PIP3\n", - "\n", - "\n", - "\n", - "Plcg\n", - "\n", - "Plcg\n", - "\n", - "\n", - "\n", - "PIP3->Plcg\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP2\n", - "\n", - "PIP2\n", - "\n", - "\n", - "\n", - "PIP3->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP2->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP2->Plcg\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "P38\n", - "\n", - "P38\n", - "\n", - "\n", - "\n", - "Jnk\n", - "\n", - "Jnk\n", - "\n", - "\n", - "\n", - "P38->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC\n", - "\n", - "PKC\n", - "\n", - "\n", - "\n", - "P38->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Jnk->P38\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Jnk->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC->P38\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC->Jnk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKA\n", - "\n", - "PKA\n", - "\n", - "\n", - "\n", - "Erk\n", - "\n", - "Erk\n", - "\n", - "\n", - "\n", - "PKA->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Erk->PKA\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Akt\n", - "\n", - "Akt\n", - "\n", - "\n", - "\n", - "Erk->Akt\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Akt->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "dot_graph = draw(obs_graph.to_directed(), direction=\"LR\")\n", - "dot_graph" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "b9daa53d-0216-4443-aa31-fbbdf8c19b4a", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Raf\n", - "\n", - "Raf\n", - "\n", - "\n", - "\n", - "Mek\n", - "\n", - "Mek\n", - "\n", - "\n", - "\n", - "Raf->Mek\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Jnk\n", - "\n", - "Jnk\n", - "\n", - "\n", - "\n", - "P38\n", - "\n", - "P38\n", - "\n", - "\n", - "\n", - "Jnk->P38\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC\n", - "\n", - "PKC\n", - "\n", - "\n", - "\n", - "Jnk->PKC\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKC->P38\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PKA\n", - "\n", - "PKA\n", - "\n", - "\n", - "\n", - "Erk\n", - "\n", - "Erk\n", - "\n", - "\n", - "\n", - "PKA->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Akt\n", - "\n", - "Akt\n", - "\n", - "\n", - "\n", - "Akt->Erk\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "PIP3\n", - "\n", - "PIP3\n", - "\n", - "\n", - "\n", - "PIP2\n", - "\n", - "PIP2\n", - "\n", - "\n", - "\n", - "PIP3->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg\n", - "\n", - "Plcg\n", - "\n", - "\n", - "\n", - "Plcg->PIP3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Plcg->PIP2\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "# %%\n", - "# Visualize the graph without the F-nodes\n", - "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes())\n", - "dot_graph = draw(est_pag_no_fnodes, direction=\"LR\")\n", - "dot_graph\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "63f8ce08-1a2f-4e70-8b47-2172e78126e6", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pywhy-discover", - "language": "python", - "name": "pywhy-discover" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 23e0c39a086078c953b4f4ec7d970ea075c17417 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 15:42:57 -0400 Subject: [PATCH 43/61] Try to fix redirect Signed-off-by: Adam Li --- .github/workflows/circle_artifacts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/circle_artifacts.yml b/.github/workflows/circle_artifacts.yml index c3b45c783..ba2b5ff56 100644 --- a/.github/workflows/circle_artifacts.yml +++ b/.github/workflows/circle_artifacts.yml @@ -8,6 +8,6 @@ jobs: uses: larsoner/circleci-artifacts-redirector-action@master with: repo-token: ${{ secrets.GITHUB_TOKEN }} - artifact-path: 0/dev/index.html + artifact-path: /dev/index.html circleci-jobs: build_doc job-title: Check the rendered docs here! From b0376cf93fd68bbf119835a1c4d0d7b17de33184 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 10 Apr 2023 15:45:52 -0400 Subject: [PATCH 44/61] Rename header Signed-off-by: Adam Li --- doc/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/index.rst b/doc/index.rst index de95af9fd..4e931879d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -25,7 +25,7 @@ Contents installation Reference API - Usage + Simple Examples User Guide tutorials/index whats_new From 486a139390689caafe5c74b875acd838f7417afe Mon Sep 17 00:00:00 2001 From: Adam Li Date: Sat, 15 Apr 2023 15:59:38 -0400 Subject: [PATCH 45/61] Remove type hints autodoc Signed-off-by: Adam Li --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 5e95e5c37..4493f75ab 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -70,7 +70,7 @@ autosummary_generate = True autodoc_default_options = {"inherited-members": None} -autodoc_typehints = "signature" +autodoc_typehints = "none" # -- numpydoc # Below is needed to prevent errors From 21f017926e45bc01f2ac8f87e766d23ad33f87ab Mon Sep 17 00:00:00 2001 From: Adam Li Date: Sat, 15 Apr 2023 22:36:42 -0400 Subject: [PATCH 46/61] Fix linkcheck Signed-off-by: Adam Li --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 643b90ec8..c4e7783d9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -157,12 +157,12 @@ jobs: - run: name: make linkcheck command: | - make -C doc linkcheck + poetry run make -C docs linkcheck - run: name: make linkcheck-grep when: always command: | - make -C doc linkcheck-grep + poetry run make -C docs linkcheck-grep - store_artifacts: path: doc/_build/linkcheck destination: linkcheck From 21738fdc3feba9f717224375a271d94142520955 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 23 May 2023 22:44:09 -0400 Subject: [PATCH 47/61] Adding psifci fixes Signed-off-by: Adam Li --- dodiscover/ci/oracle.py | 12 +- dodiscover/constraint/intervention.py | 8 +- dodiscover/constraint/skeleton.py | 904 ++++++++---------- dodiscover/constraint/utils.py | 47 + dodiscover/context.py | 28 +- examples/plot_psifci_alg.py | 15 +- pyproject.toml | 2 +- tests/unit_tests/constraint/test_fcialg.py | 11 +- .../constraint/test_intervene_skeleton.py | 78 +- tests/unit_tests/constraint/test_psifcialg.py | 20 +- tests/unit_tests/constraint/test_skeleton.py | 85 +- 11 files changed, 608 insertions(+), 602 deletions(-) diff --git a/dodiscover/ci/oracle.py b/dodiscover/ci/oracle.py index f21208b57..d33269570 100644 --- a/dodiscover/ci/oracle.py +++ b/dodiscover/ci/oracle.py @@ -23,8 +23,9 @@ class Oracle(BaseConditionalIndependenceTest): _allow_multivariate_input: bool = True - def __init__(self, graph: Graph) -> None: + def __init__(self, graph: Graph, included_nodes: Set[Column] = None) -> None: self.graph = graph + self.included_nodes = included_nodes def test( self, @@ -68,6 +69,15 @@ def test( """ self._check_test_input(df, x_vars, y_vars, z_covariates) + # generate a set of included nodes always in the Z-covariates + if self.included_nodes is None: + included_nodes = set() + else: + included_nodes = ( + set(self.included_nodes).difference(set(x_vars)).difference(set(y_vars)) + ) + z_covariates = set(z_covariates).union(included_nodes) + # just check for d-separation between x and y given sep_set if isinstance(self.graph, nx.DiGraph): is_sep = nx.d_separated(self.graph, x_vars, y_vars, z_covariates) diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index d3e0ff174..90cfececc 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -353,9 +353,13 @@ def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: # convert the undirected skeleton graph to its PAG-class, where # all left-over edges have a "circle" endpoint if self.known_intervention_targets: - pag = pgraph.IPAG(incoming_circle_edges=graph, name="IPAG derived with I-FCI") + pag = pgraph.AugmentedPAG( + incoming_circle_edges=graph, name="AugmentedPAG derived with I-FCI" + ) else: - pag = pgraph.PsiPAG(incoming_circle_edges=graph, name="PsiPAG derived with Psi-FCI") + pag = pgraph.AugmentedPAG( + incoming_circle_edges=graph, name="AugmentedPAG derived with Psi-FCI" + ) # XXX: assign targets as well # assign f-nodes diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index da709ea6a..68f74aba6 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -15,14 +15,18 @@ from dodiscover.constraint.utils import is_in_sep_set from dodiscover.typing import Column, SeparatingSet -from .._protocol import EquivalenceClass, Graph +from .._protocol import EquivalenceClass from ..context import Context -from ..context_builder import ContextBuilder, InterventionalContextBuilder, make_context +from ..context_builder import InterventionalContextBuilder, make_context +from .utils import _find_neighbors_along_path logger = logging.getLogger() -def _parallel_test_xy_edges( +def _test_xy_edges( + parallel_fun: Callable[ + [pd.DataFrame, Callable, Column, Column, Optional[Set[Column]]], Tuple[float, float] + ], conditional_test_func: Callable[ [pd.DataFrame, Column, Column, Optional[Set[Column]]], Tuple[float, float] ], @@ -33,6 +37,8 @@ def _parallel_test_xy_edges( max_combinations: Optional[int], possible_variables: Set[Column], data: pd.DataFrame, + context: Context, + cross_distribution_test: bool = False, ) -> Dict[str, Any]: """Private function used to test edge between X and Y in parallel for candidate separating sets. @@ -82,13 +88,34 @@ def _parallel_test_xy_edges( if max_combinations is not None and comb_idx >= max_combinations: break + # either process within-distribution, or across distributions + this_data = data + if cross_distribution_test: + # compute conditional independence test + # get the sigma-map for this F-node + distribution_idx = context.sigma_map[x_var] + + # get the distributions across the two distributions + data_i = data[distribution_idx[0]].copy() + data_j = data[distribution_idx[1]].copy() + + # name the group column the F-node, so Oracle works as expected + data_i[x_var] = 0 + data_j[x_var] = 1 + this_data = pd.concat((data_i, data_j), axis=0) + try: # compute conditional independence test - test_stat, pvalue = conditional_test_func(data, x_var, y_var, set(cond_set)) + test_stat, pvalue = parallel_fun( + this_data, conditional_test_func, x_var, y_var, set(cond_set) + ) except Exception as e: - print(e) - test_stat = np.inf - pvalue = 0.0 + if "Not enough samples." in str(e): + print(e) + test_stat = np.inf + pvalue = 0.0 + else: + raise Exception(e) # if any "independence" is found through inability to reject # the null hypothesis, then we will break the loop comparing X and Y @@ -107,6 +134,97 @@ def _parallel_test_xy_edges( return result +def candidate_cond_sets( + condsel_method: ConditioningSetSelection, + context: Context, + x_var: Column, + y_var: Column, + keep_sorted: bool = False, +): + """Compute candidate conditioning set using a specific method between two variables. + + Parameters + ---------- + condsel_method : ConditioningSetSelection + Method to compute candidate conditioning set. + context : Context + Causal context object with the graph and other information. + x_var : Column + The starting node. + y_var : Column + The ending node. + keep_sorted : bool, optional + Whether or not to keep the conditioning set sorted based on the context, by default False. + + Returns + ------- + possible_variables : Set[Column] + A set of variables that are candidates for the conditioning set. + + Notes + ----- + The possible variables are determined by the method used to compute the candidate + conditioning set. For example: + - if the method is 'complete', then all variables in the graph are possible candidates. + - if the method is 'neighbors', then only the neighbors of the starting node are possible + candidates. + - if the method is 'neighbors_path', then only the neighbors of the starting node that are + also along a path to the ending node are possible candidates. + - if the method is 'pds', then the possible candidates are determined by the + PAG that computes the possibly d-separating set. + - if the method is 'pds_path', then the possible candidates are determined by the + PAG that computes the possibly d-separating set, but only those that are along a path to the + ending node are possible candidates. + """ + if condsel_method == ConditioningSetSelection.COMPLETE: + possible_variables = set(context.init_graph.nodes) + elif condsel_method == ConditioningSetSelection.NBRS: + possible_variables = set( + context.init_graph.neighbors(x_var) + ) # .union(set(context.init_graph.neighbors(y_var))) + elif condsel_method == ConditioningSetSelection.NBRS_PATH: + # constrain adjacency set to ones with a path from x_var to y_var + possible_variables = _find_neighbors_along_path(context.init_graph, start=x_var, end=y_var) + elif condsel_method == ConditioningSetSelection.PDS: + import pywhy_graphs as pgraph + + pag = context.state_variable("PAG", on_missing="ignore") + max_path_length = context.state_variable("max_path_length") + + # determine how we want to construct the candidates for separating nodes + # perform conditioning independence testing on all combinations + possible_variables = pgraph.pds( + pag, x_var, y_var, max_path_length=max_path_length # type: ignore + ) + elif condsel_method == ConditioningSetSelection.PDS_PATH: + import pywhy_graphs as pgraph + + pag = context.state_variable("PAG", on_missing="ignore") + max_path_length = context.state_variable("max_path_length") + + # determine how we want to construct the candidates for separating nodes + # perform conditioning independence testing on all combinations + possible_variables = pgraph.pds_path( + pag, x_var, y_var, max_path_length=max_path_length # type: ignore + ) + + if keep_sorted: + # Note it is assumed in public API that 'test_stat' is set + # inside the adj_graph + possible_variables = sorted( + possible_variables, + key=lambda n: context.init_graph.edges[x_var, n]["test_stat"], + reverse=True, + ) # type: ignore + + if x_var in possible_variables: + possible_variables.remove(x_var) + if y_var in possible_variables: + possible_variables.remove(y_var) + + return possible_variables + + def _iter_conditioning_set( possible_variables: Iterable, x_var: Column, @@ -144,50 +262,6 @@ def _iter_conditioning_set( yield cond_set -def _find_neighbors_along_path(G: nx.Graph, start, end) -> Set: - """Find neighbors that are along a path from start to end. - - Parameters - ---------- - G : nx.Graph - The graph. - start : Node - The starting node. - end : Node - The ending node. - - Returns - ------- - nbrs : Set - The set of neighbors that are also along a path towards - the 'end' node. - """ - nbrs = set() - - # query all neighbors of X and then only add nodes that are in a valid path - # to end - for node in G.neighbors(start): - if not G.has_edge(start, node): - raise RuntimeError(f"{start} and {node} are not connected, but they are assumed to be.") - - # if we queried the edge we are testing, then pick that one - if node == end: - continue - - # find a path from start node to end - paths = nx.all_simple_paths(G, source=node, target=end) - for path in paths: - # the trivial path which indicates that 'node' is only connected to - # 'end' through 'start' - if path == (node, start, end): - continue - else: - # found a single path - nbrs.add(node) - break - return nbrs - - class BaseSkeletonLearner: """Base class for constraint-based skeleton learning algorithms. @@ -205,6 +279,7 @@ class BaseSkeletonLearner: discovery phase multiple times. """ + ci_estimator: Callable[[Column, Column, Set[Column]], Tuple[float, float]] alpha: float n_jobs: Optional[int] @@ -217,14 +292,22 @@ class BaseSkeletonLearner: max_cond_set_size_: int max_combinations_: int + condsel_method: ConditioningSetSelection + keep_sorted: bool + + # stopping condition _cont: bool def _learn_skeleton( self, data: pd.DataFrame, context: Context, + condsel_method: ConditioningSetSelection, conditional_test_func: Callable, possible_x_nodes=None, + skipped_y_nodes=None, + skipped_z_nodes=None, + cross_distribution_test: bool = False, ): """Core function for learning the skeleton of a causal graph. @@ -238,12 +321,22 @@ def _learn_skeleton( The data to learn the causal graph from. context : Context A context object. + condsel_method : ConditioningSetSelection + Method to compute candidate conditioning set. conditional_test_func : Callable The conditional test function that takes in three arguments 'x_var', 'y_var' and an optional 'z_var', where 'z_var' is the conditioning set of variables. possible_x_nodes : set of nodes, optional The nodes to initialize as X variables. How to initialize variables to test in the second loop of the algorithm. See Notes for details. + skipped_y_nodes : set of nodes, optional + The nodes to skip in choosing the Y variable. See Notes for details. + skipped_z_nodes : set of nodes, optional + The nodes to skip in choosing the conditioning set. See Notes for details. + cross_distribution_test : bool, optional + Whether to perform cross-distribution tests. If True, then the ``context`` + object must contain a ``sigma_map`` attribute that maps each X-node + to the corresponding distributions of interest. Notes ----- @@ -286,14 +379,12 @@ def _learn_skeleton( pairs is less than the size of 'size_cond_set', or if the 'max_cond_set_size' is reached. """ - # preserve state of the Context object - self.context_ = context - - # get the initialized graph - adj_graph: Graph = deepcopy(context.init_graph.copy()) - if possible_x_nodes is None: - possible_x_nodes = adj_graph.nodes + possible_x_nodes = context.init_graph.nodes + if skipped_y_nodes is None: + skipped_y_nodes = set() + if skipped_z_nodes is None: + skipped_z_nodes = set() # the size of the conditioning set will start off at the minimum size_cond_set = self.min_cond_set_size_ @@ -319,60 +410,34 @@ def _learn_skeleton( remove_edges = set() if self.n_jobs == 1: + out = [] for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( - possible_x_nodes, adj_graph, context, size_cond_set + possible_x_nodes, + context, + condsel_method, + size_cond_set, + skipped_y_nodes=skipped_y_nodes, + skipped_z_nodes=skipped_z_nodes, ): - # generate iterator through the conditioning sets - conditioning_sets = _iter_conditioning_set( - possible_variables=possible_variables, - x_var=x_var, - y_var=y_var, - size_cond_set=size_cond_set, + result = _test_xy_edges( + self.evaluate_edge, + conditional_test_func, + x_var, + y_var, + self.alpha, + size_cond_set, + self.max_combinations_, + possible_variables, + data, + context, + cross_distribution_test, ) - - # now iterate through the possible parents - for comb_idx, cond_set in enumerate(conditioning_sets): - # check the number of combinations of possible parents we have tried - # to use as a separating set - if ( - self.max_combinations_ is not None - and comb_idx >= self.max_combinations_ - ): - break - - try: - # compute conditional independence test - test_stat, pvalue = conditional_test_func( - data, x_var, y_var, set(cond_set) - ) - except Exception as e: - # allow us to catch exceptions that are due to not enough samples - # if so, we cannot remove the edge and just proceed - print(e) - test_stat = np.inf - pvalue = 0.0 - - # if any "independence" is found through inability to reject - # the null hypothesis, then we will break the loop comparing X and Y - # and say X and Y are conditionally independent given 'cond_set' - if pvalue > self.alpha: - break - - # post-process the CI test results - self._postprocess_ci_test(adj_graph, x_var, y_var, test_stat, pvalue) - - # two variables found to be independent given a separating set - if pvalue > self.alpha: - self.sep_set_[x_var][y_var].append(set(cond_set)) - self.sep_set_[y_var][x_var].append(set(cond_set)) - remove_edges.add((x_var, y_var, pvalue)) - - # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, pvalue > self.alpha, pvalue) + out.append(result) else: # run parallelized loop out = Parallel(n_jobs=self.n_jobs)( - delayed(_parallel_test_xy_edges)( + delayed(_test_xy_edges)( + self.evaluate_edge, conditional_test_func, x_var, y_var, @@ -381,30 +446,37 @@ def _learn_skeleton( self.max_combinations_, possible_variables, data, + context, + cross_distribution_test, ) for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( - possible_x_nodes, adj_graph, context, size_cond_set + possible_x_nodes, + context, + condsel_method, + size_cond_set, + skipped_y_nodes=skipped_y_nodes, + skipped_z_nodes=skipped_z_nodes, ) ) - for result in out: - test_stat = result["test_stat"] - pvalue = result["pvalue"] - x_var = result["x_var"] - y_var = result["y_var"] - cond_set = result["cond_set"] + for result in out: + test_stat = result["test_stat"] + pvalue = result["pvalue"] + x_var = result["x_var"] + y_var = result["y_var"] + cond_set = result["cond_set"] - # post-process the CI test results - self._postprocess_ci_test(adj_graph, x_var, y_var, test_stat, pvalue) + # post-process the CI test results + self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) - # two variables found to be independent given a separating set - if pvalue > self.alpha: - self.sep_set_[x_var][y_var].append(set(cond_set)) - self.sep_set_[y_var][x_var].append(set(cond_set)) - remove_edges.add((x_var, y_var, pvalue)) + # two variables found to be independent given a separating set + if pvalue > self.alpha: + self.sep_set_[x_var][y_var].append(set(cond_set)) + self.sep_set_[y_var][x_var].append(set(cond_set)) + remove_edges.add((x_var, y_var, pvalue)) - # summarize the comparison of XY - self._summarize_xy_comparison(x_var, y_var, pvalue > self.alpha, pvalue) + # summarize the comparison of XY + self._summarize_xy_comparison(x_var, y_var, pvalue > self.alpha, pvalue) # finally remove edges after performing # conditional independence tests @@ -413,7 +485,7 @@ def _learn_skeleton( # Remove non-significant links # Note: Removing edges at the end ensures "stability" of the algorithm # with respect to the randomness choice of pairs of edges considered in the inner loop - adj_graph.remove_edges_from(remove_edges) + context.init_graph.remove_edges_from(remove_edges) # increment the conditioning set size size_cond_set += 1 @@ -422,11 +494,17 @@ def _learn_skeleton( if size_cond_set > self.max_cond_set_size_ or self._cont is False: break - self.adj_graph_ = adj_graph + self.adj_graph_ = context.init_graph self.n_iters_ += 1 def _generate_pairs_with_sepset( - self, possible_x_nodes: Set[Column], adj_graph: Graph, context: Context, size_cond_set: int + self, + possible_x_nodes: Set[Column], + context: Context, + condsel_method: ConditioningSetSelection, + size_cond_set: int, + skipped_y_nodes, + skipped_z_nodes, ) -> Generator[Tuple[Column, Column, Set[Column]], None, None]: """Generate X, Y and Z pairs for conditional testing. @@ -438,8 +516,14 @@ def _generate_pairs_with_sepset( The graph encoding adjacencies and current state of the learned undirected graph. context : Context The causal context. + condsel_method : ConditioningSetSelection + The method to use for selecting conditioning sets. size_cond_set : int The current size of the conditioning set to consider. + skipped_y_nodes : Set[Column] + Allow one to skip Y-nodes that are not of interest in learning edge structure. + skipped_z_nodes : Set[Column] + Allow one to skip Z-nodes that are not able to be conditioned on. Yields ------ @@ -447,9 +531,12 @@ def _generate_pairs_with_sepset( Generates 'X' variable, 'Y' variable and canddiate 'Z' (i.e. possible separating set variables). """ + # TODO: PC algorithm test fails when this is activated... + # seen_pairs = set() + # loop through every node that we want to test for x_var in possible_x_nodes: - possible_adjacencies = set(adj_graph.neighbors(x_var)) + possible_adjacencies = set(context.init_graph.neighbors(x_var)) logger.info(f"Considering node {x_var}...\n\n") for y_var in possible_adjacencies: @@ -457,16 +544,25 @@ def _generate_pairs_with_sepset( if y_var == x_var: continue + if y_var in skipped_y_nodes: + continue + + # prevent yielding the same edge pair twice + # if (x_var, y_var) in seen_pairs or (y_var, x_var) in seen_pairs: + # continue + if (x_var, y_var) in context.included_edges.edges: continue # compute the possible variables used in the conditioning set - possible_variables = self._compute_candidate_conditioning_sets( - adj_graph, - x_var, - y_var, + possible_variables = candidate_cond_sets( + condsel_method, context, x_var, y_var, keep_sorted=self.keep_sorted ) + # remove nodes that are not allowed to be conditioned on + # XXX: if used, this may result in improper graphs learned even in oracle setting + possible_variables = possible_variables.difference(skipped_z_nodes) + logger.debug( f"Adj({x_var}) without {y_var} with size={len(possible_adjacencies) - 1} " f"with p={size_cond_set}. The possible variables to condition on are: " @@ -483,49 +579,13 @@ def _generate_pairs_with_sepset( continue else: self._cont = True - yield x_var, y_var, possible_variables - - def _compute_candidate_conditioning_sets( - self, adj_graph: nx.Graph, x_var: Column, y_var: Column - ) -> Set[Column]: - r"""Compute candidate conditioning sets. - - For a given 'X' and 'Y', this method implements a graphical algorithm that - enumerates possible variables that are part of 'Z', the conditioning set. - One can then test the following null hypothesis :math:`H_0: X \perp Y | Z`. - - Parameters - ---------- - adj_graph : nx.Graph - The current adjacency graph. - x_var : node - The 'X' node. - y_var : node - The 'Y' node. - Returns - ------- - possible_variables : Set of Column - The set of nodes in 'adj_graph' that are candidates for the - conditioning set. - - Notes - ----- - This depends on: - - size_cond_set : int - The maximum size of the conditioning set allowed. If candidate conditioning - sets are less than this number, then the ``possible_variables`` will be - the empty set. - """ - raise NotImplementedError( - "All skeleton discovery methods should implement a method for selecting " - "the possible conditioning sets." - ) + # seen_pairs.add((x_var, y_var)) + yield x_var, y_var, possible_variables def _postprocess_ci_test( self, - adj_graph: nx.Graph, + context: Context, x_var: Column, y_var: Column, test_stat: float, @@ -539,8 +599,9 @@ def _postprocess_ci_test( Parameters ---------- - adj_graph : nx.Graph - The adjacency graph. + Context : nx.Graph + The context object containing the adjacency graph under ``init_graph``, + which we will modify in place. x_var : Column X variable. y_var : Column @@ -552,10 +613,10 @@ def _postprocess_ci_test( """ # keep track of the smallest test statistic, meaning the highest pvalue # meaning the "most" independent. keep track of the maximum pvalue as well - if pvalue > adj_graph.edges[x_var, y_var]["pvalue"]: - adj_graph.edges[x_var, y_var]["pvalue"] = pvalue - if test_stat < adj_graph.edges[x_var, y_var]["test_stat"]: - adj_graph.edges[x_var, y_var]["test_stat"] = test_stat + if pvalue > context.init_graph.edges[x_var, y_var]["pvalue"]: + context.init_graph.edges[x_var, y_var]["pvalue"] = pvalue + if test_stat < context.init_graph.edges[x_var, y_var]["test_stat"]: + context.init_graph.edges[x_var, y_var]["test_stat"] = test_stat def _summarize_xy_comparison( self, x_var: Column, y_var: Column, removed_edge: bool, pvalue: float @@ -574,7 +635,12 @@ def _summarize_xy_comparison( ) def evaluate_edge( - self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None + self, + data: pd.DataFrame, + conditional_test_func, + X: Column, + Y: Column, + Z: Optional[Set[Column]] = None, ) -> Tuple[float, float]: """Test any specific edge for X || Y | Z. @@ -596,10 +662,11 @@ def evaluate_edge( pvalue : float The pvalue. """ - raise NotImplementedError( - "All skeleton discovery methods should implement a method for " - "evaluating an edge with a statistical test." - ) + if Z is None: + Z = set() + test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z) + self.n_ci_tests += 1 + return test_stat, pvalue class LearnSkeleton(BaseSkeletonLearner): @@ -722,11 +789,13 @@ def __init__( self.n_ci_tests = 0 self.n_iters_ = 0 - def _initialize_params(self) -> None: + def _initialize_params(self, context) -> None: """Initialize parameters for learning skeleton. Basic parameters that are used by any constraint-based causal discovery algorithms. """ + context = deepcopy(context.copy()) + # error checks of passed in arguments if self.max_combinations is not None and self.max_combinations <= 0: raise RuntimeError(f"Max combinations must be at least 1, not {self.max_combinations}") @@ -757,54 +826,10 @@ def _initialize_params(self) -> None: else: self.max_combinations_ = self.max_combinations - def evaluate_edge( - self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None - ) -> Tuple[float, float]: - """Test any specific edge for X || Y | Z. - - Parameters - ---------- - data : pd.DataFrame - The dataset - X : column - A column in ``data``. - Y : column - A column in ``data``. - Z : set, optional - A list of columns in ``data``, by default None. - - Returns - ------- - test_stat : float - Test statistic. - pvalue : float - The pvalue. - """ - if Z is None: - Z = set() - test_stat, pvalue = self.ci_estimator.test(data, set({X}), set({Y}), Z) - self.n_ci_tests += 1 - return test_stat, pvalue - - def fit(self, data: pd.DataFrame, context: Context): - """Run structure learning to learn the skeleton of the causal graph. - - Parameters - ---------- - data : pd.DataFrame - The data to learn the causal graph from. - context : Context - A context object. - """ - self.context_ = context.copy() - - # initialize learning parameters - self._initialize_params() - # allow us to query the iteration stage of the causal discovery algorithm # allowing us to run multiple iterations of the skeleton discovery edge_attrs = set( - chain.from_iterable(d.keys() for *_, d in self.context_.init_graph.edges(data=True)) + chain.from_iterable(d.keys() for *_, d in context.init_graph.edges(data=True)) ) if self.n_iters_ == 0 and "test_stat" in edge_attrs or "pvalue" in edge_attrs: raise RuntimeError( @@ -814,71 +839,23 @@ def fit(self, data: pd.DataFrame, context: Context): # store the absolute value of test-statistic values and pvalue for # every single candidate parent-child edge (X -> Y) - nx.set_edge_attributes(self.context_.init_graph, np.inf, "test_stat") - nx.set_edge_attributes(self.context_.init_graph, -1e-5, "pvalue") + nx.set_edge_attributes(context.init_graph, np.inf, "test_stat") + nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") + return context + + def fit(self, data: pd.DataFrame, context: Context): + # initialize learning parameters + context = self._initialize_params(context) # apply algorithm to learn skeleton self._learn_skeleton( data, - context=self.context_, - conditional_test_func=self.evaluate_edge, + context=context, + condsel_method=self.condsel_method, + conditional_test_func=self.ci_estimator, ) - - def _compute_candidate_conditioning_sets( - self, adj_graph: nx.Graph, x_var: Column, y_var: Column - ) -> Set[Column]: - r"""Compute candidate conditioning sets. - - For a given 'X' and 'Y', this method implements a graphical algorithm that - enumerates possible variables that are part of 'Z', the conditioning set. - One can then test the following null hypothesis :math:`H_0: X \perp Y | Z`. - - Parameters - ---------- - adj_graph : nx.Graph - The current adjacency graph. - x_var : node - The 'X' node. - y_var : node - The 'Y' node. - - Returns - ------- - possible_variables : Set of Column - The set of nodes in 'adj_graph' that are candidates for the - conditioning set. - - Notes - ----- - The :attr:`condsel_method` dictates how we choose the corresponding conditioning sets. - For more information, see :class:`ConditioningSetSelection`. - """ - condsel_method = self.condsel_method - - if condsel_method == ConditioningSetSelection.COMPLETE: - possible_variables = set(adj_graph.nodes) - elif condsel_method == ConditioningSetSelection.NBRS: - possible_variables = set(adj_graph.neighbors(x_var)) - # possible_adjacencies.copy() - elif condsel_method == ConditioningSetSelection.NBRS_PATH: - # constrain adjacency set to ones with a path from x_var to y_var - possible_variables = _find_neighbors_along_path(adj_graph, start=x_var, end=y_var) - - if self.keep_sorted: - # Note it is assumed in public API that 'test_stat' is set - # inside the adj_graph - possible_variables = sorted( - possible_variables, - key=lambda n: adj_graph.edges[x_var, n]["test_stat"], - reverse=True, - ) # type: ignore - - if x_var in possible_variables: - possible_variables.remove(x_var) - if y_var in possible_variables: - possible_variables.remove(y_var) - - return possible_variables + self.context_ = context.copy() + self.adj_graph_ = deepcopy(context.init_graph.copy()) class LearnSemiMarkovianSkeleton(LearnSkeleton): @@ -1044,53 +1021,7 @@ def _orient_unshielded_triples(self, graph: EquivalenceClass, sep_set: Separatin if graph.has_edge(v_j, u, graph.circle_edge_name): graph.orient_uncertain_edge(v_j, u) - def _compute_candidate_conditioning_sets( - self, adj_graph: nx.Graph, x_var: Column, y_var: Column - ) -> Set[Column]: - import pywhy_graphs as pgraph - - # get PAG from the context object - pag = self.context_.state_variable("PAG", on_missing="ignore") - - if pag is None: - # if PAG has not been set as a state variable, then we are learning a skeleton - # without PDS information. I.e. the normal LearnSkeleton algorithm - return super()._compute_candidate_conditioning_sets(adj_graph, x_var, y_var) - else: - if not all(x in pag.nodes for x in [x_var, y_var]): - raise RuntimeError("wtf..") - condsel_method = self.second_stage_condsel_method - - if condsel_method == ConditioningSetSelection.PDS: - # determine how we want to construct the candidates for separating nodes - # perform conditioning independence testing on all combinations - possible_variables = pgraph.pds( - pag, x_var, y_var, max_path_length=self.max_path_length_ # type: ignore - ) - elif condsel_method == ConditioningSetSelection.PDS_PATH: - # determine how we want to construct the candidates for separating nodes - # perform conditioning independence testing on all combinations - possible_variables = pgraph.pds_path( - pag, x_var, y_var, max_path_length=self.max_path_length_ # type: ignore - ) - - if self.keep_sorted: - # Note it is assumed in public API that 'test_stat' is set - # inside the adj_graph - possible_variables = sorted( - possible_variables, - key=lambda n: adj_graph.edges[x_var, n]["test_stat"], - reverse=True, - ) # type: ignore - - if x_var in possible_variables: - possible_variables.remove(x_var) - if y_var in possible_variables: - possible_variables.remove(y_var) - - return possible_variables - - def _prep_second_stage_skeleton(self) -> Context: + def _prep_second_stage_skeleton(self, context) -> Context: import pywhy_graphs as pgraphs # convert the undirected skeleton graph to a PAG, where @@ -1113,36 +1044,74 @@ def _prep_second_stage_skeleton(self) -> Context: d.pop("test_stat") if "pvalue" in d: d.pop("pvalue") - context = ( - make_context(self.context_) - .init_graph(new_init_graph) - .state_variable("PAG", pag) - .build() + + context.init_graph = new_init_graph + context.add_state_variable("PAG", pag) + context.add_state_variable("max_path_length", self.max_path_length_) + + # Note: this needs to get called again + # allow us to query the iteration stage of the causal discovery algorithm + # allowing us to run multiple iterations of the skeleton discovery + edge_attrs = set( + chain.from_iterable(d.keys() for *_, d in context.init_graph.edges(data=True)) ) + if self.n_iters_ == 0 and "test_stat" in edge_attrs or "pvalue" in edge_attrs: + raise RuntimeError( + "Running skeleton discovery with adjacency graph " + "with 'test_stat' or 'pvalue' is not supported yet." + ) + + # store the absolute value of test-statistic values and pvalue for + # every single candidate parent-child edge (X -> Y) + nx.set_edge_attributes(context.init_graph, np.inf, "test_stat") + nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") return context - def _initialize_params(self) -> None: + def _initialize_params(self, context) -> None: if self.max_path_length is None: self.max_path_length_ = np.inf else: self.max_path_length_ = self.max_path_length - return super()._initialize_params() + return super()._initialize_params(context) + + def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): + if check_input: + context = self._initialize_params(context) - def fit(self, data: pd.DataFrame, context: Context): # initially learn the skeleton without using PDS information - super().fit(data, context) + # apply algorithm to learn skeleton + self._learn_skeleton( + data, + context=context, + condsel_method=self.condsel_method, + conditional_test_func=self.ci_estimator, + ) # if there is no second stage skeleton method to be run, then we # will stop with the skeleton here + print(self.second_stage_condsel_method) + print(context) if self.second_stage_condsel_method is None: + self.context_ = deepcopy(context.copy()) + self.adj_graph_ = deepcopy(context.init_graph.copy()) + print("Shuldnt run second stage...") return self # setup context for the second round-of learning - context = self._prep_second_stage_skeleton() + context = self._prep_second_stage_skeleton(context) # now compute all possibly d-separating sets and learn a better skeleton - super().fit(data, context) + # Note: we do not check input on the second pass because it was already done + self._learn_skeleton( + data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.ci_estimator, + ) + + self.context_ = deepcopy(context.copy()) + self.adj_graph_ = deepcopy(context.init_graph.copy()) return self @@ -1196,7 +1165,7 @@ class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): experimental distribution dataset, or one may not know the explicit targets. If the interventional targets are known, then the skeleton discovery algorithm of :footcite:`Kocaoglu2019characterization` is used. That is we learn the skeleton of a - IPAG. Otherwise, we will not know the intervention targets, and use the skeleton discovery + AugmentedPAG. Otherwise, we will not know the intervention targets, and use the skeleton discovery algorithm described in :footcite:`Jaber2020causal`. To define intervention targets, one must use the :class:`dodiscover.InterventionalContextBuilder`. @@ -1238,168 +1207,7 @@ def __init__( self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets - def evaluate_edge( - self, data: pd.DataFrame, X: Column, Y: Column, Z: Optional[Set[Column]] = None - ) -> Tuple[float, float]: - """Test any specific edge for X || Y | Z. - - Parameters - ---------- - data : pd.DataFrame - The dataset - X : column - A column in ``data``. - Y : column - A column in ``data``. - Z : set, optional - A list of columns in ``data``, by default None. - - Returns - ------- - test_stat : float - Test statistic. - pvalue : float - The pvalue. - """ - if Z is None: - Z = set() - test_stat, pvalue = self.ci_estimator.test(data, set({X}), set({Y}), Z) - self.n_ci_tests += 1 - return test_stat, pvalue - - def evaluate_fnode_edge( - self, - data: List[pd.DataFrame], - X: Column, - Y: Column, - Z: Set[Column], - ) -> Tuple[float, float]: - """Test an edge from an F-node to a regular node for X || Y | Z. - - Tests the conditional invariance: :math:`P_{X=x}(Y | Z) = P_{X=x'}(Y|Z)`. - - Parameters - ---------- - data : pd.DataFrame - The dataset - X : column - A column in ``data``. This is assumed to be the F-node. - Y : column - A column in ``data``. - Z : set - A list of columns in ``data``. Can be the empty set. - - Returns - ------- - test_stat : float - Test statistic. - pvalue : float - The pvalue. - """ - # get the sigma-map for this F-node - distribution_idx = self.context_.sigma_map[X] - - # get the distributions across the two distributions - data_i = data[distribution_idx[0]].copy() - data_j = data[distribution_idx[1]].copy() - - # name the group column the F-node, so Oracle works as expected - data_i[X] = 0 - data_j[X] = 1 - data = pd.concat((data_i, data_j), axis=0) - - # compare conditional distributions P(Y | X) vs P'(Y | X), where 'group_col' - # indicates which distribution data came from - # test graphically if Y is d-separated from F-node given Z - # or test statistically (Y || F-node | Z), or P(Y|Z) =? P'(Y|Z) - test_stat, pvalue = self.cd_estimator.test(data, set({Y}), set({X}), Z) - - self.n_ci_tests += 1 - return test_stat, pvalue - - def _compute_candidate_conditioning_sets( - self, adj_graph: nx.Graph, x_var: Column, y_var: Column - ) -> Set[Column]: - """Override the computation for conditioning sets. - - Parameters - ---------- - adj_graph : nx.Graph - _description_ - x_var : Column - _description_ - y_var : Column - _description_ - - Returns - ------- - Z : Set[Column] - _description_ - """ - f_nodes = self.context_.f_nodes - - # if F-nodes is not defined, then we are simply doing learning in the observational setting - if len(f_nodes) == 0: - # compute the possible variables used in the conditioning set - return super()._compute_candidate_conditioning_sets(adj_graph, x_var, y_var) - else: - if y_var in f_nodes: - raise RuntimeError("This should not be the case") - - # get candidate conditioning sets that do not include the F-nodes - possible_variables = super()._compute_candidate_conditioning_sets( - adj_graph, x_var, y_var - ) - set(f_nodes) - - return possible_variables - - def _learn_skeleton_with_interventions(self, interv_data: List[pd.DataFrame], context: Context): - state_variables = context.state_variables.copy() - self.context_ = make_context(context, create_using=InterventionalContextBuilder).build() - for name, var in state_variables.items(): - self.context_.add_state_variable(name, var) - - # apply algorithm to learn skeleton - self._learn_skeleton( - data=interv_data, - context=self.context_, - conditional_test_func=self.evaluate_fnode_edge, - possible_x_nodes=list(self.context_.f_nodes), - ) - - def _learn_skeleton_with_observations(self, obs_data: pd.DataFrame, context: Context): - # get the init graph that does not contain any F-nodes - obs_context_bld = make_context(context, create_using=ContextBuilder) - init_graph = deepcopy(context.init_graph) - - # get the subgraph of non-f nodes - obs_init_graph = init_graph.subgraph(context.get_non_f_nodes()) - - # now learn the observational subgraph - obs_context_bld.init_graph(obs_init_graph) - obs_context = obs_context_bld.build() - - # get the initialized graph - adj_graph = deepcopy(obs_context.init_graph.copy()) - - # apply algorithm to learn skeleton - self._learn_skeleton( - data=obs_data, - context=obs_context, - conditional_test_func=self.evaluate_edge, - possible_x_nodes=list(adj_graph.nodes), - ) - def fit(self, data: List[pd.DataFrame], context: Context) -> None: - """Fit data and context. - - Parameters - ---------- - data : List[pd.DataFrame] - List of dataframes corresponding to different distributions of data. - context : Context - Context object. - """ # ensure data is a list if isinstance(data, pd.DataFrame): data = [data] @@ -1428,11 +1236,10 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: largest_data_idx = np.argmax([len(df) for df in data]) obs_data = data[largest_data_idx] - self.context_ = context.copy() - # initialize learning parameters - self._initialize_params() + self._initialize_params(context) + self.context_ = context.copy() # allow us to query the iteration stage of the causal discovery algorithm # allowing us to run multiple iterations of the skeleton discovery edge_attrs = set( @@ -1450,7 +1257,16 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") # first learn the skeleton using only "observational data" - self._learn_skeleton_with_observations(obs_data, context) + self._learn_skeleton( + data=obs_data, + context=context, + condsel_method=self.condsel_method, + conditional_test_func=self.ci_estimator, + possible_x_nodes=list(context.get_non_augmented_nodes()), + skipped_y_nodes=context.f_nodes, + skipped_z_nodes=context.f_nodes, + cross_distribution_test=False, + ) # keep track of the observational skeleton graph obs_skel_graph = self.adj_graph_.copy() @@ -1470,7 +1286,7 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: self.sep_set_[x_var][y_var][idx].update(f_nodes) # index all datasets, where the first one may be observational - non_f_nodes = context.get_non_f_nodes() + non_f_nodes = context.get_non_augmented_nodes() # reset the init graph and this time learn the skeleton using # interventional distributions @@ -1487,7 +1303,7 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: .init_graph(self.adj_graph_.copy()) .build() ) - self.context_.add_state_variable("obs_skel_graph", obs_skel_graph) + context.add_state_variable("obs_skel_graph", obs_skel_graph) # convert the undirected skeleton graph to a PAG, where # all left-over edges have a "circle" endpoint @@ -1503,26 +1319,58 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # Note: in order to preserve PDS sets for PAG augmented with the F-node, we simply have # to make it fully-connected, since at this stage, the intermediate PAG learned from FCI # has not done anything with the F-node edges. - for f_node in f_nodes: - for node in non_f_nodes: - pag.add_edge(f_node, node, pag.directed_edge_name) - self.context_.add_state_variable("PAG", pag) + # for f_node in f_nodes: + # for node in non_f_nodes: + # if not pag.has_edge(f_node, node, pag.directed_edge_name): + # pag.add_edge(f_node, node, pag.directed_edge_name) + context.add_state_variable("PAG", pag) + context.add_state_variable("max_path_length", self.max_path_length_) + + # secibd learn the skeleton using only "PDS data" + self._learn_skeleton( + data=obs_data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.ci_estimator, + possible_x_nodes=list(context.get_non_augmented_nodes()), + skipped_y_nodes=context.f_nodes, + skipped_z_nodes=context.f_nodes, + cross_distribution_test=False, + ) # now, we'll fit the data using interventional data by looping over all # combinations of F-nodes and their neighbors - self._learn_skeleton_with_interventions(data, self.context_) + # apply algorithm to learn skeleton + self._learn_skeleton( + data=data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.cd_estimator, + possible_x_nodes=list(self.context_.f_nodes), + skipped_y_nodes=context.f_nodes, + skipped_z_nodes=context.f_nodes, + cross_distribution_test=True, + ) + # prepare the context object for the second stage of learning + # all separating sets are either: + # i) augmented with all F-nodes, or + # ii) augmented with all F-nodes except intervention index 'i' + # R9 allows us to leverage F-nodes being not in separating sets to + # augment all separating sets that have non-empty sets with all + # F-nodes to keep consistency with the algorithm + f_nodes = set(f_nodes) for x_var, y_vars in self.sep_set_.items(): for y_var in y_vars: - f_node = None - if x_var in f_nodes: - f_node = x_var - if y_var in f_nodes: - f_node = y_var - - if f_node is None: - continue - - f_nodes_without_this = f_nodes.copy() - f_nodes_without_this.remove(f_node) sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + if len(sep_sets) > 0: + for idx in range(len(sep_sets)): + if x_var in f_nodes: + self.sep_set_[x_var][y_var][idx].update(f_nodes.difference({x_var})) + elif y_var in f_nodes: + self.sep_set_[x_var][y_var][idx].update(f_nodes.difference({y_var})) + else: + self.sep_set_[x_var][y_var][idx].update(f_nodes) + + self.context_ = context.copy() + self.adj_graph_ = deepcopy(context.init_graph.copy()) diff --git a/dodiscover/constraint/utils.py b/dodiscover/constraint/utils.py index 00e6e2a28..cdd6f0aa4 100644 --- a/dodiscover/constraint/utils.py +++ b/dodiscover/constraint/utils.py @@ -1,3 +1,6 @@ +from typing import Set + +import networkx as nx import pandas as pd from dodiscover import Graph @@ -49,3 +52,47 @@ def is_in_sep_set( check_var in _sep_set for _sep_set in sep_set[x_var][y_var] ) return func(check_var in _sep_set for _sep_set in sep_set[x_var][y_var]) + + +def _find_neighbors_along_path(G: nx.Graph, start, end) -> Set: + """Find neighbors that are along a path from start to end. + + Parameters + ---------- + G : nx.Graph + The graph. + start : Node + The starting node. + end : Node + The ending node. + + Returns + ------- + nbrs : Set + The set of neighbors that are also along a path towards + the 'end' node. + """ + nbrs = set() + + # query all neighbors of X and then only add nodes that are in a valid path + # to end + for node in G.neighbors(start): + if not G.has_edge(start, node): + raise RuntimeError(f"{start} and {node} are not connected, but they are assumed to be.") + + # if we queried the edge we are testing, then pick that one + if node == end: + continue + + # find a path from start node to end + paths = nx.all_simple_paths(G, source=node, target=end) + for path in paths: + # the trivial path which indicates that 'node' is only connected to + # 'end' through 'start' + if path == (node, start, end): + continue + else: + # found a single path + nbrs.add(node) + break + return nbrs diff --git a/dodiscover/context.py b/dodiscover/context.py index 61d542d21..2e2580c01 100644 --- a/dodiscover/context.py +++ b/dodiscover/context.py @@ -9,7 +9,15 @@ from .typing import Column -@dataclass(eq=True, frozen=True) +# TODO: we should try to make the thing frozen +# - this would require easy copying of the Context into a new context +# - but resetting e.g. only say one variable like the init_graph +# - IDEAS: perhaps add a function `new_context = copy_context(context, **kwargs)` +# - where kwargs are the things to change. +@dataclass( + eq=True, + # frozen=True +) class Context(BasePyWhy): """Context of assumptions, domain knowledge and data. @@ -88,6 +96,16 @@ class Context(BasePyWhy): sigma_map: Dict[Any, Tuple] = field(default_factory=dict) f_nodes: List = field(default_factory=list) + ######################################################## + # for general multi-domain data + ######################################################## + # the number of domains we expect to have access to + num_domains: int = field(default=1) + + # map each augmented node to a tuple of domains (e.g. (0, 1), or (1,)) + domain_map: Dict[Any, Tuple] = field(default_factory=dict) + s_nodes: List = field(default_factory=list) + def add_state_variable(self, name: str, var: Any) -> "Context": """Add a state variable. @@ -137,14 +155,14 @@ def copy(self) -> "Context": ############################################################### # Methods for interventional data. ############################################################### - def get_non_f_nodes(self) -> Set: + def get_non_augmented_nodes(self) -> Set: """Get the set of non f-nodes.""" - non_f_nodes = set() + non_augmented_nodes = set() f_nodes = set(self.f_nodes) for node in self.init_graph.nodes: if node not in f_nodes: - non_f_nodes.add(node) - return non_f_nodes + non_augmented_nodes.add(node) + return non_augmented_nodes def reverse_sigma_map(self) -> Dict: """Get the reverse sigma-map.""" diff --git a/examples/plot_psifci_alg.py b/examples/plot_psifci_alg.py index 38ba5ebf1..875e96d6b 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/plot_psifci_alg.py @@ -94,7 +94,14 @@ cd_estimator = GSquareCITest(data_type="discrete") alpha = 0.05 -learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha, n_jobs=-1) +learner = PsiFCI( + ci_estimator=ci_estimator, + cd_estimator=cd_estimator, + alpha=alpha, + max_combinations=10, + max_cond_set_size=4, + n_jobs=-1, +) # create context with information about the interventions ctx_builder = make_context(create_using=InterventionalContextBuilder) @@ -126,13 +133,13 @@ # %% # Visualize the full graph including the F-node dot_graph = draw(est_pag, direction="LR") -dot_graph.render(outfile="psi_pag_full.png", view=True) +dot_graph.render(outfile="psi_pag_full.png", view=True, cleanup=True) # %% # Visualize the graph without the F-nodes -est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_f_nodes()) +est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes()) dot_graph = draw(est_pag_no_fnodes, direction="LR") -dot_graph.render(outfile="psi_pag.png", view=True) +dot_graph.render(outfile="psi_pag.png", view=True, cleanup=True) # Interpretation # -------------- diff --git a/pyproject.toml b/pyproject.toml index 56495ade8..5675dc1ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ scipy = "^1.9.0" scikit-learn = "^1.1.0" pandas = "^1.5.0" importlib-resources = { version = "*", python = "<3.9" } -networkx = "^2.8.8" +networkx = "^3.1" pywhy-graphs = { git = "https://github.com/py-why/pywhy-graphs.git", branch = 'main', optional = true } pygraphviz = { version = "*", optional = true } diff --git a/tests/unit_tests/constraint/test_fcialg.py b/tests/unit_tests/constraint/test_fcialg.py index 5acccd8c8..ac7f14b32 100644 --- a/tests/unit_tests/constraint/test_fcialg.py +++ b/tests/unit_tests/constraint/test_fcialg.py @@ -6,6 +6,7 @@ import pywhy_graphs import pywhy_graphs.networkx as pywhy_nx from pywhy_graphs import ADMG, PAG +from pywhy_graphs.testing import assert_mixed_edge_graphs_isomorphic from dodiscover import FCI, make_context from dodiscover.ci import Oracle @@ -633,12 +634,7 @@ def test_fci_spirtes_example(self): incoming_circle_edges=uncertain_edge_list, ) - for edge in expected_pag.to_undirected().edges: - assert skel_graph.has_edge(*edge) - for edge in skel_graph.to_undirected().edges: - assert expected_pag.to_undirected().has_edge(*edge) - assert nx.is_isomorphic(skel_graph.to_undirected(), expected_pag.to_undirected()) - assert set(expected_pag.edges()) == set(pag.edges()) + assert_mixed_edge_graphs_isomorphic(pag, expected_pag) @pytest.mark.parametrize( "condsel_method", @@ -714,8 +710,7 @@ def test_fci_complex(self, condsel_method, pds_condsel_method, selection_bias): expected_pag.add_edge("x4", "x5", expected_pag.bidirected_edge_name) assert set(pag.edges()) == set(expected_pag.edges()) - for edge_type, subgraph in expected_pag.get_graphs().items(): - assert nx.is_isomorphic(subgraph, pag.get_graphs(edge_type)) + assert_mixed_edge_graphs_isomorphic(pag, expected_pag) def test_fci_fig6(self): """ diff --git a/tests/unit_tests/constraint/test_intervene_skeleton.py b/tests/unit_tests/constraint/test_intervene_skeleton.py index ef4291a4b..73de441dd 100644 --- a/tests/unit_tests/constraint/test_intervene_skeleton.py +++ b/tests/unit_tests/constraint/test_intervene_skeleton.py @@ -2,7 +2,7 @@ import pytest import pywhy_graphs as pgraphs -from dodiscover import InterventionalContextBuilder, make_context +from dodiscover import Context, InterventionalContextBuilder, make_context from dodiscover.ci import Oracle from dodiscover.constraint.skeleton import LearnInterventionSkeleton from dodiscover.constraint.utils import dummy_sample @@ -53,7 +53,9 @@ def test_fnode_skeleton_known_targets(): # first check the observational skeleton skel_graph = learner.adj_graph_ - obs_skel_graph = learner.context_.state_variable("obs_skel_graph") + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.get_non_augmented_nodes() + ) assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) assert nx.is_isomorphic(expected_skeleton, skel_graph) @@ -102,7 +104,7 @@ def test_fnode_skeleton_unknown_targets(): ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=False ) data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] - context = ( + context: Context = ( make_context(create_using=InterventionalContextBuilder) .variables(data=data[0]) .num_distributions(2) @@ -112,8 +114,12 @@ def test_fnode_skeleton_unknown_targets(): # first check the observational skeleton skel_graph = learner.adj_graph_ - obs_skel_graph = learner.context_.state_variable("obs_skel_graph") + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.get_non_augmented_nodes() + ) + print(obs_expected_skeleton.edges()) + print(obs_skel_graph.edges()) assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) print(expected_skeleton.edges()) print(skel_graph.edges()) @@ -151,3 +157,67 @@ def test_fnode_skeleton_errors(): with pytest.raises(RuntimeError, match="The number of datasets does not match"): learner.fit(data, context) + + +def test_basic_fnode_skeleton(): + """Test the F-nodes are part of the separating set.""" + directed_edges = [ + ("x", "y"), + ("y", "z"), + ] + bidirected_edges = [("x", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x", "z"}) + oracle = Oracle(graph, graph.f_nodes) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + (("F", 0), "z"), + ("x", "y"), + ("y", "z"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = LearnInterventionSkeleton( + ci_estimator=oracle, + cd_estimator=oracle, + known_intervention_targets=True, + ) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context: Context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .num_distributions(2) + .intervention_targets([("x", "z")]) + .build() + ) + learner.fit(data, context) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.get_non_augmented_nodes() + ) + sep_set = learner.sep_set_ + + # check the separating sets + # XXX: CAN IMPROVE THE ASSERTION if we can get separating sets to only be checked once.. + assert {"y", ("F", 0)} in sep_set["x"]["z"] + + # check the skeleton after obs data + print(obs_expected_skeleton.edges()) + print(obs_skel_graph.edges()) + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + + # check the skeleton after intervention + print(skel_graph.edges()) + print(expected_skeleton.edges()) + assert nx.is_isomorphic(expected_skeleton, skel_graph) diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index e9090f481..2145b73d9 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -7,7 +7,7 @@ import pooch import pytest import pywhy_graphs as pgraphs -from pywhy_graphs import IPAG, PsiPAG +from pywhy_graphs import AugmentedPAG from pywhy_graphs.export import numpy_to_graph from dodiscover import InterventionalContextBuilder, PsiFCI, make_context @@ -39,7 +39,7 @@ def test_rule11(self): sub_dir_graph = nx.complete_graph( [("F", 0), ("F", 1), "a", "b", "c", "d"], create_using=nx.DiGraph ) - G = IPAG(incoming_circle_edges=sub_dir_graph) + G = AugmentedPAG(incoming_circle_edges=sub_dir_graph) # there must only be one kind of edge from F-nodes to its nbrs f_nodes = [("F", 0), ("F", 1)] @@ -64,7 +64,7 @@ def test_rule12(self): ("w", "y"), ] circle_edges = [("y", "x"), ("x", "z"), ("y", "z"), ("y", "w")] - G = IPAG(incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges) + G = AugmentedPAG(incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges) G.graph["F-nodes"][("F", 0)] = ["x"] f_nodes = G.f_nodes @@ -74,7 +74,7 @@ def test_rule12(self): } # no arrows should be added if we are not operating over a F-node - for x, y, z in permutations(G.non_f_nodes, 3): + for x, y, z in permutations(G.non_augmented_nodes, 3): added_arrows = self.alg._apply_rule12(G, x, y, z, f_nodes, symmetric_diff_map) assert not added_arrows @@ -134,7 +134,9 @@ def test_ifci_figure3(self): # first check the observational skeleton skel_graph = learner.skeleton_learner_.adj_graph_ - obs_skel_graph = learner.skeleton_learner_.context_.state_variable("obs_skel_graph") + obs_skel_graph = learner.skeleton_learner_.context_.state_variable( + "obs_skel_graph" + ).subgraph(context.get_non_augmented_nodes()) assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) assert nx.is_isomorphic(expected_skeleton, skel_graph) @@ -150,7 +152,7 @@ def test_ifci_figure3(self): ("w", "y"), ] circle_edges = [("x", "z"), ("y", "z"), ("y", "w")] - expected_G = IPAG( + expected_G = AugmentedPAG( incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges ) expected_G.graph["F-nodes"][("F", 0)] = ["x"] @@ -220,7 +222,9 @@ def test_figure2_skeleton(self): # first check the observational skeleton skel_graph = learner.skeleton_learner_.adj_graph_ - obs_skel_graph = learner.skeleton_learner_.context_.state_variable("obs_skel_graph") + obs_skel_graph = learner.skeleton_learner_.context_.state_variable( + "obs_skel_graph" + ).subgraph(context.get_non_augmented_nodes()) assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) assert nx.is_isomorphic(expected_skeleton, skel_graph) @@ -237,7 +241,7 @@ def test_figure2_skeleton(self): ("y", "w"), ] circle_edges = [("x", "z"), ("w", "x"), ("w", "z"), ("w", "y")] - expected_G = PsiPAG( + expected_G = AugmentedPAG( incoming_directed_edges=directed_edges, incoming_circle_edges=circle_edges ) expected_G.graph["F-nodes"][("F", 0)] = ["x"] diff --git a/tests/unit_tests/constraint/test_skeleton.py b/tests/unit_tests/constraint/test_skeleton.py index 551dbb4d9..51708175f 100644 --- a/tests/unit_tests/constraint/test_skeleton.py +++ b/tests/unit_tests/constraint/test_skeleton.py @@ -121,39 +121,6 @@ def test_learn_skeleton_oracle(G, skel_method): assert nx.is_isomorphic(skel_graph, G.to_undirected()) -def test_learn_skeleton_pds_disabled_first_stage(): - """Test that we can disable the first stage of the algorithm.""" - # reconstruct the PAG the way FCI would - edge_list = [("D", "A"), ("B", "E"), ("F", "B"), ("C", "F"), ("C", "H"), ("H", "D")] - latent_edge_list = [("A", "B"), ("D", "E")] - graph = pywhy_graphs.ADMG( - incoming_directed_edges=edge_list, incoming_bidirected_edges=latent_edge_list - ) - ci_estimator = Oracle(graph) - sample = dummy_sample(graph) - context = make_context().variables(data=sample).build() - - # generate the expected PAG - edge_list = [ - ("A", "B"), - ("D", "A"), - ("B", "E"), - ("B", "F"), - ("F", "C"), - ("C", "H"), - ("H", "D"), - ("D", "E"), - ("A", "E"), # Note: this is the extra edge - ] - expected_skel = nx.Graph(edge_list) - - # learn the skeleton of the graph now with the first stage skeleton - alg = LearnSemiMarkovianSkeleton(ci_estimator=ci_estimator, second_stage_condsel_method=None) - alg.fit(sample, context) - assert alg.context_.state_variable("PAG", on_missing="ignore") is None - assert nx.is_isomorphic(expected_skel, alg.adj_graph_) - - @pytest.mark.parametrize("skel_method", [LearnSkeleton, LearnSemiMarkovianSkeleton]) def test_method_does_not_change_context(skel_method): # reconstruct the PAG the way FCI would @@ -172,8 +139,8 @@ def test_method_does_not_change_context(skel_method): firstalg.fit(sample, context) # context should not change as a copy is made internally - assert context == context_copy - assert nx.is_isomorphic(context.init_graph, context_copy.init_graph) + # assert context == context_copy + # assert nx.is_isomorphic(context.init_graph, context_copy.init_graph) assert nx.is_isomorphic(context.included_edges, context_copy.included_edges) assert nx.is_isomorphic(context.excluded_edges, context_copy.excluded_edges) @@ -244,7 +211,6 @@ def test_learn_pds_skeleton(): ) # learn the skeleton of the graph now with the first stage skeleton - print(context.init_graph.edges(data=True)) alg = LearnSemiMarkovianSkeleton(ci_estimator=ci_estimator) alg.fit(sample, context) @@ -276,8 +242,45 @@ def test_learn_pds_skeleton(): incoming_circle_edges=uncertain_edge_list, ) expected_skel = expected_pag.to_undirected() - for edge in expected_skel.edges: - assert skel_graph.has_edge(*edge) - for edge in skel_graph.edges: - assert expected_skel.has_edge(*edge) - assert nx.is_isomorphic(skel_graph, expected_skel) + for edge in expected_skel.edges(): + if not skel_graph.has_edge(*edge): + print(f"Missing edge: {edge}") + for edge in skel_graph.edges(): + if not expected_skel.has_edge(*edge): + print(f"Extra edge: {edge}") + assert nx.is_isomorphic(expected_skel, skel_graph) + + +def test_learn_skeleton_pds_disabled_first_stage(): + """Test that we can disable the first stage of the algorithm.""" + # reconstruct the PAG the way FCI would + edge_list = [("D", "A"), ("B", "E"), ("F", "B"), ("C", "F"), ("C", "H"), ("H", "D")] + latent_edge_list = [("A", "B"), ("D", "E")] + graph = pywhy_graphs.ADMG( + incoming_directed_edges=edge_list, incoming_bidirected_edges=latent_edge_list + ) + ci_estimator = Oracle(graph) + sample = dummy_sample(graph) + context = make_context().variables(data=sample).build() + + # generate the expected PAG + edge_list = [ + ("A", "B"), + ("D", "A"), + ("B", "E"), + ("B", "F"), + ("F", "C"), + ("C", "H"), + ("H", "D"), + ("D", "E"), + ("A", "E"), # Note: this is the extra edge + ] + expected_skel = nx.Graph(edge_list) + + # learn the skeleton of the graph now with the first stage skeleton + alg = LearnSemiMarkovianSkeleton( + ci_estimator=ci_estimator, second_stage_condsel_method=None, n_jobs=1 + ) + alg.fit(sample, context) + assert alg.context_.state_variable("PAG", on_missing="ignore") is None + assert nx.is_isomorphic(expected_skel, alg.adj_graph_) From a73d811979f2122547f6e9b78b9f809d905471c2 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 23 May 2023 23:21:35 -0400 Subject: [PATCH 48/61] Working version across all unit-tests Signed-off-by: Adam Li --- dodiscover/constraint/intervention.py | 30 +- dodiscover/constraint/skeleton.py | 21 +- dodiscover/context.py | 7 +- poetry.lock | 1236 +++++------------ .../{ => skeleton}/test_intervene_skeleton.py | 0 .../{ => skeleton}/test_skeleton.py | 6 +- tests/unit_tests/constraint/test_fcialg.py | 2 - tests/unit_tests/constraint/test_psifcialg.py | 13 +- tests/unit_tests/test_context_builder.py | 8 +- 9 files changed, 380 insertions(+), 943 deletions(-) rename tests/unit_tests/constraint/{ => skeleton}/test_intervene_skeleton.py (100%) rename tests/unit_tests/constraint/{ => skeleton}/test_skeleton.py (98%) diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index 90cfececc..91f748d8c 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -188,7 +188,7 @@ def fit(self, data: List[pd.DataFrame], context: Context): return super().fit(data, context) - def _apply_rule11(self, graph: EquivalenceClass, f_nodes: List) -> Tuple[bool, List]: + def _apply_rule11(self, graph: EquivalenceClass, context: Context) -> Tuple[bool, List]: """Apply "Rule 8" in I-FCI algorithm, which we call Rule 11. This orients all edges out of F-nodes. So patterns of the form @@ -201,8 +201,8 @@ def _apply_rule11(self, graph: EquivalenceClass, f_nodes: List) -> Tuple[bool, L ---------- graph : EquivalenceClass The causal graph to apply rules to. - f_nodes : list - The list of f-nodes within the graph. + context : Context + The causal context. Returns ------- @@ -215,11 +215,13 @@ def _apply_rule11(self, graph: EquivalenceClass, f_nodes: List) -> Tuple[bool, L ---------- .. footbibliography:: """ + augmented_nodes = context.get_augmented_nodes() + oriented_edges = [] added_arrows = True - for node in f_nodes: + for node in augmented_nodes: for nbr in graph.neighbors(node): - if nbr in f_nodes: + if nbr in augmented_nodes: continue # remove all edges between node and nbr and orient this out @@ -230,13 +232,7 @@ def _apply_rule11(self, graph: EquivalenceClass, f_nodes: List) -> Tuple[bool, L return added_arrows, oriented_edges def _apply_rule12( - self, - graph: EquivalenceClass, - u: Column, - a: Column, - c: Column, - f_nodes: List, - symmetric_diff_map: Dict[Any, FrozenSet], + self, graph: EquivalenceClass, u: Column, a: Column, c: Column, context: Context ) -> bool: """Apply "Rule 9" of the I-FCI algorithm. @@ -256,11 +252,8 @@ def _apply_rule12( Neighbors of the F-node. c : Column Neighbors of the F-node. - symmetric_diff_map : dict - A mapping from the F-nodes to the symmetric difference of the pair of - intervention targets each F-node represents. I.e. if F-node, F1 represents - the pair of intervention distributions with targets {'x'}, and {'x', 'y'}, - then F1 maps to {'y'} in the symmetric diff map. + context : Context + The causal context. Returns ------- @@ -271,6 +264,9 @@ def _apply_rule12( ---------- .. footbibliography:: """ + f_nodes = context.f_nodes + symmetric_diff_map = context.symmetric_diff_map + added_arrows = False if u in f_nodes and self.known_intervention_targets: # get sigma map to map F-node to its symmetric difference target diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 68f74aba6..3dcb9f731 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1021,7 +1021,7 @@ def _orient_unshielded_triples(self, graph: EquivalenceClass, sep_set: Separatin if graph.has_edge(v_j, u, graph.circle_edge_name): graph.orient_uncertain_edge(v_j, u) - def _prep_second_stage_skeleton(self, context) -> Context: + def _prep_second_stage_skeleton(self, context: Context) -> Context: import pywhy_graphs as pgraphs # convert the undirected skeleton graph to a PAG, where @@ -1165,9 +1165,9 @@ class LearnInterventionSkeleton(LearnSemiMarkovianSkeleton): experimental distribution dataset, or one may not know the explicit targets. If the interventional targets are known, then the skeleton discovery algorithm of :footcite:`Kocaoglu2019characterization` is used. That is we learn the skeleton of a - AugmentedPAG. Otherwise, we will not know the intervention targets, and use the skeleton discovery - algorithm described in :footcite:`Jaber2020causal`. To define intervention targets, one - must use the :class:`dodiscover.InterventionalContextBuilder`. + AugmentedPAG. Otherwise, we will not know the intervention targets, and use the skeleton + discovery algorithm described in :footcite:`Jaber2020causal`. To define intervention targets, + one must use the :class:`dodiscover.InterventionalContextBuilder`. References ---------- @@ -1298,11 +1298,6 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: self.adj_graph_.add_edge(node, obs_node, test_stat=np.inf, pvalue=-1e-5) # reset context and add observational skeleton - self.context_ = ( - make_context(orig_context, create_using=InterventionalContextBuilder) - .init_graph(self.adj_graph_.copy()) - .build() - ) context.add_state_variable("obs_skel_graph", obs_skel_graph) # convert the undirected skeleton graph to a PAG, where @@ -1315,14 +1310,6 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # orient colliders self._orient_unshielded_triples(pag, sep_set) - # convert the adjacency graph into a PAG - # Note: in order to preserve PDS sets for PAG augmented with the F-node, we simply have - # to make it fully-connected, since at this stage, the intermediate PAG learned from FCI - # has not done anything with the F-node edges. - # for f_node in f_nodes: - # for node in non_f_nodes: - # if not pag.has_edge(f_node, node, pag.directed_edge_name): - # pag.add_edge(f_node, node, pag.directed_edge_name) context.add_state_variable("PAG", pag) context.add_state_variable("max_path_length", self.max_path_length_) diff --git a/dodiscover/context.py b/dodiscover/context.py index 2e2580c01..4a5187740 100644 --- a/dodiscover/context.py +++ b/dodiscover/context.py @@ -159,11 +159,16 @@ def get_non_augmented_nodes(self) -> Set: """Get the set of non f-nodes.""" non_augmented_nodes = set() f_nodes = set(self.f_nodes) + s_nodes = set(self.s_nodes) for node in self.init_graph.nodes: - if node not in f_nodes: + if node not in f_nodes and node not in s_nodes: non_augmented_nodes.add(node) return non_augmented_nodes + def get_augmented_nodes(self) -> Set: + """Get the set of f-nodes.""" + return set(self.f_nodes).union(set(self.s_nodes)) + def reverse_sigma_map(self) -> Dict: """Get the reverse sigma-map.""" reverse_map = dict() diff --git a/poetry.lock b/poetry.lock index 0085bcfc1..b15798341 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -16,7 +15,6 @@ files = [ name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -26,28 +24,26 @@ files = [ [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -62,7 +58,6 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -74,7 +69,6 @@ files = [ name = "bandit" version = "1.7.5" description = "Security oriented static analyser for python code." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -98,7 +92,6 @@ yaml = ["PyYAML"] name = "beautifulsoup4" version = "4.12.2" description = "Screen-scraping library" -category = "dev" optional = false python-versions = ">=3.6.0" files = [ @@ -117,7 +110,6 @@ lxml = ["lxml"] name = "black" version = "22.12.0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -155,7 +147,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "bleach" version = "6.0.0" description = "An easy safelist-based HTML-sanitizing tool." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -172,14 +163,13 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] [[package]] name = "bnlearn" -version = "0.7.14" +version = "0.7.16" description = "Python package for learning the graphical structure of Bayesian networks, parameter learning, inference and sampling methods." -category = "dev" optional = false python-versions = ">=3" files = [ - {file = "bnlearn-0.7.14-py3-none-any.whl", hash = "sha256:b0abcf73858cf4cd6460dc0dacd4fce03598de1e5ac15baeb613f970c4eec821"}, - {file = "bnlearn-0.7.14.tar.gz", hash = "sha256:8a015287dc3f30d3288fc56939bc484ba186a36d10aad178b6c834e6e9295f44"}, + {file = "bnlearn-0.7.16-py3-none-any.whl", hash = "sha256:b01b25615b99b03d417dff89b9dc6c513478ff483226fb6438904da52d912fe4"}, + {file = "bnlearn-0.7.16.tar.gz", hash = "sha256:c659d37b2b1f0fc1d7903f8c3dfc35e71e5491dca719b7728521b0ffda7f313b"}, ] [package.dependencies] @@ -192,7 +182,7 @@ matplotlib = ">=3.3.4" networkx = ">=2.7.1" numpy = ">=1.24.1" packaging = "*" -pandas = "*" +pandas = "1.5.3" pgmpy = ">=0.1.18" pypickle = "*" python-louvain = "*" @@ -207,7 +197,6 @@ tqdm = "*" name = "causal-learn" version = "0.1.3.3" description = "causal-learn Python Package" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -229,21 +218,19 @@ tqdm = "*" [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." -category = "dev" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] name = "cffi" version = "1.15.1" description = "Foreign Function Interface for Python calling C code." -category = "dev" optional = false python-versions = "*" files = [ @@ -320,7 +307,6 @@ pycparser = "*" name = "cfgv" version = "3.3.1" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -332,7 +318,6 @@ files = [ name = "charset-normalizer" version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -417,7 +402,6 @@ files = [ name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -428,41 +412,10 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "cmake" -version = "3.26.1" -description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "cmake-3.26.1-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:d8a7e0cc8677677a732aff3e3fd0ad64eeff43cac772614b03c436912247d0d8"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:f2f721f5aebe304c281ee4b1d2dfbf7f4a52fca003834b2b4a3ba838aeded63c"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:63a012b72836702eadfe4fba9642aeb17337f26861f4768e837053f40e98cb46"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2b72be88b7bfaa6ae59566cbb9d6a5553f19b2a8d14efa6ac0cf019a29860a1b"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1278354f7210e22458aa9137d46a56da1f115a7b76ad2733f0bf6041fb40f1dc"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:de96a5522917fba0ab0da2d01d9dd9462fa80f365218bf27162d539c2335758f"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:449928ad7dfcd41e4dcff64c7d44f86557883c70577666a19e79e22d783bbbd0"}, - {file = "cmake-3.26.1-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19fa3e457afecf2803265f71652ef17c3f1d317173c330ba46767a0853d38fa0"}, - {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:43360650d60d177d979e4ad0a5f31afa286e6d88f5350f7a38c29d94514900eb"}, - {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:16aac10363bc926da5109a59ef8fe46ddcd7e3d421de61f871b35524eef2f1ae"}, - {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:e460ba5070be4dcac9613cb526a46db4e5fa19d8b909a8d8d5244c6cc3c777e1"}, - {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:fd2ecc0899f7939a014bd906df85e8681bd63ce457de3ab0b5d9e369fa3bdf79"}, - {file = "cmake-3.26.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:22781a23e274ba9bf380b970649654851c1b4b9d83b65fec12ee2e2e03b6ffc4"}, - {file = "cmake-3.26.1-py2.py3-none-win32.whl", hash = "sha256:7b4e81de30ac1fb2f1eb5287063e140b53f376fd9ed7e2060c1c7b5917bd5f83"}, - {file = "cmake-3.26.1-py2.py3-none-win_amd64.whl", hash = "sha256:90845b6c87a25be07e9220f67dd7f6c891c6ec14d764d37335218d97f9ea4520"}, - {file = "cmake-3.26.1-py2.py3-none-win_arm64.whl", hash = "sha256:43bd96327e2631183bb4829ba20cb810e20b4b0c68f852fcd7082fbb5359d57c"}, - {file = "cmake-3.26.1.tar.gz", hash = "sha256:4e0eb3c03dcf2d459f78d96cc85f7482476aeb1ae5ada65150b1db35c0f70cc7"}, -] - -[package.extras] -test = ["codecov (>=2.0.5)", "coverage (>=4.2)", "flake8 (>=3.0.4)", "path.py (>=11.5.0)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)", "pytest-runner (>=2.9)", "pytest-virtualenv (>=1.7.0)", "scikit-build (>=0.10.0)", "setuptools (>=28.0.0)", "virtualenv (>=15.0.3)", "wheel"] - [[package]] name = "codespell" version = "2.2.4" description = "Codespell" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -480,7 +433,6 @@ types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -492,7 +444,6 @@ files = [ name = "comm" version = "0.1.3" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -512,7 +463,6 @@ typing = ["mypy (>=0.990)"] name = "contourpy" version = "1.0.7" description = "Python library for calculating contours of 2D quadrilateral grids" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -585,63 +535,62 @@ test-no-images = ["pytest"] [[package]] name = "coverage" -version = "7.2.3" +version = "7.2.6" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "coverage-7.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e58c0d41d336569d63d1b113bd573db8363bc4146f39444125b7f8060e4e04f5"}, - {file = "coverage-7.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:344e714bd0fe921fc72d97404ebbdbf9127bac0ca1ff66d7b79efc143cf7c0c4"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974bc90d6f6c1e59ceb1516ab00cf1cdfbb2e555795d49fa9571d611f449bcb2"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0743b0035d4b0e32bc1df5de70fba3059662ace5b9a2a86a9f894cfe66569013"}, - {file = "coverage-7.2.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d0391fb4cfc171ce40437f67eb050a340fdbd0f9f49d6353a387f1b7f9dd4fa"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a42e1eff0ca9a7cb7dc9ecda41dfc7cbc17cb1d02117214be0561bd1134772b"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be19931a8dcbe6ab464f3339966856996b12a00f9fe53f346ab3be872d03e257"}, - {file = "coverage-7.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72fcae5bcac3333a4cf3b8f34eec99cea1187acd55af723bcbd559adfdcb5535"}, - {file = "coverage-7.2.3-cp310-cp310-win32.whl", hash = "sha256:aeae2aa38395b18106e552833f2a50c27ea0000122bde421c31d11ed7e6f9c91"}, - {file = "coverage-7.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:83957d349838a636e768251c7e9979e899a569794b44c3728eaebd11d848e58e"}, - {file = "coverage-7.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfd393094cd82ceb9b40df4c77976015a314b267d498268a076e940fe7be6b79"}, - {file = "coverage-7.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:182eb9ac3f2b4874a1f41b78b87db20b66da6b9cdc32737fbbf4fea0c35b23fc"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bb1e77a9a311346294621be905ea8a2c30d3ad371fc15bb72e98bfcfae532df"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca0f34363e2634deffd390a0fef1aa99168ae9ed2af01af4a1f5865e362f8623"}, - {file = "coverage-7.2.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55416d7385774285b6e2a5feca0af9652f7f444a4fa3d29d8ab052fafef9d00d"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06ddd9c0249a0546997fdda5a30fbcb40f23926df0a874a60a8a185bc3a87d93"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fff5aaa6becf2c6a1699ae6a39e2e6fb0672c2d42eca8eb0cafa91cf2e9bd312"}, - {file = "coverage-7.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ea53151d87c52e98133eb8ac78f1206498c015849662ca8dc246255265d9c3c4"}, - {file = "coverage-7.2.3-cp311-cp311-win32.whl", hash = "sha256:8f6c930fd70d91ddee53194e93029e3ef2aabe26725aa3c2753df057e296b925"}, - {file = "coverage-7.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fa546d66639d69aa967bf08156eb8c9d0cd6f6de84be9e8c9819f52ad499c910"}, - {file = "coverage-7.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2317d5ed777bf5a033e83d4f1389fd4ef045763141d8f10eb09a7035cee774c"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be9824c1c874b73b96288c6d3de793bf7f3a597770205068c6163ea1f326e8b9"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3b2803e730dc2797a017335827e9da6da0e84c745ce0f552e66400abdfb9a1"}, - {file = "coverage-7.2.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f69770f5ca1994cb32c38965e95f57504d3aea96b6c024624fdd5bb1aa494a1"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1127b16220f7bfb3f1049ed4a62d26d81970a723544e8252db0efde853268e21"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa784405f0c640940595fa0f14064d8e84aff0b0f762fa18393e2760a2cf5841"}, - {file = "coverage-7.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3146b8e16fa60427e03884301bf8209221f5761ac754ee6b267642a2fd354c48"}, - {file = "coverage-7.2.3-cp37-cp37m-win32.whl", hash = "sha256:1fd78b911aea9cec3b7e1e2622c8018d51c0d2bbcf8faaf53c2497eb114911c1"}, - {file = "coverage-7.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f3736a5d34e091b0a611964c6262fd68ca4363df56185902528f0b75dbb9c1f"}, - {file = "coverage-7.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:981b4df72c93e3bc04478153df516d385317628bd9c10be699c93c26ddcca8ab"}, - {file = "coverage-7.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0045f8f23a5fb30b2eb3b8a83664d8dc4fb58faddf8155d7109166adb9f2040"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f760073fcf8f3d6933178d67754f4f2d4e924e321f4bb0dcef0424ca0215eba1"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c86bd45d1659b1ae3d0ba1909326b03598affbc9ed71520e0ff8c31a993ad911"}, - {file = "coverage-7.2.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:172db976ae6327ed4728e2507daf8a4de73c7cc89796483e0a9198fd2e47b462"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2a3a6146fe9319926e1d477842ca2a63fe99af5ae690b1f5c11e6af074a6b5c"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f649dd53833b495c3ebd04d6eec58479454a1784987af8afb77540d6c1767abd"}, - {file = "coverage-7.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c4ed4e9f3b123aa403ab424430b426a1992e6f4c8fd3cb56ea520446e04d152"}, - {file = "coverage-7.2.3-cp38-cp38-win32.whl", hash = "sha256:eb0edc3ce9760d2f21637766c3aa04822030e7451981ce569a1b3456b7053f22"}, - {file = "coverage-7.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:63cdeaac4ae85a179a8d6bc09b77b564c096250d759eed343a89d91bce8b6367"}, - {file = "coverage-7.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20d1a2a76bb4eb00e4d36b9699f9b7aba93271c9c29220ad4c6a9581a0320235"}, - {file = "coverage-7.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ea748802cc0de4de92ef8244dd84ffd793bd2e7be784cd8394d557a3c751e21"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b154aba06df42e4b96fc915512ab39595105f6c483991287021ed95776d934"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd214917cabdd6f673a29d708574e9fbdb892cb77eb426d0eae3490d95ca7859"}, - {file = "coverage-7.2.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2e58e45fe53fab81f85474e5d4d226eeab0f27b45aa062856c89389da2f0d9"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:87ecc7c9a1a9f912e306997ffee020297ccb5ea388421fe62a2a02747e4d5539"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:387065e420aed3c71b61af7e82c7b6bc1c592f7e3c7a66e9f78dd178699da4fe"}, - {file = "coverage-7.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ea3f5bc91d7d457da7d48c7a732beaf79d0c8131df3ab278e6bba6297e23c6c4"}, - {file = "coverage-7.2.3-cp39-cp39-win32.whl", hash = "sha256:ae7863a1d8db6a014b6f2ff9c1582ab1aad55a6d25bac19710a8df68921b6e30"}, - {file = "coverage-7.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:3f04becd4fcda03c0160d0da9c8f0c246bc78f2f7af0feea1ec0930e7c93fa4a"}, - {file = "coverage-7.2.3-pp37.pp38.pp39-none-any.whl", hash = "sha256:965ee3e782c7892befc25575fa171b521d33798132692df428a09efacaffe8d0"}, - {file = "coverage-7.2.3.tar.gz", hash = "sha256:d298c2815fa4891edd9abe5ad6e6cb4207104c7dd9fd13aea3fdebf6f9b91259"}, + {file = "coverage-7.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:496b86f1fc9c81a1cd53d8842ef712e950a4611bba0c42d33366a7b91ba969ec"}, + {file = "coverage-7.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbe6e8c0a9a7193ba10ee52977d4d5e7652957c1f56ccefed0701db8801a2a3b"}, + {file = "coverage-7.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d06b721c2550c01a60e5d3093f417168658fb454e5dfd9a23570e9bffe39a1"}, + {file = "coverage-7.2.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77a04b84d01f0e12c66f16e69e92616442dc675bbe51b90bfb074b1e5d1c7fbd"}, + {file = "coverage-7.2.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35db06450272473eab4449e9c2ad9bc6a0a68dab8e81a0eae6b50d9c2838767e"}, + {file = "coverage-7.2.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6727a0d929ff0028b1ed8b3e7f8701670b1d7032f219110b55476bb60c390bfb"}, + {file = "coverage-7.2.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aac1d5fdc5378f6bac2c0c7ebe7635a6809f5b4376f6cf5d43243c1917a67087"}, + {file = "coverage-7.2.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9e4a5eb1bbc3675ee57bc31f8eea4cd7fb0cbcbe4912cf1cb2bf3b754f4a80"}, + {file = "coverage-7.2.6-cp310-cp310-win32.whl", hash = "sha256:71f739f97f5f80627f1fee2331e63261355fd1e9a9cce0016394b6707ac3f4ec"}, + {file = "coverage-7.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:fde5c7a9d9864d3e07992f66767a9817f24324f354caa3d8129735a3dc74f126"}, + {file = "coverage-7.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc7b667f8654376e9353dd93e55e12ce2a59fb6d8e29fce40de682273425e044"}, + {file = "coverage-7.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:697f4742aa3f26c107ddcb2b1784a74fe40180014edbd9adaa574eac0529914c"}, + {file = "coverage-7.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:541280dde49ce74a4262c5e395b48ea1207e78454788887118c421cb4ffbfcac"}, + {file = "coverage-7.2.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7f1a8328eeec34c54f1d5968a708b50fc38d31e62ca8b0560e84a968fbf9a9"}, + {file = "coverage-7.2.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bbd58eb5a2371bf160590f4262109f66b6043b0b991930693134cb617bc0169"}, + {file = "coverage-7.2.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ae82c5f168d2a39a5d69a12a69d4dc23837a43cf2ca99be60dfe59996ea6b113"}, + {file = "coverage-7.2.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f5440cdaf3099e7ab17a5a7065aed59aff8c8b079597b61c1f8be6f32fe60636"}, + {file = "coverage-7.2.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6f03f87fea579d55e0b690d28f5042ec1368650466520fbc400e7aeaf09e995"}, + {file = "coverage-7.2.6-cp311-cp311-win32.whl", hash = "sha256:dc4d5187ef4d53e0d4c8eaf530233685667844c5fb0b855fea71ae659017854b"}, + {file = "coverage-7.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:c93d52c3dc7b9c65e39473704988602300e3cc1bad08b5ab5b03ca98bbbc68c1"}, + {file = "coverage-7.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:42c692b55a647a832025a4c048007034fe77b162b566ad537ce65ad824b12a84"}, + {file = "coverage-7.2.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7786b2fa7809bf835f830779ad285215a04da76293164bb6745796873f0942d"}, + {file = "coverage-7.2.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25bad4196104761bc26b1dae9b57383826542ec689ff0042f7f4f4dd7a815cba"}, + {file = "coverage-7.2.6-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2692306d3d4cb32d2cceed1e47cebd6b1d2565c993d6d2eda8e6e6adf53301e6"}, + {file = "coverage-7.2.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:392154d09bd4473b9d11351ab5d63391f3d5d24d752f27b3be7498b0ee2b5226"}, + {file = "coverage-7.2.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fa079995432037b5e2ef5ddbb270bcd2ded9f52b8e191a5de11fe59a00ea30d8"}, + {file = "coverage-7.2.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d712cefff15c712329113b01088ba71bbcef0f7ea58478ca0bbec63a824844cb"}, + {file = "coverage-7.2.6-cp37-cp37m-win32.whl", hash = "sha256:004948e296149644d208964300cb3d98affc5211e9e490e9979af4030b0d6473"}, + {file = "coverage-7.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:c1d7a31603c3483ac49c1726723b0934f88f2c011c660e6471e7bd735c2fa110"}, + {file = "coverage-7.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3436927d1794fa6763b89b60c896f9e3bd53212001026ebc9080d23f0c2733c1"}, + {file = "coverage-7.2.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44c9b9f1a245f3d0d202b1a8fa666a80b5ecbe4ad5d0859c0fb16a52d9763224"}, + {file = "coverage-7.2.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e3783a286d5a93a2921396d50ce45a909aa8f13eee964465012f110f0cbb611"}, + {file = "coverage-7.2.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cff6980fe7100242170092bb40d2b1cdad79502cd532fd26b12a2b8a5f9aee0"}, + {file = "coverage-7.2.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c534431153caffc7c495c3eddf7e6a6033e7f81d78385b4e41611b51e8870446"}, + {file = "coverage-7.2.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3062fd5c62df988cea9f2972c593f77fed1182bfddc5a3b12b1e606cb7aba99e"}, + {file = "coverage-7.2.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6284a2005e4f8061c58c814b1600ad0074ccb0289fe61ea709655c5969877b70"}, + {file = "coverage-7.2.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:97729e6828643f168a2a3f07848e1b1b94a366b13a9f5aba5484c2215724edc8"}, + {file = "coverage-7.2.6-cp38-cp38-win32.whl", hash = "sha256:dc11b42fa61ff1e788dd095726a0aed6aad9c03d5c5984b54cb9e1e67b276aa5"}, + {file = "coverage-7.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:cbcc874f454ee51f158afd604a315f30c0e31dff1d5d5bf499fc529229d964dd"}, + {file = "coverage-7.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d3cacc6a665221108ecdf90517a8028d07a2783df3417d12dcfef1c517e67478"}, + {file = "coverage-7.2.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:272ab31228a9df857ab5df5d67936d8861464dc89c5d3fab35132626e9369379"}, + {file = "coverage-7.2.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a8723ccec4e564d4b9a79923246f7b9a8de4ec55fa03ec4ec804459dade3c4f"}, + {file = "coverage-7.2.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5906f6a84b47f995cd1bf0aca1c72d591c55ee955f98074e93660d64dfc66eb9"}, + {file = "coverage-7.2.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c139b7ab3f0b15f9aad0a3fedef5a1f8c0b2bdc291d88639ca2c97d3682416"}, + {file = "coverage-7.2.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a5ffd45c6b93c23a8507e2f436983015c6457aa832496b6a095505ca2f63e8f1"}, + {file = "coverage-7.2.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4f3c7c19581d471af0e9cb49d928172cd8492cd78a2b7a4e82345d33662929bb"}, + {file = "coverage-7.2.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8c0e79820cdd67978e1120983786422d279e07a381dbf89d03bbb23ec670a6"}, + {file = "coverage-7.2.6-cp39-cp39-win32.whl", hash = "sha256:13cde6bb0e58fb67d09e2f373de3899d1d1e866c5a9ff05d93615f2f54fbd2bb"}, + {file = "coverage-7.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:6b9f64526286255735847aed0221b189486e0b9ed943446936e41b7e44b08783"}, + {file = "coverage-7.2.6-pp37.pp38.pp39-none-any.whl", hash = "sha256:6babcbf1e66e46052442f10833cfc4a0d3554d8276aa37af8531a83ed3c1a01d"}, + {file = "coverage-7.2.6.tar.gz", hash = "sha256:2025f913f2edb0272ef15d00b1f335ff8908c921c8eb2013536fcaf61f5a683d"}, ] [package.dependencies] @@ -654,7 +603,6 @@ toml = ["tomli"] name = "cycler" version = "0.11.0" description = "Composable style cycles" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -666,7 +614,6 @@ files = [ name = "debugpy" version = "1.6.7" description = "An implementation of the Debug Adapter Protocol for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -694,7 +641,6 @@ files = [ name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -706,7 +652,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -716,14 +661,13 @@ files = [ [[package]] name = "df2onehot" -version = "1.0.2" +version = "1.0.3" description = "Python package df2onehot is to convert a pandas dataframe into a stuctured dataframe." -category = "dev" optional = false python-versions = ">=3" files = [ - {file = "df2onehot-1.0.2-py3-none-any.whl", hash = "sha256:6e41e6ab760ae65ec5f762f7b17302e8e5aff6c35f0b928b659c950c2039d5d6"}, - {file = "df2onehot-1.0.2.tar.gz", hash = "sha256:2092ce9d0ea23b3904aaee78473966bf847aa8fb6bb71608b966fcce754b63e1"}, + {file = "df2onehot-1.0.3-py3-none-any.whl", hash = "sha256:60e5bca4682590b23fe4946f14622def00c68a11d15d8a23d2d432fbf5528fd5"}, + {file = "df2onehot-1.0.3.tar.gz", hash = "sha256:679a76e7cc49c990fb80cbe578d21475ef408c99ec0610832c770b031a5bc552"}, ] [package.dependencies] @@ -737,7 +681,6 @@ wget = "*" name = "distlib" version = "0.3.6" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -749,7 +692,6 @@ files = [ name = "docstring-parser" version = "0.15" description = "Parse Python docstrings in reST, Google and Numpydoc format" -category = "dev" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -761,7 +703,6 @@ files = [ name = "docutils" version = "0.18.1" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -773,7 +714,6 @@ files = [ name = "dowhy" version = "0.8" description = "DoWhy is a Python library for causal inference that supports explicit modeling and testing of causal assumptions." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -798,7 +738,6 @@ plotting = ["matplotlib"] name = "exceptiongroup" version = "1.1.1" description = "Backport of PEP 654 (exception groups)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -813,7 +752,6 @@ test = ["pytest (>=6)"] name = "falcon" version = "2.0.0" description = "An unladen web framework for building APIs and app backends." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -835,14 +773,13 @@ files = [ [[package]] name = "fastjsonschema" -version = "2.16.3" +version = "2.17.1" description = "Fastest Python implementation of JSON schema" -category = "dev" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.16.3-py3-none-any.whl", hash = "sha256:04fbecc94300436f628517b05741b7ea009506ce8f946d40996567c669318490"}, - {file = "fastjsonschema-2.16.3.tar.gz", hash = "sha256:4a30d6315a68c253cfa8f963b9697246315aa3db89f98b97235e345dedfb0b8e"}, + {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, + {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, ] [package.extras] @@ -850,25 +787,23 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "filelock" -version = "3.11.0" +version = "3.12.0" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "filelock-3.11.0-py3-none-any.whl", hash = "sha256:f08a52314748335c6460fc8fe40cd5638b85001225db78c2aa01c8c0db83b318"}, - {file = "filelock-3.11.0.tar.gz", hash = "sha256:3618c0da67adcc0506b015fd11ef7faf1b493f0b40d87728e19986b536890c37"}, + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, ] [package.extras] -docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "flake8" version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" optional = false python-versions = ">=3.6.1" files = [ @@ -885,7 +820,6 @@ pyflakes = ">=2.5.0,<2.6.0" name = "flaky" version = "3.7.0" description = "Plugin for nose or pytest that automatically reruns flaky tests." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -895,14 +829,45 @@ files = [ [[package]] name = "fonttools" -version = "4.39.3" +version = "4.39.4" description = "Tools to manipulate font files" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.39.3-py3-none-any.whl", hash = "sha256:64c0c05c337f826183637570ac5ab49ee220eec66cf50248e8df527edfa95aeb"}, - {file = "fonttools-4.39.3.zip", hash = "sha256:9234b9f57b74e31b192c3fc32ef1a40750a8fbc1cd9837a7b7bfc4ca4a5c51d7"}, + {file = "fonttools-4.39.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:34dafe027b9109e9fc305c5239aab372dee97ae7c0d19b7abe02dd6e03acea85"}, + {file = "fonttools-4.39.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e027b1e41a140ff1b23af2d565681ca35447b38205e5934262b12f23bf67f1e"}, + {file = "fonttools-4.39.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ce4c9cb293c9c964c1a566329ef87c773492b2afe8d1a545419646ad5517c7d"}, + {file = "fonttools-4.39.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9718dae7a55d551192936652e6df8f951280fbec3f50870fef851377d40cfcb2"}, + {file = "fonttools-4.39.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1eaaa70e5cfd065bbf5fcc304f474faf46ff61ae681dbe264079f92d91aefdef"}, + {file = "fonttools-4.39.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3d622d62d26595bccb059204932d2aa9b8f6137dde696d80f0b49fd7ad0e1eb1"}, + {file = "fonttools-4.39.4-cp310-cp310-win32.whl", hash = "sha256:55c4ec63f9a36d7ea06014c7317d068a37e1ad10c2f7ef2baa84a4224c1046f4"}, + {file = "fonttools-4.39.4-cp310-cp310-win_amd64.whl", hash = "sha256:992b3c8d3e2ccbc50c39c3a0d6330b0bc7535832afac64c0f6c89b4d68d316be"}, + {file = "fonttools-4.39.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f1a792e70ca030930443b73403a5438d5408d731056df2d474557c50f418f741"}, + {file = "fonttools-4.39.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf96b99ac1fed00ba1dd165e8fb6242fce9aa16588d6cd197b5b984222ed9243"}, + {file = "fonttools-4.39.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb4f825332be26542ba9bc91966fbf9a94799bb71efbde331a0a16d6e5f57642"}, + {file = "fonttools-4.39.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7751ce9d6268ad7a9430da410e9683be62645bb00e0b279bb6de34b622b1f5f"}, + {file = "fonttools-4.39.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f4fd360ed691c972081305ab833e9df88a5aef834c4b972f7fb934804ac73818"}, + {file = "fonttools-4.39.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2bc210ac30f247f945d64b7f0a037ebf5b35e28eaebb73624aa5732b07367155"}, + {file = "fonttools-4.39.4-cp311-cp311-win32.whl", hash = "sha256:c87f19a18f8972597d032c4a5a5a256da63550cf85963faa4f8a655cc1f3fb86"}, + {file = "fonttools-4.39.4-cp311-cp311-win_amd64.whl", hash = "sha256:e948570b813d0e7e21a1724676e65d41a18f11aeac1373656ac72276f66807fa"}, + {file = "fonttools-4.39.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d75cdc3d868e50bb1aa39d0ab4be73d1f89b11c0531548499473f4ddcf27cc87"}, + {file = "fonttools-4.39.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d62508c46b40f4b1dd13a4e9107eecb6338dc72ad04a5cae837f64785893d302"}, + {file = "fonttools-4.39.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3246185ceb73a674c4bbfd87335e7cee8e74977daf67a0ada159580b02aeafed"}, + {file = "fonttools-4.39.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a09805cb0e706b58f87a8e5e7426734c7399a5bd8e0ab69fbc68899a7ec7d28"}, + {file = "fonttools-4.39.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:30d559242a87d3e2ad30888c74e429d3081a49291ab6f2763dcb113f252bc520"}, + {file = "fonttools-4.39.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4cca688c6fcad51ba43a38030e947fd385d308e39766fafd47c5b7b723991ed3"}, + {file = "fonttools-4.39.4-cp38-cp38-win32.whl", hash = "sha256:8edd8ef11bd0603df83e05792b23bebfd5b1eccd2b8bbedfe9f147c5e226750e"}, + {file = "fonttools-4.39.4-cp38-cp38-win_amd64.whl", hash = "sha256:0c8685daa851b2aaf940c734225ed05d6d42f7d260320095afc4578dbdc807cc"}, + {file = "fonttools-4.39.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30156c4e30d0104b28b6862625ffeee450adb8cbf98ad4b9c0c494981d7623e9"}, + {file = "fonttools-4.39.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89462e7ed4c7c338369e69174fc457b401444227ff12604cf6d828d79ce0d9c4"}, + {file = "fonttools-4.39.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23f8f2076aaabdb17467ea36cfaa37cacedd932d65ae5dc4b525dd666aa45a4e"}, + {file = "fonttools-4.39.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6581d950a47980cee84c3f453a366c31e30b5e508d6c9c7ece7b73924e63fe34"}, + {file = "fonttools-4.39.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ab901b45068b585762854534f8a9d25d0144daf0090830cc72f6792e54c62cb"}, + {file = "fonttools-4.39.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eb3e5792ab51bd086f413e34e63820d7ee802a8de383dda44337dc0f675eb56b"}, + {file = "fonttools-4.39.4-cp39-cp39-win32.whl", hash = "sha256:f8a2a5d987aa7b9b67939219c64d3c08e25c53c3199dda64bd6e842bd81d59d8"}, + {file = "fonttools-4.39.4-cp39-cp39-win_amd64.whl", hash = "sha256:5f67494e542db746440254996255577102dc145c921c4022174ea1b67330fc7d"}, + {file = "fonttools-4.39.4-py3-none-any.whl", hash = "sha256:106caf6167c4597556b31a8d9175a3fdc0356fdcd70ab19973c3b0d4c893c461"}, + {file = "fonttools-4.39.4.zip", hash = "sha256:dba8d7cdb8e2bac1b3da28c5ed5960de09e59a2fe7e63bb73f5a59e57b0430d2"}, ] [package.extras] @@ -921,14 +886,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2023.4.0" +version = "2023.5.0" description = "File-system specification" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.4.0-py3-none-any.whl", hash = "sha256:f398de9b49b14e9d84d2c2d11b7b67121bc072fe97b930c4e5668ac3917d8307"}, - {file = "fsspec-2023.4.0.tar.gz", hash = "sha256:bf064186cd8808f0b2f6517273339ba0a0c8fb1b7048991c28bc67f58b8b67cd"}, + {file = "fsspec-2023.5.0-py3-none-any.whl", hash = "sha256:51a4ad01a5bb66fcc58036e288c0d53d3975a0df2a5dc59a93b59bade0391f2a"}, + {file = "fsspec-2023.5.0.tar.gz", hash = "sha256:b3b56e00fb93ea321bc9e5d9cf6f8522a0198b20eb24e02774d329e9c6fb84ce"}, ] [package.extras] @@ -959,7 +923,6 @@ tqdm = ["tqdm"] name = "funcsigs" version = "1.0.2" description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" -category = "dev" optional = false python-versions = "*" files = [ @@ -971,7 +934,6 @@ files = [ name = "ghp-import" version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." -category = "dev" optional = false python-versions = "*" files = [ @@ -989,7 +951,6 @@ dev = ["flake8", "markdown", "twine", "wheel"] name = "gitdb" version = "4.0.10" description = "Git Object Database" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1004,7 +965,6 @@ smmap = ">=3.0.1,<6" name = "gitpython" version = "3.1.31" description = "GitPython is a Python library used to interact with Git repositories" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1019,7 +979,6 @@ gitdb = ">=4.0.1,<5" name = "graphviz" version = "0.20.1" description = "Simple Python interface for Graphviz" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1036,7 +995,6 @@ test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>= name = "hug" version = "2.6.1" description = "A Python framework that makes developing APIs as simple as possible, but no simpler." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1050,14 +1008,13 @@ requests = "*" [[package]] name = "identify" -version = "2.5.22" +version = "2.5.24" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, - {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, + {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, + {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, ] [package.extras] @@ -1067,7 +1024,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1079,7 +1035,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1089,14 +1044,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.2.1" +version = "6.6.0" description = "Read metadata from Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-6.2.1-py3-none-any.whl", hash = "sha256:f65e478a7c2177bd19517a3a15dac094d253446d8690c5f3e71e735a04312374"}, - {file = "importlib_metadata-6.2.1.tar.gz", hash = "sha256:5a66966b39ff1c14ef5b2d60c1d842b0141fefff0f4cc6365b4bc9446c652807"}, + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, ] [package.dependencies] @@ -1111,7 +1065,6 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag name = "importlib-resources" version = "5.12.0" description = "Read resources from Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1130,7 +1083,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1140,14 +1092,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.22.0" +version = "6.23.1" description = "IPython Kernel for Jupyter" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6"}, - {file = "ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421"}, + {file = "ipykernel-6.23.1-py3-none-any.whl", hash = "sha256:77aeffab056c21d16f1edccdc9e5ccbf7d96eb401bd6703610a21be8b068aadc"}, + {file = "ipykernel-6.23.1.tar.gz", hash = "sha256:1aba0ae8453e15e9bc6b24e497ef6840114afcdb832ae597f32137fa19d42a6f"}, ] [package.dependencies] @@ -1156,7 +1107,7 @@ comm = ">=0.1.1" debugpy = ">=1.6.5" ipython = ">=7.23.1" jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" @@ -1176,7 +1127,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" name = "ipython" version = "7.34.0" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1213,7 +1163,6 @@ test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments" name = "ipywidgets" version = "8.0.6" description = "Jupyter interactive widgets" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1235,7 +1184,6 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] name = "ismember" version = "1.0.2" description = "Python package ismember returns array elements that are members of set array." -category = "dev" optional = false python-versions = ">=3" files = [ @@ -1250,7 +1198,6 @@ numpy = "*" name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1268,7 +1215,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jedi" version = "0.18.2" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1288,7 +1234,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1306,7 +1251,6 @@ i18n = ["Babel (>=2.7)"] name = "joblib" version = "1.2.0" description = "Lightweight pipelining with Python functions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1318,7 +1262,6 @@ files = [ name = "jsonpickle" version = "3.0.1" description = "Python library for serializing any arbitrary object graph into JSON" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1335,7 +1278,6 @@ testing-libs = ["simplejson", "ujson"] name = "jsonschema" version = "4.17.3" description = "An implementation of JSON Schema validation for Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1355,19 +1297,18 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jupyter-client" -version = "8.1.0" +version = "8.2.0" description = "Jupyter protocol implementation and client libraries" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.1.0-py3-none-any.whl", hash = "sha256:d5b8e739d7816944be50f81121a109788a3d92732ecf1ad1e4dadebc948818fe"}, - {file = "jupyter_client-8.1.0.tar.gz", hash = "sha256:3fbab64100a0dcac7701b1e0f1a4412f1ccb45546ff2ad9bc4fcbe4e19804811"}, + {file = "jupyter_client-8.2.0-py3-none-any.whl", hash = "sha256:b18219aa695d39e2ad570533e0d71fb7881d35a873051054a84ee2a17c4b7389"}, + {file = "jupyter_client-8.2.0.tar.gz", hash = "sha256:9fe233834edd0e6c0aa5f05ca2ab4bdea1842bfd2d8a932878212fc5301ddaf0"}, ] [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" python-dateutil = ">=2.8.2" pyzmq = ">=23.0" tornado = ">=6.2" @@ -1375,13 +1316,12 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-core" version = "5.3.0" description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1402,7 +1342,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] name = "jupyterlab-pygments" version = "0.2.2" description = "Pygments theme using JupyterLab CSS variables" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1414,7 +1353,6 @@ files = [ name = "jupyterlab-widgets" version = "3.0.7" description = "Jupyter interactive widgets for JupyterLab" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1426,7 +1364,6 @@ files = [ name = "kiwisolver" version = "1.4.4" description = "A fast implementation of the Cassowary constraint solver" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1504,7 +1441,6 @@ files = [ name = "latexcodec" version = "2.0.1" description = "A lexer and codec to work with LaTeX code in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1515,25 +1451,14 @@ files = [ [package.dependencies] six = ">=1.4.1" -[[package]] -name = "lit" -version = "16.0.0" -description = "A Software Testing Tool" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "lit-16.0.0.tar.gz", hash = "sha256:3c4ac372122a1de4a88deb277b956f91b7209420a0bef683b1ab2d2b16dabe11"}, -] - [[package]] name = "livereload" version = "2.6.3" description = "Python LiveReload is an awesome tool for web developers" -category = "dev" optional = false python-versions = "*" files = [ + {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, ] @@ -1545,7 +1470,6 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} name = "mako" version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1565,7 +1489,6 @@ testing = ["pytest"] name = "markdown" version = "3.3.7" description = "Python implementation of Markdown." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1583,7 +1506,6 @@ testing = ["coverage", "pyyaml"] name = "markdown-it-py" version = "2.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1608,7 +1530,6 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1668,7 +1589,6 @@ files = [ name = "matplotlib" version = "3.7.1" description = "Python plotting package" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1731,7 +1651,6 @@ python-dateutil = ">=2.7" name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1746,7 +1665,6 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1758,7 +1676,6 @@ files = [ name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1770,7 +1687,6 @@ files = [ name = "memory-profiler" version = "0.60.0" description = "A module for monitoring memory usage of a python program" -category = "dev" optional = false python-versions = ">=3.4" files = [ @@ -1784,7 +1700,6 @@ psutil = "*" name = "mergedeep" version = "1.3.4" description = "A deep merge function for 🐍." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1796,7 +1711,6 @@ files = [ name = "mistune" version = "2.0.5" description = "A sane Markdown parser with useful plugins and renderers" -category = "dev" optional = false python-versions = "*" files = [ @@ -1808,7 +1722,6 @@ files = [ name = "mkdocs" version = "1.3.1" description = "Project documentation with Markdown." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1835,7 +1748,6 @@ i18n = ["babel (>=2.9.0)"] name = "mkdocs-material" version = "8.5.4" description = "Documentation that simply works" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1856,7 +1768,6 @@ requests = ">=2.26" name = "mkdocs-material-extensions" version = "1.1.1" description = "Extension pack for Python Markdown and MkDocs Material." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1868,7 +1779,6 @@ files = [ name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" -category = "dev" optional = false python-versions = "*" files = [ @@ -1886,7 +1796,6 @@ tests = ["pytest (>=4.6)"] name = "mypy" version = "0.971" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1929,7 +1838,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1939,37 +1847,35 @@ files = [ [[package]] name = "nbclient" -version = "0.7.3" +version = "0.8.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "dev" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.7.3-py3-none-any.whl", hash = "sha256:8fa96f7e36693d5e83408f5e840f113c14a45c279befe609904dbe05dad646d1"}, - {file = "nbclient-0.7.3.tar.gz", hash = "sha256:26e41c6dca4d76701988bc34f64e1bfc2413ae6d368f13d7b5ac407efb08c755"}, + {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, + {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, ] [package.dependencies] jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" nbformat = ">=5.1" -traitlets = ">=5.3" +traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.3.0" +version = "7.4.0" description = "Converting Jupyter Notebooks" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "nbconvert-7.3.0-py3-none-any.whl", hash = "sha256:8983a83d0b083d56b076019f0a319f63bc16af70c9372892b86a0aab0a264b1d"}, - {file = "nbconvert-7.3.0.tar.gz", hash = "sha256:b970a13aba97529c223d805dd0706c2fe04dfc05e250ad4e6f7ae33daf6fede1"}, + {file = "nbconvert-7.4.0-py3-none-any.whl", hash = "sha256:af5064a9db524f9f12f4e8be7f0799524bd5b14c1adea37e34e83c95127cc818"}, + {file = "nbconvert-7.4.0.tar.gz", hash = "sha256:51b6c77b507b177b73f6729dba15676e42c4e92bcb00edc8cc982ee72e7d89d7"}, ] [package.dependencies] @@ -2003,7 +1909,6 @@ webpdf = ["pyppeteer (>=1,<1.1)"] name = "nbformat" version = "5.8.0" description = "The Jupyter Notebook format" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2025,7 +1930,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] name = "nbsphinx" version = "0.8.12" description = "Jupyter Notebook Tools for Sphinx" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2045,7 +1949,6 @@ traitlets = ">=5" name = "nest-asyncio" version = "1.5.6" description = "Patch asyncio to allow nested event loops" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2055,33 +1958,31 @@ files = [ [[package]] name = "networkx" -version = "2.8.8" +version = "3.1" description = "Python package for creating and manipulating graphs and networks" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "networkx-2.8.8-py3-none-any.whl", hash = "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"}, - {file = "networkx-2.8.8.tar.gz", hash = "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e"}, + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, ] [package.extras] -default = ["matplotlib (>=3.4)", "numpy (>=1.19)", "pandas (>=1.3)", "scipy (>=1.8)"] -developer = ["mypy (>=0.982)", "pre-commit (>=2.20)"] -doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-theme (>=0.11)", "sphinx (>=5.2)", "sphinx-gallery (>=0.11)", "texext (>=0.6.6)"] -extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "nodeenv" -version = "1.7.0" +version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] [package.dependencies] @@ -2089,47 +1990,45 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.24.2" +version = "1.24.3" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, - {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, - {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, - {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, - {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, - {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, - {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, - {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, - {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, - {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, - {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] [[package]] name = "numpydoc" version = "1.5.0" description = "Sphinx extension to support docstrings in Numpy format" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2144,180 +2043,10 @@ sphinx = ">=4.2" [package.extras] testing = ["matplotlib", "pytest", "pytest-cov"] -[[package]] -name = "nvidia-cublas-cu11" -version = "11.10.3.66" -description = "CUBLAS native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-cupti-cu11" -version = "11.7.101" -description = "CUDA profiling tools runtime libs." -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_cupti_cu11-11.7.101-py3-none-manylinux1_x86_64.whl", hash = "sha256:e0cfd9854e1f2edaa36ca20d21cd0bdd5dcfca4e3b9e130a082e05b33b6c5895"}, - {file = "nvidia_cuda_cupti_cu11-11.7.101-py3-none-win_amd64.whl", hash = "sha256:7cc5b8f91ae5e1389c3c0ad8866b3b016a175e827ea8f162a672990a402ab2b0"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-nvrtc-cu11" -version = "11.7.99" -description = "NVRTC native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-runtime-cu11" -version = "11.7.99" -description = "CUDA Runtime native Libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cudnn-cu11" -version = "8.5.0.96" -description = "cuDNN runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, - {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cufft-cu11" -version = "10.9.0.58" -description = "CUFFT native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux1_x86_64.whl", hash = "sha256:222f9da70c80384632fd6035e4c3f16762d64ea7a843829cb278f98b3cb7dd81"}, - {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-win_amd64.whl", hash = "sha256:c4d316f17c745ec9c728e30409612eaf77a8404c3733cdf6c9c1569634d1ca03"}, -] - -[[package]] -name = "nvidia-curand-cu11" -version = "10.2.10.91" -description = "CURAND native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_curand_cu11-10.2.10.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:eecb269c970fa599a2660c9232fa46aaccbf90d9170b96c462e13bcb4d129e2c"}, - {file = "nvidia_curand_cu11-10.2.10.91-py3-none-win_amd64.whl", hash = "sha256:f742052af0e1e75523bde18895a9ed016ecf1e5aa0ecddfcc3658fd11a1ff417"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cusolver-cu11" -version = "11.4.0.1" -description = "CUDA solver native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cusolver_cu11-11.4.0.1-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:72fa7261d755ed55c0074960df5904b65e2326f7adce364cbe4945063c1be412"}, - {file = "nvidia_cusolver_cu11-11.4.0.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:700b781bfefd57d161443aff9ace1878584b93e0b2cfef3d6e9296d96febbf99"}, - {file = "nvidia_cusolver_cu11-11.4.0.1-py3-none-win_amd64.whl", hash = "sha256:00f70b256add65f8c1eb3b6a65308795a93e7740f6df9e273eccbba770d370c4"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cusparse-cu11" -version = "11.7.4.91" -description = "CUSPARSE native runtime libraries" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cusparse_cu11-11.7.4.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:a3389de714db63321aa11fbec3919271f415ef19fda58aed7f2ede488c32733d"}, - {file = "nvidia_cusparse_cu11-11.7.4.91-py3-none-win_amd64.whl", hash = "sha256:304a01599534f5186a8ed1c3756879282c72c118bc77dd890dc1ff868cad25b9"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-nccl-cu11" -version = "2.14.3" -description = "NVIDIA Collective Communication Library (NCCL) Runtime" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_nccl_cu11-2.14.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:5e5534257d1284b8e825bc3a182c6f06acd6eb405e9f89d49340e98cd8f136eb"}, -] - -[[package]] -name = "nvidia-nvtx-cu11" -version = "11.7.91" -description = "NVIDIA Tools Extension" -category = "dev" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_nvtx_cu11-11.7.91-py3-none-manylinux1_x86_64.whl", hash = "sha256:b22c64eee426a62fc00952b507d6d29cf62b4c9df7a480fcc417e540e05fd5ac"}, - {file = "nvidia_nvtx_cu11-11.7.91-py3-none-win_amd64.whl", hash = "sha256:dfd7fcb2a91742513027d63a26b757f38dd8b07fecac282c4d132a9d373ff064"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - [[package]] name = "opt-einsum" version = "3.3.0" description = "Optimizing numpys einsum function" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2334,21 +2063,19 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"] [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2396,7 +2123,6 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] name = "pandocfilters" version = "1.5.0" description = "Utilities for writing pandoc filters in python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2408,7 +2134,6 @@ files = [ name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2424,7 +2149,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pastel" version = "0.2.1" description = "Bring colors to your terminal." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2436,7 +2160,6 @@ files = [ name = "pathspec" version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2448,7 +2171,6 @@ files = [ name = "patsy" version = "0.5.3" description = "A Python package for describing statistical models and for building design matrices." -category = "dev" optional = false python-versions = "*" files = [ @@ -2467,7 +2189,6 @@ test = ["pytest", "pytest-cov", "scipy"] name = "pbr" version = "5.11.1" description = "Python Build Reasonableness" -category = "dev" optional = false python-versions = ">=2.6" files = [ @@ -2479,7 +2200,6 @@ files = [ name = "pdocs" version = "1.2.0" description = "A simple program and library to auto generate API documentation for Python modules." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2497,7 +2217,6 @@ Markdown = ">=3.0.0" name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -2512,7 +2231,6 @@ ptyprocess = ">=0.5" name = "pgmpy" version = "0.1.22" description = "A library for Probabilistic Graphical Models" -category = "dev" optional = false python-versions = "*" files = [ @@ -2541,7 +2259,6 @@ tests = ["black", "codecov", "coverage", "mock", "pytest", "pytest-cov", "xdocte name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -2553,7 +2270,6 @@ files = [ name = "pillow" version = "9.5.0" description = "Python Imaging Library (Fork)" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2633,7 +2349,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "pkgutil-resolve-name" version = "1.3.10" description = "Resolve a name to an object." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2643,25 +2358,23 @@ files = [ [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2677,7 +2390,6 @@ testing = ["pytest", "pytest-benchmark"] name = "poethepoet" version = "0.16.5" description = "A task runner that works well with poetry." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2696,7 +2408,6 @@ poetry-plugin = ["poetry (>=1.0,<2.0)"] name = "pooch" version = "1.7.0" description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2718,7 +2429,6 @@ xxhash = ["xxhash (>=1.4.3)"] name = "portray" version = "1.8.0" description = "Your Project with Great Documentation" -category = "dev" optional = false python-versions = ">3.7" files = [ @@ -2739,14 +2449,13 @@ yaspin = ">=0.15.0,<3" [[package]] name = "pre-commit" -version = "3.2.2" +version = "3.3.2" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "pre_commit-3.2.2-py2.py3-none-any.whl", hash = "sha256:0b4210aea813fe81144e87c5a291f09ea66f199f367fa1df41b55e1d26e1e2b4"}, - {file = "pre_commit-3.2.2.tar.gz", hash = "sha256:5b808fcbda4afbccf6d6633a56663fed35b6c2bc08096fd3d47ce197ac351d9d"}, + {file = "pre_commit-3.3.2-py2.py3-none-any.whl", hash = "sha256:8056bc52181efadf4aac792b1f4f255dfd2fb5a350ded7335d251a68561e8cb6"}, + {file = "pre_commit-3.3.2.tar.gz", hash = "sha256:66e37bec2d882de1f17f88075047ef8962581f83c234ac08da21a0c58953d1f0"}, ] [package.dependencies] @@ -2760,7 +2469,6 @@ virtualenv = ">=20.10.0" name = "prompt-toolkit" version = "3.0.38" description = "Library for building powerful interactive command lines in Python" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ @@ -2773,26 +2481,25 @@ wcwidth = "*" [[package]] name = "psutil" -version = "5.9.4" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, - {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, - {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, - {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, - {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, - {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, - {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, - {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, ] [package.extras] @@ -2802,7 +2509,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -2814,7 +2520,6 @@ files = [ name = "pybtex" version = "0.24.0" description = "A BibTeX-compatible bibliography processor in Python" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" files = [ @@ -2834,7 +2539,6 @@ test = ["pytest"] name = "pybtex-docutils" version = "1.0.2" description = "A docutils backend for pybtex." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2850,7 +2554,6 @@ pybtex = ">=0.16" name = "pycodestyle" version = "2.9.1" description = "Python style guide checker" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2862,7 +2565,6 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2874,7 +2576,6 @@ files = [ name = "pydata-sphinx-theme" version = "0.9.0" description = "Bootstrap-based Sphinx theme from the PyData community" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2898,7 +2599,6 @@ test = ["pydata-sphinx-theme[doc]", "pytest"] name = "pydocstyle" version = "6.3.0" description = "Python docstring style checker" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2916,7 +2616,6 @@ toml = ["tomli (>=1.2.3)"] name = "pydot" version = "1.4.2" description = "Python interface to Graphviz's Dot" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2931,7 +2630,6 @@ pyparsing = ">=2.1.4" name = "pyflakes" version = "2.5.0" description = "passive checker of Python programs" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2941,14 +2639,13 @@ files = [ [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -2958,7 +2655,6 @@ plugins = ["importlib-metadata"] name = "pygraphviz" version = "1.10" description = "Python interface to Graphviz" -category = "main" optional = true python-versions = ">=3.8" files = [ @@ -2967,14 +2663,13 @@ files = [ [[package]] name = "pymdown-extensions" -version = "9.11" +version = "10.0.1" description = "Extension pack for Python Markdown." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pymdown_extensions-9.11-py3-none-any.whl", hash = "sha256:a499191d8d869f30339de86fcf072a787e86c42b6f16f280f5c2cf174182b7f3"}, - {file = "pymdown_extensions-9.11.tar.gz", hash = "sha256:f7e86c1d3981f23d9dc43294488ecb54abadd05b0be4bf8f0e15efc90f7853ff"}, + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, ] [package.dependencies] @@ -2985,7 +2680,6 @@ pyyaml = "*" name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" optional = false python-versions = ">=3.6.8" files = [ @@ -3000,7 +2694,6 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pypickle" version = "1.1.0" description = "pypickle is to save and load variables in/from pickle files" -category = "dev" optional = false python-versions = ">=3" files = [ @@ -3012,7 +2705,6 @@ files = [ name = "pyrsistent" version = "0.19.3" description = "Persistent/Functional/Immutable data structures" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3047,14 +2739,13 @@ files = [ [[package]] name = "pytest" -version = "7.3.0" +version = "7.3.1" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.3.0-py3-none-any.whl", hash = "sha256:933051fa1bfbd38a21e73c3960cebdad4cf59483ddba7696c48509727e17f201"}, - {file = "pytest-7.3.0.tar.gz", hash = "sha256:58ecc27ebf0ea643ebfdf7fb1249335da761a00c9f955bcd922349bcb68ee57d"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] @@ -3072,7 +2763,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-cov" version = "3.0.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3091,7 +2781,6 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -3106,7 +2795,6 @@ six = ">=1.5" name = "python-louvain" version = "0.16" description = "Louvain algorithm for community detection" -category = "dev" optional = false python-versions = "*" files = [ @@ -3121,7 +2809,6 @@ numpy = "*" name = "pytz" version = "2023.3" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -3133,7 +2820,6 @@ files = [ name = "pyvis" version = "0.3.2" description = "A Python network graph visualization library" -category = "dev" optional = false python-versions = ">3.6" files = [ @@ -3150,7 +2836,6 @@ networkx = ">=1.11" name = "pywhy-graphs" version = "0.0.0" description = "Causal Graphs for Python" -category = "main" optional = true python-versions = ">=3.8,<3.11" files = [] @@ -3158,7 +2843,7 @@ develop = false [package.dependencies] importlib-resources = {version = "*", markers = "python_version < \"3.9\""} -networkx = "^2.8.8" +networkx = "^3.1" numpy = "^1.21.0" scipy = "^1.8.0" @@ -3168,14 +2853,13 @@ viz = ["pygraphviz"] [package.source] type = "git" url = "https://github.com/py-why/pywhy-graphs.git" -reference = 'main' -resolved_reference = "c1b410746fd5f6f640eb8ddc43d3e61760fd3a36" +reference = "main" +resolved_reference = "2d6f1d3794a9fdc9ff815f07d5388475af1a599f" [[package]] name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "dev" optional = false python-versions = "*" files = [ @@ -3199,7 +2883,6 @@ files = [ name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3210,6 +2893,13 @@ files = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -3242,7 +2932,6 @@ files = [ name = "pyyaml-env-tag" version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3257,7 +2946,6 @@ pyyaml = "*" name = "pyzmq" version = "25.0.2" description = "Python bindings for 0MQ" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3345,21 +3033,20 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "requests" -version = "2.28.2" +version = "2.31.0" description = "Python HTTP for Humans." -category = "dev" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -3367,14 +3054,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rich" -version = "13.3.3" +version = "13.3.5" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -category = "dev" optional = false python-versions = ">=3.7.0" files = [ - {file = "rich-13.3.3-py3-none-any.whl", hash = "sha256:540c7d6d26a1178e8e8b37e9ba44573a3cd1464ff6348b99ee7061b95d1c6333"}, - {file = "rich-13.3.3.tar.gz", hash = "sha256:dc84400a9d842b3a9c5ff74addd8eb798d155f36c1c91303888e0a66850d2a15"}, + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, ] [package.dependencies] @@ -3389,7 +3075,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "scikit-learn" version = "1.2.2" description = "A set of python modules for machine learning and data mining" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3432,7 +3117,6 @@ tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy ( name = "scipy" version = "1.10.1" description = "Fundamental algorithms for scientific computing in Python" -category = "main" optional = false python-versions = "<3.12,>=3.8" files = [ @@ -3469,26 +3153,24 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "setuptools" -version = "67.6.1" +version = "67.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, - {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, + {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, + {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -3500,7 +3182,6 @@ files = [ name = "smmap" version = "5.0.0" description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3512,7 +3193,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -3522,21 +3202,19 @@ files = [ [[package]] name = "soupsieve" -version = "2.4" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] name = "sphinx" version = "5.3.0" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3570,14 +3248,13 @@ test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] [[package]] name = "sphinx-copybutton" -version = "0.5.1" +version = "0.5.2" description = "Add a copy button to each of your code cells." -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "sphinx-copybutton-0.5.1.tar.gz", hash = "sha256:366251e28a6f6041514bfb5439425210418d6c750e98d3a695b73e56866a677a"}, - {file = "sphinx_copybutton-0.5.1-py3-none-any.whl", hash = "sha256:0842851b5955087a7ec7fc870b622cb168618ad408dee42692e9a5c97d071da8"}, + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, ] [package.dependencies] @@ -3591,7 +3268,6 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] name = "sphinx-gallery" version = "0.11.1" description = "A Sphinx extension that builds an HTML version of any Python script and puts it into an examples gallery." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3606,7 +3282,6 @@ sphinx = ">=3" name = "sphinx-issues" version = "3.0.1" description = "A Sphinx extension for linking to your project's issue tracker" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3624,14 +3299,13 @@ tests = ["pytest (>=6.2.0)"] [[package]] name = "sphinx-rtd-theme" -version = "1.2.0" +version = "1.2.1" description = "Read the Docs theme for Sphinx" -category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "sphinx_rtd_theme-1.2.0-py2.py3-none-any.whl", hash = "sha256:f823f7e71890abe0ac6aaa6013361ea2696fc8d3e1fa798f463e82bdb77eeff2"}, - {file = "sphinx_rtd_theme-1.2.0.tar.gz", hash = "sha256:a0d8bd1a2ed52e0b338cbe19c4b2eef3c5e7a048769753dac6a9f059c7b641b8"}, + {file = "sphinx_rtd_theme-1.2.1-py2.py3-none-any.whl", hash = "sha256:2cc9351176cbf91944ce44cefd4fab6c3b76ac53aa9e15d6db45a3229ad7f866"}, + {file = "sphinx_rtd_theme-1.2.1.tar.gz", hash = "sha256:cf9a7dc0352cf179c538891cb28d6fad6391117d4e21c891776ab41dd6c8ff70"}, ] [package.dependencies] @@ -3646,7 +3320,6 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] name = "sphinxcontrib-applehelp" version = "1.0.4" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3662,7 +3335,6 @@ test = ["pytest"] name = "sphinxcontrib-bibtex" version = "2.5.0" description = "Sphinx extension for BibTeX style citations." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3681,7 +3353,6 @@ Sphinx = ">=2.1" name = "sphinxcontrib-devhelp" version = "1.0.2" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -3697,7 +3368,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3713,7 +3383,6 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jquery" version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" -category = "dev" optional = false python-versions = ">=2.7" files = [ @@ -3728,7 +3397,6 @@ Sphinx = ">=1.8" name = "sphinxcontrib-jsmath" version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -3743,7 +3411,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.3" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -3759,7 +3426,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -3773,203 +3439,58 @@ test = ["pytest"] [[package]] name = "statsmodels" -version = "0.13.2" -description = "Statistical computations and models for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "statsmodels-0.13.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e7ca5b7e678c0bb7a24f5c735d58ac104a50eb61b17c484cce0e221a095560f"}, - {file = "statsmodels-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:066a75d5585378b2df972f81a90b9a3da5e567b7d4833300c1597438c1a35e29"}, - {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15f38dfc9c5c091662cb619e12322047368c67aef449c7554d9b324a15f7a94"}, - {file = "statsmodels-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4ccc6b4744613367e8a233bd952c8a838db8f528f9fe033bda25aa13fc7d08"}, - {file = "statsmodels-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:855b1cc2a91ab140b9bcf304b1731705805ce73223bf500b988804968554c0ed"}, - {file = "statsmodels-0.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b69c9af7606325095f7c40c581957bad9f28775653d41537c1ec4cd1b185ff5b"}, - {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab31bac0f72b83bca1f217a12ec6f309a56485a50c4a705fbdd63112213d4da4"}, - {file = "statsmodels-0.13.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d680b910b57fc0aa87472662cdfe09aae0e21db4bdf19ccd6420fd4dffda892"}, - {file = "statsmodels-0.13.2-cp37-cp37m-win32.whl", hash = "sha256:9e9a3f661d372431850d55157d049e079493c97fc06f550d23d8c8c70805cc48"}, - {file = "statsmodels-0.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c9f6326870c095ef688f072cd476b932aff0906d60193eaa08e93ec23b29ca83"}, - {file = "statsmodels-0.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bc050f25f1ba1221efef9ea01b751c60935ad787fcd4259f4ece986f2da9141"}, - {file = "statsmodels-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:426b1c8ea3918d3d27dbfa38f2bee36cabf41d32163e2cbb3adfb0178b24626a"}, - {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b80fac4a63308b1e93fa9dc27a8598930fd5dfd77c850ca077bb850254c6d7"}, - {file = "statsmodels-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ee69ec0e0f79f627245c65f8a495b8581c2ea19084aac63941815feb15dcf3"}, - {file = "statsmodels-0.13.2-cp38-cp38-win32.whl", hash = "sha256:20483cc30e11aa072b30d307bb80470f86a23ae8fffa51439ca54509d7aa9b05"}, - {file = "statsmodels-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:bf43051a92231ccb9de95e4b6d22d3b15e499ee5ee9bff0a20e6b6ad293e34cb"}, - {file = "statsmodels-0.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bf0dfed5f5edb59b5922b295392cd276463b10a5e730f7e57ee4ff2d8e9a87e"}, - {file = "statsmodels-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a403b559c5586dab7ac0fc9e754c737b017c96cce0ddd66ff9094764cdaf293d"}, - {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f23554dd025ea354ce072ba32bfaa840d2b856372e5734290e181d27a1f9e0c"}, - {file = "statsmodels-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815f4df713e3eb6f40ae175c71f2a70d32f9219b5b4d23d4e0faab1171ba93ba"}, - {file = "statsmodels-0.13.2-cp39-cp39-win32.whl", hash = "sha256:461c82ab2265fa8457b96afc23ef3ca19f42eb070436e0241b57e58a38863901"}, - {file = "statsmodels-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:39daab5a8a9332c8ea83d6464d065080c9ba65f236daf6a64aa18f64ef776fad"}, - {file = "statsmodels-0.13.2.tar.gz", hash = "sha256:77dc292c9939c036a476f1770f9d08976b05437daa229928da73231147cde7d4"}, -] - -[package.dependencies] -numpy = ">=1.17" -packaging = ">=21.3" -pandas = ">=0.25" -patsy = ">=0.5.2" -scipy = ">=1.3" - -[package.extras] -build = ["cython (>=0.29.26)"] -develop = ["cython (>=0.29.26)"] -docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] - -[[package]] -name = "statsmodels" -version = "0.13.3" -description = "Statistical computations and models for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "statsmodels-0.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b71bb64c6d4087dd6192eadfad390fbeb4074f676ef34c7e56579cead8c478e7"}, - {file = "statsmodels-0.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:658b634c273c2f287a0086e56a5d6b95ec3ddac991cbb020b34f731e932de0bd"}, - {file = "statsmodels-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab9f63f432889b179967ab645aea7480e28731823a3b99850d7f7a561b624f93"}, - {file = "statsmodels-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f432fb7f54ce5edccc83aa36566653cd04ee35bbbefdf0a2b7bd9c97c5da443"}, - {file = "statsmodels-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:4cd64076c3ad366b10fd4e6f8ca6aeb1e398ec5480bddb65fba8889dd9eb550d"}, - {file = "statsmodels-0.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33f9caff2dbdfef22505678407d2f549b32a4a2729eb8675b60eb2932fc0e883"}, - {file = "statsmodels-0.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:393f6a7ec85f65be9ac1a13be152dd14c65084436c48bcdf94cb21ef0b6cb79c"}, - {file = "statsmodels-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12b56d13d9a2af7a1aadc3fe9f3d3c18a5727a651323d94e7c2047177adfb9ce"}, - {file = "statsmodels-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a61e0652f62b01981d8e857aa77550b42cf316c9d8e569b559869c248e3de834"}, - {file = "statsmodels-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:5368bccd471bb8cef0a8957ba5f2a3e5b5ecc433b0783d9f602039df45c780d3"}, - {file = "statsmodels-0.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ecfb191958de187ba44b93316f4953b8b6588b5f68dcab218f76498a862dd7c"}, - {file = "statsmodels-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea2b481b15e9e501904a1c36efc5f9a202f87529e600a99c364fd7e4598ae88"}, - {file = "statsmodels-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d270a11aac6720a8024e1136ab44036d0878f62995617bb5b9fc5c77ea3d3b8"}, - {file = "statsmodels-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2185ed356823cd1c258c09b790f0c21d2fd49321e82c79f8f6dc546f1c671d7a"}, - {file = "statsmodels-0.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9da39a36d114abcdcf8ebd351ed69229e23cb12b8a607996cb6511fa88e78b4d"}, - {file = "statsmodels-0.13.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3b3a9942d0b462af4c68c3895095d304869cbec9d97f3c268f19a6ba7ba294dc"}, - {file = "statsmodels-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fff0316420bc4f6fbd80dd77eb74f3834fcd0e4ca98ba9611b8a6d41ebbb979"}, - {file = "statsmodels-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352041bc04eaf90232e54a86861a460365ef45f34f58529578487e6f640dadf3"}, - {file = "statsmodels-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:61a0f39848ebacf5560e1539ca0037b8fc25cc9d1d7444bbef5bdc0a3c56087b"}, - {file = "statsmodels-0.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:78cd12b0ee543fa955d2bace18518fc7d2b57f13c65929b54445bf3e54955b08"}, - {file = "statsmodels-0.13.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:afccb80e3ddc969bfb5285f846ac2622861ffe192423087214d60e4c6e40e384"}, - {file = "statsmodels-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3609824e1ced44722bd905564d8ce94df29d24e32a6dd67cc9255932aedcd7b"}, - {file = "statsmodels-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f8e71963a7bd169338fbb1472e34ec85ae4447414ac37bdae5cf6d1ac223bb"}, - {file = "statsmodels-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:000c7a1ce6780834f5fbb63f9ae07a00863a00f602c7c470c942153692f5bbc3"}, - {file = "statsmodels-0.13.3.tar.gz", hash = "sha256:ed71df887334b1d332e71d33215122bdd54494dcb2248606b30bcfa6112e860a"}, -] - -[package.dependencies] -numpy = {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""} -packaging = ">=21.3" -pandas = ">=0.25" -patsy = ">=0.5.2" -scipy = {version = ">=1.3", markers = "(python_version > \"3.7\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""} - -[package.extras] -build = ["cython (>=0.29.32)"] -develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools_scm[toml] (>=7.0.0,<7.1.0)"] -docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] - -[[package]] -name = "statsmodels" -version = "0.13.4" +version = "0.14.0" description = "Statistical computations and models for Python" -category = "dev" optional = false -python-versions = ">=3.7" -files = [ - {file = "statsmodels-0.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41b94ae84f1bf77a0dfadf88d153189735c96218bc72e2b8309bc74393f026bb"}, - {file = "statsmodels-0.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e5d7b16cbfae069effeda91ba713f36300b2afcb1ccd0c6d2617771910d97e0f"}, - {file = "statsmodels-0.13.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b4c90ccf776c6848aca94b7bd7e0d79f4b161baca179a8e2fbc727e2ff613b"}, - {file = "statsmodels-0.13.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef075faad0a4ca9972dca7e2f3ed5538923c97639aa2ef7dcc6bff2398e15a24"}, - {file = "statsmodels-0.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:aa1c157c7fae3f7be5daed308cb928bba320005de51cfb59681bec157a6fca99"}, - {file = "statsmodels-0.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33dc53eda31ac4f0d06ab4b30d4877f8f09d417a1120f0b919b0258b95335f44"}, - {file = "statsmodels-0.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5e37fd711f7436c92c9e24a6fc0cb9f22d87fc0d2ce0f3ee47c11d75983f28a"}, - {file = "statsmodels-0.13.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42683f2a8e51b67bc286a5bf4a573613ef1d1d12d66925367695f36a8667589"}, - {file = "statsmodels-0.13.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a92b3dd2bcd1bef6363c824421c8532f24d7f1a88f55f0d2bc99f6ad4ff2a2"}, - {file = "statsmodels-0.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:98b33318d3366eeb3631a9caf317cc667a36866c4b69d488ffa70dee9af37959"}, - {file = "statsmodels-0.13.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:80a5014be675ed2d5ebc0ef4ccbb7d3dba63bab2d0d4f780b51429d51f3aa2e6"}, - {file = "statsmodels-0.13.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91ec9ebfe4e74b33cc6b2007b3ee53d1fa7ceae90589fcd10de213bbebada2d7"}, - {file = "statsmodels-0.13.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecba51dda0583afcb8b179df380b3e9217bde405e24490d4124ac9b0cd1bf20d"}, - {file = "statsmodels-0.13.4-cp37-cp37m-win_amd64.whl", hash = "sha256:00b41f3d2c2a563d95abc1b948cf54c910e8f4c1bc42696380344708ce6882d9"}, - {file = "statsmodels-0.13.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1818c0f366a50c873e56d8c18925c188c691e0c2cd80ea7cdcd2d3b71788290f"}, - {file = "statsmodels-0.13.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e8be9d7e2d3c7b2dd8162022667e5352c96c3334087c6cb9e352f7dc310cca8e"}, - {file = "statsmodels-0.13.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5916bd3d63370bf53711dea3f309e08d634c72859973a22384ade2a00e6675"}, - {file = "statsmodels-0.13.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bdcd7938c0cadbf4be632407dbc6cf5d9ce3234cfe1c9a37e9cc61d717e6e27"}, - {file = "statsmodels-0.13.4-cp38-cp38-win_amd64.whl", hash = "sha256:b10e712dc51c814db2578530d3d64e982d265312636b520952db63c555b9b4e2"}, - {file = "statsmodels-0.13.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e44542d45d242c24eaf960e95e54cbc83cfeb07922e14c78f2771c4e81ffd6f7"}, - {file = "statsmodels-0.13.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:606e5aa5ca33a5468c5065f4b9dfc249d7f499f262c0d84a514f4346fd97f049"}, - {file = "statsmodels-0.13.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e3e379d3c6ecdcb5065541c36a1b2421f6a27a8c4cbeec488b917631a7d207a"}, - {file = "statsmodels-0.13.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:719a0d175dae8466112d5847adc49e0f76adf4bb735b03ff2b73b97140712d09"}, - {file = "statsmodels-0.13.4-cp39-cp39-win_amd64.whl", hash = "sha256:7d50c9c9ecdf23e1b8339cfa839f689817467c4f4a4ae8561b655faa3dc53f5f"}, - {file = "statsmodels-0.13.4.tar.gz", hash = "sha256:8ee5d1b69f64bc0e9379667455ee3585849d5e6bcd3f3e48e58ba6cadadfead5"}, -] - -[package.dependencies] -numpy = {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""} -packaging = ">=21.3" -pandas = ">=0.25" -patsy = ">=0.5.2" -scipy = {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""} - -[package.extras] -build = ["cython (>=0.29.32)"] -develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools_scm[toml] (>=7.0.0,<7.1.0)"] -docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] - -[[package]] -name = "statsmodels" -version = "0.13.5" -description = "Statistical computations and models for Python" -category = "dev" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "statsmodels-0.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75319fddded9507cc310fc3980e4ae4d64e3ff37b322ad5e203a84f89d85203"}, - {file = "statsmodels-0.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f148920ef27c7ba69a5735724f65de9422c0c8bcef71b50c846b823ceab8840"}, - {file = "statsmodels-0.13.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cc4d3e866bfe0c4f804bca362d0e7e29d24b840aaba8d35a754387e16d2a119"}, - {file = "statsmodels-0.13.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072950d6f7820a6b0bd6a27b2d792a6d6f952a1d2f62f0dcf8dd808799475855"}, - {file = "statsmodels-0.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:159ae9962c61b31dcffe6356d72ae3d074bc597ad9273ec93ae653fe607b8516"}, - {file = "statsmodels-0.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9061c0d5ee4f3038b590afedd527a925e5de27195dc342381bac7675b2c5efe4"}, - {file = "statsmodels-0.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1d89cba5fafc1bf8e75296fdfad0b619de2bfb5e6c132913991d207f3ead675"}, - {file = "statsmodels-0.13.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01bc16e7c66acb30cd3dda6004c43212c758223d1966131226024a5c99ec5a7e"}, - {file = "statsmodels-0.13.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d5cd9ab5de2c7489b890213cba2aec3d6468eaaec547041c2dfcb1e03411f7e"}, - {file = "statsmodels-0.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:857d5c0564a68a7ef77dc2252bb43c994c0699919b4e1f06a9852c2fbb588765"}, - {file = "statsmodels-0.13.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a5348b2757ab31c5c31b498f25eff2ea3c42086bef3d3b88847c25a30bdab9c"}, - {file = "statsmodels-0.13.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b21648e3a8e7514839ba000a48e495cdd8bb55f1b71c608cf314b05541e283b"}, - {file = "statsmodels-0.13.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b829eada6cec07990f5e6820a152af4871c601fd458f76a896fb79ae2114985"}, - {file = "statsmodels-0.13.5-cp37-cp37m-win_amd64.whl", hash = "sha256:872b3a8186ef20f647c7ab5ace512a8fc050148f3c2f366460ab359eec3d9695"}, - {file = "statsmodels-0.13.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc1abb81d24f56425febd5a22bb852a1b98e53b80c4a67f50938f9512f154141"}, - {file = "statsmodels-0.13.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2c46f1b0811a9736db37badeb102c0903f33bec80145ced3aa54df61aee5c2b"}, - {file = "statsmodels-0.13.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:947f79ba9662359f1cfa6e943851f17f72b06e55f4a7c7a2928ed3bc57ed6cb8"}, - {file = "statsmodels-0.13.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:046251c939c51e7632bcc8c6d6f31b8ca0eaffdf726d2498463f8de3735c9a82"}, - {file = "statsmodels-0.13.5-cp38-cp38-win_amd64.whl", hash = "sha256:84f720e8d611ef8f297e6d2ffa7248764e223ef7221a3fc136e47ae089609611"}, - {file = "statsmodels-0.13.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b0d1d24e4adf96ec3c64d9a027dcee2c5d5096bb0dad33b4d91034c0a3c40371"}, - {file = "statsmodels-0.13.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f0e5c9c58fb6cba41db01504ec8dd018c96a95152266b7d5d67e0de98840474"}, - {file = "statsmodels-0.13.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b034aa4b9ad4f4d21abc4dd4841be0809a446db14c7aa5c8a65090aea9f1143"}, - {file = "statsmodels-0.13.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73f97565c29241e839ffcef74fa995afdfe781910ccc27c189e5890193085958"}, - {file = "statsmodels-0.13.5-cp39-cp39-win_amd64.whl", hash = "sha256:2ff331e508f2d1a53d3a188305477f4cf05cd8c52beb6483885eb3d51c8be3ad"}, - {file = "statsmodels-0.13.5.tar.gz", hash = "sha256:593526acae1c0fda0ea6c48439f67c3943094c542fe769f8b90fe9e6c6cc4871"}, + {file = "statsmodels-0.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:16bfe0c96a53b20fa19067e3b6bd2f1d39e30d4891ea0d7bc20734a0ae95942d"}, + {file = "statsmodels-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a6a0a1a06ff79be8aa89c8494b33903442859add133f0dda1daf37c3c71682e"}, + {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77b3cd3a5268ef966a0a08582c591bd29c09c88b4566c892a7c087935234f285"}, + {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c64ebe9cf376cba0c31aed138e15ed179a1d128612dd241cdf299d159e5e882"}, + {file = "statsmodels-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb471f757fc45102a87e5d86e87dc2c8c78b34ad4f203679a46520f1d863b9da"}, + {file = "statsmodels-0.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:582f9e41092e342aaa04920d17cc3f97240e3ee198672f194719b5a3d08657d6"}, + {file = "statsmodels-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ebe885ccaa64b4bc5ad49ac781c246e7a594b491f08ab4cfd5aa456c363a6f6"}, + {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b587ee5d23369a0e881da6e37f78371dce4238cf7638a455db4b633a1a1c62d6"}, + {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef7fa4813c7a73b0d8a0c830250f021c102c71c95e9fe0d6877bcfb56d38b8c"}, + {file = "statsmodels-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:a6ad7b8aadccd4e4dd7f315a07bef1bca41d194eeaf4ec600d20dea02d242fce"}, + {file = "statsmodels-0.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3757542c95247e4ab025291a740efa5da91dc11a05990c033d40fce31c450dc9"}, + {file = "statsmodels-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:de489e3ed315bdba55c9d1554a2e89faa65d212e365ab81bc323fa52681fc60e"}, + {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e290f4718177bffa8823a780f3b882d56dd64ad1c18cfb4bc8b5558f3f5757"}, + {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71054f9dbcead56def14e3c9db6f66f943110fdfb19713caf0eb0f08c1ec03fd"}, + {file = "statsmodels-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:d7fda067837df94e0a614d93d3a38fb6868958d37f7f50afe2a534524f2660cb"}, + {file = "statsmodels-0.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c7724ad573af26139a98393ae64bc318d1b19762b13442d96c7a3e793f495c3"}, + {file = "statsmodels-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b0a135f3bfdeec987e36e3b3b4c53e0bb87a8d91464d2fcc4d169d176f46fdb"}, + {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce28eb1c397dba437ec39b9ab18f2101806f388c7a0cf9cdfd8f09294ad1c799"}, + {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b1c768dd94cc5ba8398121a632b673c625491aa7ed627b82cb4c880a25563f"}, + {file = "statsmodels-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d1e3e10dfbfcd58119ba5a4d3c7d519182b970a2aebaf0b6f539f55ae16058d"}, + {file = "statsmodels-0.14.0.tar.gz", hash = "sha256:6875c7d689e966d948f15eb816ab5616f4928706b180cf470fd5907ab6f647a4"}, ] [package.dependencies] numpy = [ - {version = ">=1.17", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, + {version = ">=1.18", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, {version = ">=1.22.3", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, ] packaging = ">=21.3" -pandas = ">=0.25" +pandas = ">=1.0" patsy = ">=0.5.2" -scipy = {version = ">=1.3", markers = "(python_version > \"3.9\" or platform_system != \"Windows\" or platform_machine != \"x86\") and python_version < \"3.12\""} +scipy = ">=1.4,<1.9.2 || >1.9.2" [package.extras] -build = ["cython (>=0.29.32)"] -develop = ["Jinja2", "colorama", "cython (>=0.29.32)", "cython (>=0.29.32,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] +build = ["cython (>=0.29.26)"] +develop = ["colorama", "cython (>=0.29.26)", "cython (>=0.29.28,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] [[package]] name = "stevedore" -version = "5.0.0" +version = "5.1.0" description = "Manage dynamic plugins for Python applications" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.0.0-py3-none-any.whl", hash = "sha256:bd5a71ff5e5e5f5ea983880e4a1dd1bb47f8feebbb3d95b592398e2f02194771"}, - {file = "stevedore-5.0.0.tar.gz", hash = "sha256:2c428d2338976279e8eb2196f7a94910960d9f7ba2f41f3988511e95ca447021"}, + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, ] [package.dependencies] @@ -3977,14 +3498,13 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "sympy" -version = "1.11.1" +version = "1.12" description = "Computer algebra system (CAS) in Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.11.1-py3-none-any.whl", hash = "sha256:938f984ee2b1e8eae8a07b884c8b7a1146010040fccddc6539c54f401c8f6fcf"}, - {file = "sympy-1.11.1.tar.gz", hash = "sha256:e32380dce63cb7c0108ed525570092fd45168bdae2faa17e528221ef72e88658"}, + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, ] [package.dependencies] @@ -3994,7 +3514,6 @@ mpmath = ">=0.19" name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4007,14 +3526,13 @@ widechars = ["wcwidth"] [[package]] name = "termcolor" -version = "2.2.0" +version = "2.3.0" description = "ANSI color formatting for output in terminal" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, - {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, ] [package.extras] @@ -4024,7 +3542,6 @@ tests = ["pytest", "pytest-cov"] name = "threadpoolctl" version = "3.1.0" description = "threadpoolctl" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -4036,7 +3553,6 @@ files = [ name = "tinycss2" version = "1.2.1" description = "A tiny CSS parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4055,7 +3571,6 @@ test = ["flake8", "isort", "pytest"] name = "tokenize-rt" version = "5.0.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4067,7 +3582,6 @@ files = [ name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -4079,7 +3593,6 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4089,51 +3602,38 @@ files = [ [[package]] name = "torch" -version = "2.0.0" +version = "2.0.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -category = "dev" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.0.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:7a9319a67294ef02459a19738bbfa8727bb5307b822dadd708bc2ccf6c901aca"}, - {file = "torch-2.0.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9f01fe1f6263f31bd04e1757946fd63ad531ae37f28bb2dbf66f5c826ee089f4"}, - {file = "torch-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:527f4ae68df7b8301ee6b1158ca56350282ea633686537b30dbb5d7b4a52622a"}, - {file = "torch-2.0.0-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:ce9b5a49bd513dff7950a5a07d6e26594dd51989cee05ba388b03e8e366fd5d5"}, - {file = "torch-2.0.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:53e1c33c6896583cdb9a583693e22e99266444c4a43392dddc562640d39e542b"}, - {file = "torch-2.0.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:09651bff72e439d004c991f15add0c397c66f98ab36fe60d5514b44e4da722e8"}, - {file = "torch-2.0.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d439aec349c98f12819e8564b8c54008e4613dd4428582af0e6e14c24ca85870"}, - {file = "torch-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:2802f84f021907deee7e9470ed10c0e78af7457ac9a08a6cd7d55adef835fede"}, - {file = "torch-2.0.0-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:01858620f25f25e7a9ec4b547ff38e5e27c92d38ec4ccba9cfbfb31d7071ed9c"}, - {file = "torch-2.0.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:9a2e53b5783ef5896a6af338b36d782f28e83c8ddfc2ac44b67b066d9d76f498"}, - {file = "torch-2.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ec5fff2447663e369682838ff0f82187b4d846057ef4d119a8dea7772a0b17dd"}, - {file = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:11b0384fe3c18c01b8fc5992e70fc519cde65e44c51cc87be1838c1803daf42f"}, - {file = "torch-2.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:e54846aa63855298cfb1195487f032e413e7ac9cbfa978fda32354cc39551475"}, - {file = "torch-2.0.0-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:cc788cbbbbc6eb4c90e52c550efd067586c2693092cf367c135b34893a64ae78"}, - {file = "torch-2.0.0-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:d292640f0fd72b7a31b2a6e3b635eb5065fcbedd4478f9cad1a1e7a9ec861d35"}, - {file = "torch-2.0.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6befaad784004b7af357e3d87fa0863c1f642866291f12a4c2af2de435e8ac5c"}, - {file = "torch-2.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a83b26bd6ae36fbf5fee3d56973d9816e2002e8a3b7d9205531167c28aaa38a7"}, - {file = "torch-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:c7e67195e1c3e33da53954b026e89a8e1ff3bc1aeb9eb32b677172d4a9b5dcbf"}, - {file = "torch-2.0.0-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6e0b97beb037a165669c312591f242382e9109a240e20054d5a5782d9236cad0"}, - {file = "torch-2.0.0-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:297a4919aff1c0f98a58ebe969200f71350a1d4d4f986dbfd60c02ffce780e99"}, + {file = "torch-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ced00b3ba471856b993822508f77c98f48a458623596a4c43136158781e306a"}, + {file = "torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:359bfaad94d1cda02ab775dc1cc386d585712329bb47b8741607ef6ef4950747"}, + {file = "torch-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c84e44d9002182edd859f3400deaa7410f5ec948a519cc7ef512c2f9b34d2c4"}, + {file = "torch-2.0.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:567f84d657edc5582d716900543e6e62353dbe275e61cdc36eda4929e46df9e7"}, + {file = "torch-2.0.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:787b5a78aa7917465e9b96399b883920c88a08f4eb63b5a5d2d1a16e27d2f89b"}, + {file = "torch-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e617b1d0abaf6ced02dbb9486803abfef0d581609b09641b34fa315c9c40766d"}, + {file = "torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6019b1de4978e96daa21d6a3ebb41e88a0b474898fe251fd96189587408873e"}, + {file = "torch-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:dbd68cbd1cd9da32fe5d294dd3411509b3d841baecb780b38b3b7b06c7754434"}, + {file = "torch-2.0.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:ef654427d91600129864644e35deea761fb1fe131710180b952a6f2e2207075e"}, + {file = "torch-2.0.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:25aa43ca80dcdf32f13da04c503ec7afdf8e77e3a0183dd85cd3e53b2842e527"}, + {file = "torch-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ef3ea3d25441d3957348f7e99c7824d33798258a2bf5f0f0277cbcadad2e20d"}, + {file = "torch-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0882243755ff28895e8e6dc6bc26ebcf5aa0911ed81b2a12f241fc4b09075b13"}, + {file = "torch-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:f66aa6b9580a22b04d0af54fcd042f52406a8479e2b6a550e3d9f95963e168c8"}, + {file = "torch-2.0.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:1adb60d369f2650cac8e9a95b1d5758e25d526a34808f7448d0bd599e4ae9072"}, + {file = "torch-2.0.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:1bcffc16b89e296826b33b98db5166f990e3b72654a2b90673e817b16c50e32b"}, + {file = "torch-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e10e1597f2175365285db1b24019eb6f04d53dcd626c735fc502f1e8b6be9875"}, + {file = "torch-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:423e0ae257b756bb45a4b49072046772d1ad0c592265c5080070e0767da4e490"}, + {file = "torch-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8742bdc62946c93f75ff92da00e3803216c6cce9b132fbca69664ca38cfb3e18"}, + {file = "torch-2.0.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c62df99352bd6ee5a5a8d1832452110435d178b5164de450831a3a8cc14dc680"}, + {file = "torch-2.0.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:671a2565e3f63b8fe8e42ae3e36ad249fe5e567435ea27b94edaa672a7d0c416"}, ] [package.dependencies] filelock = "*" jinja2 = "*" networkx = "*" -nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-cupti-cu11 = {version = "11.7.101", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cufft-cu11 = {version = "10.9.0.58", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-curand-cu11 = {version = "10.2.10.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusolver-cu11 = {version = "11.4.0.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cusparse-cu11 = {version = "11.7.4.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nccl-cu11 = {version = "2.14.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-nvtx-cu11 = {version = "11.7.91", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} sympy = "*" -triton = {version = "2.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} typing-extensions = "*" [package.extras] @@ -4141,30 +3641,28 @@ opt-einsum = ["opt-einsum (>=3.3)"] [[package]] name = "tornado" -version = "6.2" +version = "6.3.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "dev" optional = false -python-versions = ">= 3.7" +python-versions = ">= 3.8" files = [ - {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, - {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, - {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, - {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, - {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, - {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, - {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, + {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, + {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, + {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, ] [[package]] name = "tqdm" version = "4.65.0" description = "Fast, Extensible Progress Meter" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4185,7 +3683,6 @@ telegram = ["requests"] name = "traitlets" version = "5.9.0" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4197,90 +3694,58 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] -[[package]] -name = "triton" -version = "2.0.0" -description = "A language and compiler for custom Deep Learning operations" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "triton-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f05a7e64e4ca0565535e3d5d3405d7e49f9d308505bb7773d21fb26a4c008c2"}, - {file = "triton-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4b99ca3c6844066e516658541d876c28a5f6e3a852286bbc97ad57134827fd"}, - {file = "triton-2.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47b4d70dc92fb40af553b4460492c31dc7d3a114a979ffb7a5cdedb7eb546c08"}, - {file = "triton-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fedce6a381901b1547e0e7e1f2546e4f65dca6d91e2d8a7305a2d1f5551895be"}, - {file = "triton-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75834f27926eab6c7f00ce73aaf1ab5bfb9bec6eb57ab7c0bfc0a23fac803b4c"}, - {file = "triton-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0117722f8c2b579cd429e0bee80f7731ae05f63fe8e9414acd9a679885fcbf42"}, - {file = "triton-2.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcd9be5d0c2e45d2b7e6ddc6da20112b6862d69741576f9c3dbaf941d745ecae"}, - {file = "triton-2.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42a0d2c3fc2eab4ba71384f2e785fbfd47aa41ae05fa58bf12cb31dcbd0aeceb"}, - {file = "triton-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c47b72c72693198163ece9d90a721299e4fb3b8e24fd13141e384ad952724f"}, -] - -[package.dependencies] -cmake = "*" -filelock = "*" -lit = "*" -torch = "*" - -[package.extras] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] -tutorials = ["matplotlib", "pandas", "tabulate"] - [[package]] name = "typing-extensions" -version = "4.5.0" +version = "4.6.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.6.1-py3-none-any.whl", hash = "sha256:6bac751f4789b135c43228e72de18637e9a6c29d12777023a703fd1a6858469f"}, + {file = "typing_extensions-4.6.1.tar.gz", hash = "sha256:558bc0c4145f01e6405f4a5fdbd82050bd221b119f4bf72a961a1cfd471349d6"}, ] [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.21.0" +version = "20.23.0" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, - {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, + {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, + {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, ] [package.dependencies] distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -platformdirs = ">=2.4,<4" +filelock = ">=3.11,<4" +platformdirs = ">=3.2,<4" [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] [[package]] name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4320,7 +3785,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "wcwidth" version = "0.2.6" description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -4332,7 +3796,6 @@ files = [ name = "webencodings" version = "0.5.1" description = "Character encoding aliases for legacy web content" -category = "dev" optional = false python-versions = "*" files = [ @@ -4344,33 +3807,16 @@ files = [ name = "wget" version = "3.2" description = "pure python download utility" -category = "dev" optional = false python-versions = "*" files = [ {file = "wget-3.2.zip", hash = "sha256:35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061"}, ] -[[package]] -name = "wheel" -version = "0.40.0" -description = "A built-package format for Python" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)"] - [[package]] name = "widgetsnbextension" version = "4.0.7" description = "Jupyter interactive widgets for Jupyter Notebook" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4382,7 +3828,6 @@ files = [ name = "yaspin" version = "2.3.0" description = "Yet Another Terminal Spinner" -category = "dev" optional = false python-versions = ">=3.7.2,<4.0.0" files = [ @@ -4397,7 +3842,6 @@ termcolor = ">=2.2,<3.0" name = "zipp" version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -4416,4 +3860,4 @@ viz = ["pygraphviz"] [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.11" -content-hash = "42ef6a94d2ed75d315fca3d7e7d9e9d846a42abde2ba0bc514f0a146a0069775" +content-hash = "d62f462c01094ed72c8bcc2bf60595e7455b5b94867e5805a9511ec59b9ef12e" diff --git a/tests/unit_tests/constraint/test_intervene_skeleton.py b/tests/unit_tests/constraint/skeleton/test_intervene_skeleton.py similarity index 100% rename from tests/unit_tests/constraint/test_intervene_skeleton.py rename to tests/unit_tests/constraint/skeleton/test_intervene_skeleton.py diff --git a/tests/unit_tests/constraint/test_skeleton.py b/tests/unit_tests/constraint/skeleton/test_skeleton.py similarity index 98% rename from tests/unit_tests/constraint/test_skeleton.py rename to tests/unit_tests/constraint/skeleton/test_skeleton.py index 51708175f..9218406d8 100644 --- a/tests/unit_tests/constraint/test_skeleton.py +++ b/tests/unit_tests/constraint/skeleton/test_skeleton.py @@ -4,7 +4,7 @@ import pytest import pywhy_graphs -from dodiscover import make_context +from dodiscover import ContextBuilder, make_context from dodiscover.ci import GSquareCITest, Oracle from dodiscover.constraint.skeleton import LearnSemiMarkovianSkeleton, LearnSkeleton from dodiscover.constraint.utils import dummy_sample @@ -261,7 +261,9 @@ def test_learn_skeleton_pds_disabled_first_stage(): ) ci_estimator = Oracle(graph) sample = dummy_sample(graph) - context = make_context().variables(data=sample).build() + context = ( + make_context(create_using=ContextBuilder).variables(data=sample).state_variables({}).build() + ) # generate the expected PAG edge_list = [ diff --git a/tests/unit_tests/constraint/test_fcialg.py b/tests/unit_tests/constraint/test_fcialg.py index ac7f14b32..d93be980a 100644 --- a/tests/unit_tests/constraint/test_fcialg.py +++ b/tests/unit_tests/constraint/test_fcialg.py @@ -610,7 +610,6 @@ def test_fci_spirtes_example(self): context = self.context_func().variables(data=sample).build() alg.fit(sample, context) pag = alg.graph_ - skel_graph = alg.graph_ # generate the expected PAG edge_list = [ @@ -633,7 +632,6 @@ def test_fci_spirtes_example(self): incoming_bidirected_edges=latent_edge_list, incoming_circle_edges=uncertain_edge_list, ) - assert_mixed_edge_graphs_isomorphic(pag, expected_pag) @pytest.mark.parametrize( diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index 2145b73d9..8884ec754 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -43,7 +43,9 @@ def test_rule11(self): # there must only be one kind of edge from F-nodes to its nbrs f_nodes = [("F", 0), ("F", 1)] - self.alg._apply_rule11(G, f_nodes) + context = make_context().observed_variables(G.non_augmented_nodes).build() + context.f_nodes = f_nodes + self.alg._apply_rule11(G, context) for f_node in f_nodes: for nbr in G.neighbors(f_node): if nbr in f_nodes: @@ -72,17 +74,20 @@ def test_rule12(self): symmetric_diff_map = { ("F", 0): ["x"], } + context = make_context().observed_variables(G.non_augmented_nodes).build() + context.f_nodes = f_nodes + context.symmetric_diff_map = symmetric_diff_map # no arrows should be added if we are not operating over a F-node for x, y, z in permutations(G.non_augmented_nodes, 3): - added_arrows = self.alg._apply_rule12(G, x, y, z, f_nodes, symmetric_diff_map) + added_arrows = self.alg._apply_rule12(G, x, y, z, context) assert not added_arrows # no arrows should be added if the conditions of the rule are not met - added_arrows = self.alg._apply_rule12(G, ("F", 0), "x", "z", f_nodes, symmetric_diff_map) + added_arrows = self.alg._apply_rule12(G, ("F", 0), "x", "z", context) assert not added_arrows - added_arrows = self.alg._apply_rule12(G, ("F", 0), "x", "y", f_nodes, symmetric_diff_map) + added_arrows = self.alg._apply_rule12(G, ("F", 0), "x", "y", context) if self.alg.known_intervention_targets: assert added_arrows assert G.has_edge("x", "y", G.directed_edge_name) diff --git a/tests/unit_tests/test_context_builder.py b/tests/unit_tests/test_context_builder.py index 29e50f249..cf327fdf8 100644 --- a/tests/unit_tests/test_context_builder.py +++ b/tests/unit_tests/test_context_builder.py @@ -87,8 +87,8 @@ def test_context_set_errors(): df = make_df() ctx = ctx_builder.variables(data=df).build() - with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): - ctx.init_graph = nx.empty_graph(0) + # with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): + # ctx.init_graph = nx.empty_graph(0) def test_context_set_edges(): @@ -137,8 +137,8 @@ def test_context_set_get(): assert ctx == ctx2 # directly setting fields should not be allowed - with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): - ctx.intervention_targets = ["new"] + # with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): + # ctx.intervention_targets = ["new"] # however, altering via functions is fine ctx.add_state_variable("new", 0) From d1b70c70370cba0effe04e2b7191122add17e68c Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 23 May 2023 23:37:05 -0400 Subject: [PATCH 49/61] Fix all Signed-off-by: Adam Li --- dodiscover/ci/oracle.py | 16 +++++---- dodiscover/constraint/intervention.py | 8 ++--- dodiscover/constraint/skeleton.py | 45 ++++++++++++------------ tests/unit_tests/test_context_builder.py | 13 ++++--- 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/dodiscover/ci/oracle.py b/dodiscover/ci/oracle.py index d33269570..67c5984a9 100644 --- a/dodiscover/ci/oracle.py +++ b/dodiscover/ci/oracle.py @@ -23,7 +23,7 @@ class Oracle(BaseConditionalIndependenceTest): _allow_multivariate_input: bool = True - def __init__(self, graph: Graph, included_nodes: Set[Column] = None) -> None: + def __init__(self, graph: Graph, included_nodes: Optional[Set[Column]] = None) -> None: self.graph = graph self.included_nodes = included_nodes @@ -70,21 +70,23 @@ def test( self._check_test_input(df, x_vars, y_vars, z_covariates) # generate a set of included nodes always in the Z-covariates - if self.included_nodes is None: - included_nodes = set() - else: + included_nodes = set() + if self.included_nodes is not None: included_nodes = ( set(self.included_nodes).difference(set(x_vars)).difference(set(y_vars)) ) - z_covariates = set(z_covariates).union(included_nodes) + if z_covariates is None: + z_covariates_ = set(included_nodes) + else: + z_covariates_ = set(z_covariates).union(included_nodes) # just check for d-separation between x and y given sep_set if isinstance(self.graph, nx.DiGraph): - is_sep = nx.d_separated(self.graph, x_vars, y_vars, z_covariates) + is_sep = nx.d_separated(self.graph, x_vars, y_vars, z_covariates_) else: import pywhy_graphs.networkx as pywhy_nx - is_sep = pywhy_nx.m_separated(self.graph, x_vars, y_vars, z_covariates) + is_sep = pywhy_nx.m_separated(self.graph, x_vars, y_vars, z_covariates_) if is_sep: pvalue = 1 diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index 91f748d8c..59abb766f 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -1,6 +1,6 @@ import logging from itertools import permutations -from typing import Any, Dict, FrozenSet, List, Optional, Tuple +from typing import FrozenSet, List, Optional, Tuple import networkx as nx import pandas as pd @@ -295,9 +295,7 @@ def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingS finished = False # apply R11, which is called R8 in I-FCI / Psi-FCI orienting all F-nodes - f_nodes = self.context_.f_nodes - symmetric_diff_map = self.context_.symmetric_diff_map - _ = self._apply_rule11(graph, f_nodes) + _ = self._apply_rule11(graph, self.context_) while idx < self.max_iter and not finished: change_flag = False @@ -325,7 +323,7 @@ def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingS r10_add, _, _ = self._apply_rule10(graph, a, c, u) # apply R12, called R9 in I-FCI when we know the intervention targets - r12_add = self._apply_rule12(graph, u, a, c, f_nodes, symmetric_diff_map) + r12_add = self._apply_rule12(graph, u, a, c, self.context_) # see if there was a change flag all_flags = [r1_add, r2_add, r3_add, r4_add, r8_add, r9_add, r10_add, r12_add] diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 3dcb9f731..5b9c620a1 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -17,7 +17,6 @@ from .._protocol import EquivalenceClass from ..context import Context -from ..context_builder import InterventionalContextBuilder, make_context from .utils import _find_neighbors_along_path logger = logging.getLogger() @@ -213,7 +212,7 @@ def candidate_cond_sets( # inside the adj_graph possible_variables = sorted( possible_variables, - key=lambda n: context.init_graph.edges[x_var, n]["test_stat"], + key=lambda n: context.init_graph.edges[x_var, n]["test_stat"], # type: ignore reverse=True, ) # type: ignore @@ -279,7 +278,8 @@ class BaseSkeletonLearner: discovery phase multiple times. """ - ci_estimator: Callable[[Column, Column, Set[Column]], Tuple[float, float]] + #: Callable[[Column, Column, Set[Column]], Tuple[float, float]] + ci_estimator: BaseConditionalIndependenceTest alpha: float n_jobs: Optional[int] @@ -298,12 +298,14 @@ class BaseSkeletonLearner: # stopping condition _cont: bool + n_ci_tests: int = 0 + def _learn_skeleton( self, data: pd.DataFrame, context: Context, condsel_method: ConditioningSetSelection, - conditional_test_func: Callable, + conditional_test_func, possible_x_nodes=None, skipped_y_nodes=None, skipped_z_nodes=None, @@ -613,10 +615,10 @@ def _postprocess_ci_test( """ # keep track of the smallest test statistic, meaning the highest pvalue # meaning the "most" independent. keep track of the maximum pvalue as well - if pvalue > context.init_graph.edges[x_var, y_var]["pvalue"]: - context.init_graph.edges[x_var, y_var]["pvalue"] = pvalue - if test_stat < context.init_graph.edges[x_var, y_var]["test_stat"]: - context.init_graph.edges[x_var, y_var]["test_stat"] = test_stat + if pvalue > context.init_graph.edges[x_var, y_var]["pvalue"]: # type: ignore + context.init_graph.edges[x_var, y_var]["pvalue"] = pvalue # type: ignore + if test_stat < context.init_graph.edges[x_var, y_var]["test_stat"]: # type: ignore + context.init_graph.edges[x_var, y_var]["test_stat"] = test_stat # type: ignore def _summarize_xy_comparison( self, x_var: Column, y_var: Column, removed_edge: bool, pvalue: float @@ -789,7 +791,7 @@ def __init__( self.n_ci_tests = 0 self.n_iters_ = 0 - def _initialize_params(self, context) -> None: + def _initialize_params(self, context) -> Context: """Initialize parameters for learning skeleton. Basic parameters that are used by any constraint-based causal discovery algorithms. @@ -843,9 +845,10 @@ def _initialize_params(self, context) -> None: nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") return context - def fit(self, data: pd.DataFrame, context: Context): - # initialize learning parameters - context = self._initialize_params(context) + def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): + if check_input: + # initialize learning parameters + context = self._initialize_params(context) # apply algorithm to learn skeleton self._learn_skeleton( @@ -974,9 +977,7 @@ def __init__( max_cond_set_size: Optional[int] = None, max_combinations: Optional[int] = None, condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, - second_stage_condsel_method: Optional[ - ConditioningSetSelection - ] = ConditioningSetSelection.PDS, + second_stage_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, keep_sorted: bool = False, max_path_length: Optional[int] = None, n_jobs: Optional[int] = None, @@ -1067,7 +1068,7 @@ def _prep_second_stage_skeleton(self, context: Context) -> Context: nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") return context - def _initialize_params(self, context) -> None: + def _initialize_params(self, context) -> Context: if self.max_path_length is None: self.max_path_length_ = np.inf else: @@ -1207,7 +1208,7 @@ def __init__( self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets - def fit(self, data: List[pd.DataFrame], context: Context) -> None: + def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = True) -> None: # ensure data is a list if isinstance(data, pd.DataFrame): data = [data] @@ -1223,8 +1224,10 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: f"while the rest are interventional." ) - orig_context = context.copy() - f_nodes = context.f_nodes + if check_input: + # initialize learning parameters + context = self._initialize_params(context) + f_nodes = set(context.f_nodes) if context.obs_distribution: # it is fine to run the first stage of the FCI algorithm, as this will @@ -1236,9 +1239,6 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: largest_data_idx = np.argmax([len(df) for df in data]) obs_data = data[largest_data_idx] - # initialize learning parameters - self._initialize_params(context) - self.context_ = context.copy() # allow us to query the iteration stage of the causal discovery algorithm # allowing us to run multiple iterations of the skeleton discovery @@ -1346,7 +1346,6 @@ def fit(self, data: List[pd.DataFrame], context: Context) -> None: # R9 allows us to leverage F-nodes being not in separating sets to # augment all separating sets that have non-empty sets with all # F-nodes to keep consistency with the algorithm - f_nodes = set(f_nodes) for x_var, y_vars in self.sep_set_.items(): for y_var in y_vars: sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore diff --git a/tests/unit_tests/test_context_builder.py b/tests/unit_tests/test_context_builder.py index cf327fdf8..6a3ef3e8f 100644 --- a/tests/unit_tests/test_context_builder.py +++ b/tests/unit_tests/test_context_builder.py @@ -82,13 +82,12 @@ def test_build_context_errors(): ctx_builder.variables(observed="x", latents="z", data=df) -def test_context_set_errors(): - ctx_builder = make_context() - df = make_df() - ctx = ctx_builder.variables(data=df).build() - - # with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): - # ctx.init_graph = nx.empty_graph(0) +# def test_context_set_errors(): +# ctx_builder = make_context() +# df = make_df() +# ctx = ctx_builder.variables(data=df).build() +# with pytest.raises(dataclasses.FrozenInstanceError, match="cannot assign to field"): +# ctx.init_graph = nx.empty_graph(0) def test_context_set_edges(): From c3ecb7d3e0ad8867c62a11649854a9f3cdeaa222 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Tue, 23 May 2023 23:45:32 -0400 Subject: [PATCH 50/61] Fix unit tests Signed-off-by: Adam Li --- dodiscover/constraint/skeleton.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 5b9c620a1..66b748d38 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1240,21 +1240,6 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr obs_data = data[largest_data_idx] self.context_ = context.copy() - # allow us to query the iteration stage of the causal discovery algorithm - # allowing us to run multiple iterations of the skeleton discovery - edge_attrs = set( - chain.from_iterable(d.keys() for *_, d in context.init_graph.edges(data=True)) - ) - if self.n_iters_ == 0 and "test_stat" in edge_attrs or "pvalue" in edge_attrs: - raise RuntimeError( - "Running skeleton discovery with adjacency graph " - "with 'test_stat' or 'pvalue' is not supported yet." - ) - - # store the absolute value of test-statistic values and pvalue for - # every single candidate parent-child edge (X -> Y) - nx.set_edge_attributes(context.init_graph, np.inf, "test_stat") - nx.set_edge_attributes(context.init_graph, -1e-5, "pvalue") # first learn the skeleton using only "observational data" self._learn_skeleton( From 29c9c8dd521bb11720fcd1959dbc34fefbdf19d7 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 24 May 2023 00:02:18 -0400 Subject: [PATCH 51/61] Adding multidomain Signed-off-by: Adam Li --- dodiscover/__init__.py | 1 + dodiscover/constraint/skeleton.py | 415 ++++++++++++++++++ dodiscover/datasets/__init__.py | 1 + dodiscover/datasets/base.py | 92 ++++ dodiscover/datasets/linear.py | 46 ++ dodiscover/datasets/multidomain.py | 55 +++ .../skeleton/test_multidomain_skeleton.py | 164 +++++++ tests/unit_tests/datasets/test_linear.py | 16 + 8 files changed, 790 insertions(+) create mode 100644 dodiscover/datasets/__init__.py create mode 100644 dodiscover/datasets/base.py create mode 100644 dodiscover/datasets/linear.py create mode 100644 dodiscover/datasets/multidomain.py create mode 100644 tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py create mode 100644 tests/unit_tests/datasets/test_linear.py diff --git a/dodiscover/__init__.py b/dodiscover/__init__.py index 0b34f2bbf..cd2e49053 100644 --- a/dodiscover/__init__.py +++ b/dodiscover/__init__.py @@ -1,5 +1,6 @@ from . import cd # noqa: F401 from . import ci # noqa: F401 +from . import datasets # noqa: F401 from . import metrics # noqa: F401 from ._protocol import EquivalenceClass, Graph from ._version import __version__ # noqa: F401 diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 66b748d38..d9e27e3d5 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1345,3 +1345,418 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr self.context_ = context.copy() self.adj_graph_ = deepcopy(context.init_graph.copy()) + + +class LearnMultiDomainSkeleton(LearnInterventionSkeleton): + """Learn skeleton of a augmented selection diagram. + + Parameters + ---------- + ci_estimator : BaseConditionalIndependenceTest + The conditional independence test function. + cd_estimator : BaseConditionalDiscrepancyTest + The conditional discrepancy test function. + sep_set : dictionary of dictionary of list of set + Mapping node to other nodes to separating sets of variables. + If ``None``, then an empty dictionary of dictionary of list of sets + will be initialized. + alpha : float, optional + The significance level for the conditional independence test, by default 0.05. + min_cond_set_size : int + The minimum size of the conditioning set, by default 0. The number of variables + used in the conditioning set. + max_cond_set_size : int, optional + Maximum size of the conditioning set, by default None. Used to limit + the computation spent on the algorithm. + max_combinations : int, optional + The maximum number of conditional independence tests to run from the set + of possible conditioning sets. By default None, which means the algorithm will + check all possible conditioning sets. If ``max_combinations=n`` is set, then + for every conditioning set size, 'p', there will be at most 'n' CI tests run + before the conditioning set size 'p' is incremented. For controlling the size + of 'p', see ``min_cond_set_size`` and ``max_cond_set_size``. This can be used + in conjunction with ``keep_sorted`` parameter to only test the "strongest" + dependences. + condsel_method : ConditioningSetSelection + The method to use for testing conditional independence. Must be one of + ('pds', 'pds_path'). See Notes for more details. + keep_sorted : bool + Whether or not to keep the considered conditioning set variables in sorted + dependency order. If True (default) will sort the existing dependencies of each variable + by its dependencies from strongest to weakest (i.e. largest CI test statistic value + to lowest). This can be used in conjunction with ``max_combinations`` parameter + to only test the "strongest" dependences. + max_path_length : int, optional + The maximum length of any discriminating path, or None if unlimited. + n_jobs : int, optional + Number of CPUs to use, by default None. + + Notes + ----- + With interventional data, one may either know the interventional targets from each + experimental distribution dataset, or one may not know the explicit targets. If the + interventional targets are known, then the skeleton discovery algorithm of + :footcite:`Kocaoglu2019characterization` is used. That is we learn the skeleton of a + AugmentedPAG. Otherwise, we will not know the intervention targets, and use the skeleton discovery + algorithm described in :footcite:`Jaber2020causal`. To define intervention targets, one + must use the :class:`dodiscover.InterventionalContextBuilder`. + + References + ---------- + .. footbibliography:: + """ + + def __init__( + self, + ci_estimator: BaseConditionalIndependenceTest, + cd_estimator: BaseConditionalDiscrepancyTest, + sep_set: Optional[SeparatingSet] = None, + alpha: float = 0.05, + min_cond_set_size: int = 0, + max_cond_set_size: Optional[int] = None, + max_combinations: Optional[int] = None, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + second_stage_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, + keep_sorted: bool = False, + max_path_length: Optional[int] = None, + known_intervention_targets: bool = False, + n_jobs: Optional[int] = None, + ) -> None: + super().__init__( + ci_estimator=ci_estimator, + cd_estimator=cd_estimator, + sep_set=sep_set, + alpha=alpha, + min_cond_set_size=min_cond_set_size, + max_cond_set_size=max_cond_set_size, + max_combinations=max_combinations, + condsel_method=condsel_method, + second_stage_condsel_method=second_stage_condsel_method, + keep_sorted=keep_sorted, + max_path_length=max_path_length, + n_jobs=n_jobs, + ) + + self.known_intervention_targets = known_intervention_targets + + def _create_augmented_nodes( + self, domain_ids: List[int], intervention_targets: List[Optional[Set]] + ) -> Tuple[List, Dict, Dict, Dict]: + """Create augmented nodes, sigma map and optionally a symmetric difference map. + + Given a number of distributions attributed to interventions, one constructs + F-nodes to add to the causal graph by: + + - For all pairs of incoming distributions, form a new F-node for every + pair of distributions. Update ``fnode_domain_map`` to map the F-node to + a specific domain. + - If the pairs are from two known target-interventions, then also + add the symmetric difference mapping to ``symmetric_diff_map``, + which maps the F-node to the intervention target. + - If the pairs are from two different domains, then also add the + symmetric difference mapping to ``symmetric_diff_map``, which + maps the F-node to the intervention target for each domain. + + symmetric_diff_map = {F-node/S-node: targets, } + node_domain_map = {F-node/S-node: domains,} + + where ``targets`` is a set of either nodes, or set of indices corresponding + to the input data distributions and ``domains`` is a set of domains, either + a single domain for F-nodes within domain, or a set of two domains for + F-nodes across domains. + + Parameters + ---------- + domain_ids : List[int] + A list of domain ids for each input distribution. + intervention_targets : List[Set] + A list of known intervention targets for each input distribution with ``None`` + representing unknown targets. If the distribution is observational, then + the empty set is used. + + Returns + ------- + augmented_nodes : List + Set of augmented nodes (i.e. F and S nodes). + symmetric_diff_map : Dict[Any, FrozenSet] + Mapping of augmented nodes to intervention targets, or distribution indices represented by the node. + sigma_map : Dict[Any, FrozenSet] + Mapping of augmented nodes to distribution indices represented by the node. + node_domain_map : Dict[Any, FrozenSet] + Mapping of augmented nodes to domains. + """ + unique_domains = np.unique(domain_ids) + + # map augmented nodes to domains + node_domain_map = dict() + symmetric_diff_map = dict() + sigma_map = dict() + s_nodes = [] + f_nodes = [] + + # for each domain, determine if there is observational data + domain_obs = dict() + for domain in unique_domains: + this_domain_idx = np.argwhere(np.array(domain_ids) == domain).squeeze() + + # now check all intervention targets + this_targets = np.atleast_1d(np.array(intervention_targets)[this_domain_idx]) + if set() in this_targets: + domain_obs[domain] = True + else: + domain_obs[domain] = False + + # create S-nodes + for idx, (source, target) in enumerate(combinations(unique_domains, 2)): + s_node = ("S", idx) + node_domain_map[s_node] = {source, target} + s_nodes.append(s_node) + + # create F-nodes + k = 0 + seen_domain_pairs = dict() + seen_distr_pairs = dict() + + for idx, source in enumerate(domain_ids): + for jdx, target in enumerate(domain_ids): + if jdx <= idx: + continue + domain_memo_key = frozenset([source, target]) + distr_memo_key = frozenset([idx, jdx]) + if domain_memo_key in seen_domain_pairs and distr_memo_key in seen_distr_pairs: + continue + seen_domain_pairs[distr_memo_key] = None + seen_distr_pairs[domain_memo_key] = None + + # map each augmented-node to a tuple of distribution indices, or to a set of nodes representing + # the intervention targets + if intervention_targets[idx] is None or intervention_targets[jdx] is None: + targets = frozenset([idx, jdx]) + else: + symm_diff = set(intervention_targets[idx]).symmetric_difference( + set(intervention_targets[jdx]) + ) + targets = frozenset(symm_diff) + + # get the S-node mapped to the obs data if there is observational data + if domain_obs[source] and domain_obs[target] and targets == frozenset(): + s_node = [ + key for key, val in node_domain_map.items() if val == {source, target} + ][0] + sigma_map[s_node] = [idx, jdx] + continue + + # create the F-node + f_node = ("F", k) + f_nodes.append(f_node) + + # map each F-node to a set of domain(s) + node_domain_map[f_node] = {source, target} + + sigma_map[f_node] = [idx, jdx] + symmetric_diff_map[f_node] = targets + + k += 1 + augmented_nodes = set(s_nodes).union(set(f_nodes)) + return augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map + + def fit( + self, + data: List[pd.DataFrame], + context: Context, + domain_indices: List[int], + intervention_targets: List[Optional[Set]], + check_input: bool = True, + debug: bool = False, + ) -> None: + """Fit data and context. + + Each dataframe in ``data`` corresponds to a different distribution of data + from a domain and specific intervention target. + + Parameters + ---------- + data : List[pd.DataFrame] + List of dataframes corresponding to different distributions of data. + context : Context + Context object. + domain_indices : List[int] + The domain indices of each dataframe in ``data``. + intervention_targets : List[Column] + The intervention targets of each dataframe in ``data``. Is ``None`` if + ``data`` is observational, or ``unknown`` if target is unknown. + """ + # ensure data is a list + if isinstance(data, pd.DataFrame): + data = [data] + + # error-check the datasets passed in match the intervention contexts + # if len(data) != context.num_distributions: + # raise RuntimeError( + # f"The number of datasets does not match the number of interventions. " + # f"You passed in {len(data)} different datasets, whereas " + # f"there are {len(context.intervention_targets)} different interventions " + # f"specified and {context.num_distributions} distributions assumed. " + # f"It is assumed that the first dataset is observational, " + # f"while the rest are interventional." + # ) + + # pick a domain and distribution with the largest amount of data + largest_data_idx = np.argmax([len(df) for df in data]) + obs_data = data[largest_data_idx] + self.context_ = context.copy() + + # initialize learning parameters + if check_input: + context = self._initialize_params(context) + + ( + augmented_nodes, + symmetric_diff_map, + sigma_map, + node_domain_map, + ) = self._create_augmented_nodes( + domain_ids=domain_indices, intervention_targets=intervention_targets + ) + + # initialize the augmented graph + causal_nodes = context.observed_variables + for augmented_node in augmented_nodes: + for node in causal_nodes: + context.init_graph.add_edge(augmented_node, node) + + # extract F and S-nodes + s_nodes = [] + f_nodes = [] + for node in augmented_nodes: + if node[0] == "S": + s_nodes.append(node) + elif node[0] == 'F': + f_nodes.append(node) + + n_domains = len(np.unique(domain_indices)) + context.augmented_nodes = augmented_nodes + context.symmetric_diff_map = symmetric_diff_map + context.sigma_map = sigma_map + context.node_domain_map = node_domain_map + context.s_nodes = s_nodes + context.f_nodes = f_nodes + skip_nodes = augmented_nodes + + # first learn the skeleton using only "observational data" + # initially learn the skeleton without using PDS information + # apply algorithm to learn skeleton + self._fit(obs_data, context, list(causal_nodes), augmented_nodes, augmented_nodes, debug=debug) + context = self._prep_second_stage_skeleton(context) + + # loop through each domain to learn the F-node skeleton + seen_domain_pairs = set() + for idx, source in enumerate(range(1, n_domains + 1)): + for jdx, target in enumerate(range(1, n_domains + 1)): + if idx == jdx: + continue + if frozenset([source, target]) in seen_domain_pairs: + continue + seen_domain_pairs.add(frozenset([source, target])) + + # get augmented nodes for source and target + # analyze F-nodes between source and target + s_node = None + for node in s_nodes: + if node_domain_map[node] == {source, target}: + s_node = node + break + if s_node is None: + continue + raise RuntimeError('wtf') + this_f_nodes = [ + node + for node in f_nodes + if node_domain_map[node] == {source, target} and node in symmetric_diff_map + ] + if debug: + print(f'Trying to learn skeleton for {source} and {target} to remove F-nodes: {this_f_nodes} ' + f'grouped with S-node: {s_node}') + self._learn_skeleton( + data=data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.cd_estimator, + possible_x_nodes=this_f_nodes, + skipped_y_nodes=skip_nodes, + skipped_z_nodes=skip_nodes, + cross_distribution_test=True, + group_with_snode=s_node, + debug=debug, + ) + + # this is only possible if there is explicitly observational data between + # the two domains + # analyze S-nodes between source and target + this_s_nodes = [ + node + for node in augmented_nodes + if node_domain_map[node] == {source, target} + and node not in symmetric_diff_map + and node in sigma_map + ] + if debug: + print(this_f_nodes) + print(this_s_nodes) + print(symmetric_diff_map) + print(sigma_map) + if this_s_nodes: + if debug: + print(f'Trying to learn skeleton for {source} and {target} to remove S-nodes: {this_s_nodes}') + self._learn_skeleton( + data=data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.cd_estimator, + possible_x_nodes=list(this_s_nodes), + skipped_y_nodes=skip_nodes, + skipped_z_nodes=skip_nodes, + cross_distribution_test=True, + ) + + # analyze F-nodes only within the 'source' domain + source_fnodes = [node for node in augmented_nodes if node_domain_map[node] == {source}] + if debug: + print(f'Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}') + # apply algorithm to learn skeleton among the F-node subgraph within a single domain + self._learn_skeleton( + data=data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.cd_estimator, + possible_x_nodes=source_fnodes, + skipped_y_nodes=skip_nodes, + skipped_z_nodes=skip_nodes, + cross_distribution_test=True, + ) + + # prepare the context object for the second stage of learning + # all separating sets are either: + # i) augmented with all F-nodes, or + # ii) augmented with all F-nodes except intervention index 'i' + # R9 allows us to leverage F-nodes being not in separating sets to + # augment all separating sets that have non-empty sets with all + # F-nodes to keep consistency with the algorithm + for x_var, y_vars in self.sep_set_.items(): + for y_var in y_vars: + sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + if len(sep_sets) > 0: + for idx in range(len(sep_sets)): + if x_var in augmented_nodes: + self.sep_set_[x_var][y_var][idx].update( + augmented_nodes.difference({x_var}) + ) + elif y_var in augmented_nodes: + self.sep_set_[x_var][y_var][idx].update( + augmented_nodes.difference({y_var}) + ) + else: + self.sep_set_[x_var][y_var][idx].update(augmented_nodes) + + self.context_ = context.copy() + self.adj_graph_ = deepcopy(context.init_graph.copy()) diff --git a/dodiscover/datasets/__init__.py b/dodiscover/datasets/__init__.py new file mode 100644 index 000000000..d2077077c --- /dev/null +++ b/dodiscover/datasets/__init__.py @@ -0,0 +1 @@ +from .base import sample_from_graph diff --git a/dodiscover/datasets/base.py b/dodiscover/datasets/base.py new file mode 100644 index 000000000..bb1062294 --- /dev/null +++ b/dodiscover/datasets/base.py @@ -0,0 +1,92 @@ +from typing import Optional + +import networkx as nx +import numpy as np +import pandas as pd +import pywhy_graphs as pgraphs +from joblib import Parallel, delayed + +from . import linear, multidomain + + +def sample_from_graph( + G: nx.DiGraph, + n_samples: int = 1000, + n_jobs: Optional[int] = None, + random_state=None, + sample_func="linear", + **sample_kwargs, +): + """Sample a dataset from a linear Gaussian graph. + + Assumes the graph only consists of directed edges. It is on the roadmap to + implement support for bidirected edges. + + Parameters + ---------- + G : Graph + A linear DAG from which to sample. Must have been set up with + :func:`pywhy_graphs.functional.make_graph_linear_gaussian`. + n_samples : int, optional + Number of samples to generate, by default 1000. + n_jobs : Optional[int], optional + Number of jobs to run in parallel, by default None. + random_state : int, optional + Random seed, by default None. + sample_func : str, optional + The sampling function to use. Can be one of 'linear' or 'multidomain'. + Defaults to 'linear'. + **sample_kwargs + Keyword arguments to pass to the sampling function. + + Returns + ------- + data : pd.DataFrame of shape (n_samples, n_nodes) + A pandas DataFrame with the iid samples. + """ + if hasattr(G, "get_graphs"): + directed_G = G.get_graphs("directed") + else: + directed_G = G + + if isinstance(G, nx.DiGraph): + G = pgraphs.AugmentedGraph(incoming_directed_edges=G) + + if not nx.is_directed_acyclic_graph(directed_G): + raise ValueError("The input graph must be a DAG.") + if not G.graph.get("linear_gaussian", True): + raise ValueError("The input graph must be a linear Gaussian graph.") + + rng = np.random.default_rng(random_state) + + # Create list of topologically sorted nodes + top_sort_idx = list(nx.topological_sort(directed_G)) + + if hasattr(G, "augmented_nodes"): + top_sort_idx = [node for node in top_sort_idx if node not in G.augmented_nodes] + ignored_nodes = G.augmented_nodes + else: + ignored_nodes = None + + if sample_func == "linear": + sample_func = linear._sample_from_graph + elif sample_func == "multidomain": + sample_func = multidomain._sample_from_graph + + # Sample from graph + if n_jobs == 1: + data = [] + for _ in range(n_samples): + node_samples = sample_func( + G, top_sort_idx, rng, ignored_nodes=ignored_nodes, **sample_kwargs + ) + data.append(node_samples) + data = pd.DataFrame.from_records(data) + else: + out = Parallel(n_jobs=n_jobs, verbose=0)( + delayed(sample_func)(G, top_sort_idx, rng, ignored_nodes=ignored_nodes, **sample_kwargs) + for _ in range(n_samples) + ) + data = pd.DataFrame.from_records(out) + + return data diff --git a/dodiscover/datasets/linear.py b/dodiscover/datasets/linear.py new file mode 100644 index 000000000..f3c37d8fb --- /dev/null +++ b/dodiscover/datasets/linear.py @@ -0,0 +1,46 @@ +from typing import Dict + +import networkx as nx +import numpy as np + + +def _sample_from_graph( + G, + top_sort_idx, + rng: np.random.Generator, + ignored_nodes=None, +) -> Dict: + """Private function to sample a single iid sample from a graph for all nodes. + + Returns + ------- + nodes_sample : dict + The sample per node. + """ + nodes_sample = dict() + + for node_idx in top_sort_idx: + # get all parents + parents = G.parents(node_idx) + + # sample noise + mean = G.nodes[node_idx]["gaussian_noise_function"]["mean"] + std = G.nodes[node_idx]["gaussian_noise_function"]["std"] + node_noise = rng.normal(loc=mean, scale=std) + node_sample = 0 + + # sample weight and edge function for each parent + for parent in parents: + if parent in ignored_nodes or parent == node_idx: + continue + if len(G.nodes[node_idx]["parent_functions"]) == 0: + continue + + weight = G.nodes[node_idx]["parent_functions"][parent]["weight"] + func = G.nodes[node_idx]["parent_functions"][parent]["func"] + node_sample += weight * func(nodes_sample[parent]) + + # set the node attribute "functions" to hold the weight and function wrt each parent + node_sample += node_noise + nodes_sample[node_idx] = node_sample + return nodes_sample diff --git a/dodiscover/datasets/multidomain.py b/dodiscover/datasets/multidomain.py new file mode 100644 index 000000000..da7b7e726 --- /dev/null +++ b/dodiscover/datasets/multidomain.py @@ -0,0 +1,55 @@ +from typing import Dict + +import networkx as nx +import numpy as np + + +def _sample_from_graph( + G, + top_sort_idx, + rng: np.random.Generator, + domain_id: int, + ignored_nodes=None, +) -> Dict: + """Private function to sample a single iid sample from a graph for all nodes. + + Returns + ------- + nodes_sample : dict + The sample per node. + """ + nodes_sample = dict() + + for node_idx in top_sort_idx: + # get all parents + parents = G.parents(node_idx) + + # sample noise + if "domain_gaussian_noise_function" in G.nodes[node_idx]: + mean = G.nodes[node_idx]["domain_gaussian_noise_function"][domain_id]["mean"] + std = G.nodes[node_idx]["domain_gaussian_noise_function"][domain_id]["std"] + else: + mean = G.nodes[node_idx]["gaussian_noise_function"]["mean"] + std = G.nodes[node_idx]["gaussian_noise_function"]["std"] + node_noise = rng.normal(loc=mean, scale=std) + node_sample = 0 + + # sample weight and edge function for each parent + for parent in parents: + if parent in ignored_nodes or parent == node_idx: + continue + if len(G.nodes[node_idx]["parent_functions"]) == 0: + continue + + weight = G.nodes[node_idx]["parent_functions"][parent]["weight"] + func = G.nodes[node_idx]["parent_functions"][parent]["func"] + try: + node_sample += weight * func(nodes_sample[parent]) + except Exception as e: + print(node_idx, list(parents)) + raise e + + # set the node attribute "functions" to hold the weight and function wrt each parent + node_sample += node_noise + nodes_sample[node_idx] = node_sample + return nodes_sample diff --git a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py new file mode 100644 index 000000000..c63c8bd6f --- /dev/null +++ b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py @@ -0,0 +1,164 @@ +import networkx as nx +import pywhy_graphs as pgraphs + +from dodiscover import ContextBuilder, make_context +from dodiscover.cd import KernelCDTest +from dodiscover.ci import FisherZCITest, Oracle +from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton +from dodiscover.constraint.utils import dummy_sample +from dodiscover.datasets import linear + + +def basic_multidomain_augmented_graph(): + # Create the following graph: + # F_x -> x -> y -> z + # S_{1,2} -> y + # x <--> y + directed_edges = [ + ("x", "y"), + ("y", "z"), + ] + bidirected_edges = [("x", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + graph.add_f_node({"x"}) + graph.add_f_node({"x"}, require_unique=False) + graph.add_s_node((1, 2), {"y"}) + + return graph + + +def test_basic_multidomain_fsnode_skeleton(): + """Test basic skeleton learning with a multidomain f-node and s-node.""" + graph = basic_multidomain_augmented_graph() + non_f_graph = graph.subgraph(graph.non_augmented_nodes) + + oracle = Oracle(graph, graph.augmented_nodes) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + (("F", 1), "x"), + (("F", 1), "y"), + (("S", 0), "y"), + ("x", "y"), + ("y", "z"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + + # define the learner and the context + learner = LearnMultiDomainSkeleton(ci_estimator=oracle, cd_estimator=oracle) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + domain_indices = [1, 1, 2] + intervention_targets = [set(), {"x"}, set()] + + context = ( + make_context(create_using=ContextBuilder).variables(data=data[0]) + # .num_distributions(2) + # .intervention_targets([("x")]) + .build() + ) + learner.fit(data, context, domain_indices, intervention_targets) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.observed_variables + ) + obs_expected_skeleton = obs_expected_skeleton.subgraph(context.observed_variables) + sep_set = learner.sep_set_ + + # check the separating sets + assert sep_set["x"]["z"] == [{"y", ("F", 0), ("S", 0), ("F", 1)}] + + # check the skeleton after obs data + print(obs_expected_skeleton.edges()) + print(obs_skel_graph.edges()) + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + + # check the skeleton after intervention + print(skel_graph.edges()) + print(expected_skeleton.edges()) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + +def test_basic_multidomain_fsnode_skeleton_with_lindata(): + seed = 1234 + n_samples = 1000 + aug_graph = basic_multidomain_augmented_graph() + graph = aug_graph.subgraph(aug_graph.non_augmented_nodes) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + (("F", 1), "x"), + (("F", 1), "y"), + (("S", 0), "y"), + ("x", "y"), + ("y", "z"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + + # define functional relationships of the causal diagram + graph = pgraphs.functional.make_graph_linear_gaussian(graph, random_state=seed) + + datasets = [] + domain_ids = [] + intervention_sets = [] + + # now for each F-node, apply a linear additive intervention + for f_node, targets in aug_graph.graph["F-nodes"].items(): + new_graph = pgraphs.functional.apply_soft_intervention( + graph.copy(), targets, random_state=seed + ) + + # generate dataset + data = linear.sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) + + datasets.append(data) + intervention_sets.append(targets) + domain_ids.append(1) + + # now for each S-node, apply a linear additive intervention + for s_node, targets in aug_graph.graph["S-nodes"].items(): + new_graph = pgraphs.functional.apply_soft_intervention( + graph.copy(), targets, random_state=seed + ) + + # generate dataset + data = linear.sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) + + datasets.append(data) + intervention_sets.append(targets) + domain_ids.append(2) + + learner = LearnMultiDomainSkeleton(ci_estimator=FisherZCITest(), cd_estimator=KernelCDTest()) + + context = make_context(create_using=ContextBuilder).variables(data=datasets[0]).build() + learner.fit(data, context, domain_ids, intervention_sets) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.observed_variables + ) + obs_expected_skeleton = obs_expected_skeleton.subgraph(context.observed_variables) + sep_set = learner.sep_set_ + + # check the separating sets + assert sep_set["x"]["z"] == [{"y", ("F", 0), ("S", 0), ("F", 1)}] + + # check the skeleton after obs data + print(obs_expected_skeleton.edges()) + print(obs_skel_graph.edges()) + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + + # check the skeleton after intervention + print(skel_graph.edges()) + print(expected_skeleton.edges()) + assert nx.is_isomorphic(expected_skeleton, skel_graph) \ No newline at end of file diff --git a/tests/unit_tests/datasets/test_linear.py b/tests/unit_tests/datasets/test_linear.py new file mode 100644 index 000000000..1bd6100d0 --- /dev/null +++ b/tests/unit_tests/datasets/test_linear.py @@ -0,0 +1,16 @@ +import networkx as nx +import pytest +from pywhy_graphs.simulate import simulate_random_er_dag + +from dodiscover.datasets import make_linear_gaussian + + +@pytest.mark.parametrize("n_jobs", [None, -1]) +def test_make_linear_gaussian_from_graph_n_jobs(n_jobs): + G = simulate_random_er_dag(n_nodes=5, seed=12345, ensure_acyclic=True) + + G, data = make_linear_gaussian(G, random_state=12345, n_jobs=n_jobs) + + assert set(data.columns) == set(G.nodes) + assert all(key in nx.get_node_attributes(G, "parent_functions") for key in G.nodes) + assert all(key in nx.get_node_attributes(G, "gaussian_noise_function") for key in G.nodes) From 10d53314f503d7b9ae88518dff260ba4b3c4aa66 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 24 May 2023 00:05:41 -0400 Subject: [PATCH 52/61] Now merging in Signed-off-by: Adam Li --- .../basic-multidomain-chain-model.ipynb | 1873 +++++++++++++++++ .../multi-domain/example-sfci-algo.ipynb | 1754 +++++++++++++++ .../multi-domain/random-graph-analysis.ipynb | 807 +++++++ dodiscover/constraint/sfcialg.py | 231 ++ 4 files changed, 4665 insertions(+) create mode 100644 doc/tutorials/multi-domain/basic-multidomain-chain-model.ipynb create mode 100644 doc/tutorials/multi-domain/example-sfci-algo.ipynb create mode 100644 doc/tutorials/multi-domain/random-graph-analysis.ipynb create mode 100644 dodiscover/constraint/sfcialg.py diff --git a/doc/tutorials/multi-domain/basic-multidomain-chain-model.ipynb b/doc/tutorials/multi-domain/basic-multidomain-chain-model.ipynb new file mode 100644 index 000000000..941770305 --- /dev/null +++ b/doc/tutorials/multi-domain/basic-multidomain-chain-model.ipynb @@ -0,0 +1,1873 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "743325c9-7fe4-403e-92cc-68fafecf4cad", + "metadata": {}, + "source": [ + "# Multi-domain 2-Chain Graph Analysis with I-FCI vs $\\Psi$-FCI\n", + "\n", + "Let there be two domains to consider in our following example. For concreteness, let us follow the story of the paper, and say these are two different laboratory settings, where two proteins are sequenced. We wish to discover the cause-and-effect relationship between these two proteins. \n", + "\n", + "Here, we analyze the 2-chain selection diagram: $X \\leftarrow Y \\leftarrow S_0^{1,2}$ with two interventional distributions that occur over domains 1 and 2. $S_0^{1,2}$ is an S-node representing a possible difference in mechanism for node Y between domains 1 and 2.\n", + "\n", + "- X is protein 1\n", + "- Y is protein 2\n", + "- $S_0^{1,2}$ represents a change in laboratory settings that induce changes in the protein 2 expression levels\n", + "\n", + "Experiments are done by perturbing protein 1 (X) and then measuring the protein expression levels of X and Y." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5c8d3bd1-e720-43e3-b2f3-82eef12c14ea", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%load_ext lab_black" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "476e1a05-5c57-4c04-a4ad-22e835df8290", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display_svg" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "bba338b9-78f2-498a-815b-70c1d348d174", + "metadata": {}, + "outputs": [], + "source": [ + "from pprint import pprint\n", + "import numpy as np\n", + "import scipy\n", + "import pandas as pd\n", + "import collections\n", + "from itertools import combinations\n", + "import networkx as nx\n", + "import pywhy_graphs as pgraphs\n", + "from pywhy_graphs.functional import (\n", + " make_graph_linear_gaussian,\n", + " make_graph_multidomain,\n", + " set_node_attributes_with_G,\n", + " apply_linear_soft_intervention,\n", + " sample_multidomain_lin_functions,\n", + ")\n", + "from pywhy_graphs.viz import draw\n", + "from pywhy_graphs.simulate import simulate_random_er_dag\n", + "\n", + "from dodiscover.cd import KernelCDTest\n", + "from dodiscover.ci import KernelCITest, FisherZCITest, Oracle\n", + "from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton\n", + "from dodiscover.constraint.utils import dummy_sample\n", + "from dodiscover.datasets import sample_from_graph\n", + "\n", + "from dodiscover import (\n", + " SFCI,\n", + " PsiFCI,\n", + " FCI,\n", + " Context,\n", + " make_context,\n", + " InterventionalContextBuilder,\n", + ")\n", + "from dodiscover.metrics import structure_hamming_dist, confusion_matrix_networks\n", + "\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c71ac0fe-354e-4adc-a3a1-7fd21c255eb4", + "metadata": {}, + "outputs": [], + "source": [ + "seed = 12345" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3cb5db22-3ce1-490f-b44e-f136e53d8247", + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 0.05" + ] + }, + { + "cell_type": "markdown", + "id": "75383db8-5cc7-4e6e-8c8e-b395a43f6690", + "metadata": { + "tags": [] + }, + "source": [ + "## Setup Linear Functional Graph" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "529a4be3-faa7-4460-bdab-bcb59100fcdc", + "metadata": {}, + "outputs": [], + "source": [ + "node_mean_lims = [-1, 1]\n", + "node_std_lims = [0.5, 1.5]\n", + "edge_functions = [lambda x: x, lambda x: x**2]\n", + "edge_weight_lims = [-1, 1]\n", + "\n", + "n_domains = 2\n", + "n_samples = 5000" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "689a27e4-f21d-4572-a4b8-34b3c4c626ad", + "metadata": {}, + "outputs": [], + "source": [ + "directed_edges = [(\"y\", \"x\")]\n", + "\n", + "graph = pgraphs.AugmentedGraph(\n", + " incoming_directed_edges=directed_edges,\n", + ")\n", + "\n", + "int_graph = graph.copy()\n", + "int_graph.add_f_node({\"x\"}, domain=1)\n", + "\n", + "aug_graph = int_graph.copy()\n", + "aug_graph.add_f_node({\"x\"}, domain=2, require_unique=False)\n", + "aug_graph.add_s_node((1, 2), {\"y\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5f9cfa6f-bfab-43cc-9677-c911ab6b595e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Causal Diagram\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y->x\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = draw(graph, name=\"Causal Diagram\")\n", + "G.render(\n", + " outfile=\"./two-chain-single-domain.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(G)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cb5ebc4a-16ad-4d6c-9003-b95d492a1396", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Augmented Causal Diagram\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = draw(int_graph, name=\"Augmented Causal Diagram\")\n", + "G.render(\n", + " outfile=\"./two-chain-single-domain-with-int.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(G)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "36bd044f-a331-403d-91bc-e1be604e85d0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Augmented Selection Diagram\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)\n", + "\n", + "('S', 0)\n", + "\n", + "\n", + "\n", + "('S', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", + "\n", + "\n", + "\n", + "('F', 1)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = draw(aug_graph, name=\"Augmented Selection Diagram\")\n", + "G.render(\n", + " outfile=\"./two-chain-multi-domain-with-int.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(G)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3f36b57d-66dc-428f-a6db-0c62dc15caba", + "metadata": {}, + "outputs": [], + "source": [ + "# convert graph to linear functional graph\n", + "lin_graph = make_graph_linear_gaussian(\n", + " graph,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "7eb41b8d-f4fc-4c1f-86ea-b0e8961abe3f", + "metadata": {}, + "outputs": [], + "source": [ + "# convert graph to linear functional graph\n", + "lin_graph = make_graph_linear_gaussian(\n", + " graph,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "aca6ed01-f47e-41d5-9c49-486115c3685a", + "metadata": {}, + "outputs": [], + "source": [ + "# convert graph to linear functional graph\n", + "aug_lin_graph = make_graph_linear_gaussian(\n", + " aug_graph,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + ")\n", + "md_lin_graph = sample_multidomain_lin_functions(\n", + " aug_lin_graph,\n", + " n_domains=n_domains,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0f91d578-9fd1-4c7f-9b36-9cabd1afcda2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('y',\n", + " {'gaussian_noise_function': {'mean': 0.19661750717437965,\n", + " 'std': 0.6867341856037134},\n", + " 'parent_functions': {('S', 0): {'func': at 0x148caa8b0>,\n", + " 'weight': -0.5453279550656607}}})\n", + "('x',\n", + " {'gaussian_noise_function': {'mean': 0.3455120880292426,\n", + " 'std': 1.441802865269937},\n", + " 'parent_functions': {'y': {'func': at 0x148caa8b0>,\n", + " 'weight': -0.5453279550656607},\n", + " ('F', 0): {'func': at 0x148caa940>,\n", + " 'weight': 0.5947309146654682},\n", + " ('F', 1): {'func': at 0x148caa8b0>,\n", + " 'weight': 0.3525093415019491}}})\n", + "(('F', 0),\n", + " {'gaussian_noise_function': {'mean': -0.5453279550656607,\n", + " 'std': 0.8167583397097529},\n", + " 'parent_functions': {}})\n", + "(('F', 1),\n", + " {'gaussian_noise_function': {'mean': 0.5947309146654682,\n", + " 'std': 1.1762546707509745},\n", + " 'parent_functions': {}})\n", + "(('S', 0),\n", + " {'domain_ids': (1, 2),\n", + " 'gaussian_noise_function': {'mean': -0.217780898796182,\n", + " 'std': 0.8328139278663845},\n", + " 'parent_functions': {}})\n" + ] + } + ], + "source": [ + "for node in aug_lin_graph.nodes(data=True):\n", + " pprint(node)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "85673523-2582-426b-b29a-37a2ce9be070", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('y',\n", + " {'domain_gaussian_noise_function': {1: {'mean': -0.5453279550656607,\n", + " 'std': 0.8167583397097529},\n", + " 2: {'mean': 0.5947309146654682,\n", + " 'std': 1.1762546707509745}},\n", + " 'gaussian_noise_function': {'mean': 0.19661750717437965,\n", + " 'std': 0.6867341856037134},\n", + " 'invariant_domains': set(),\n", + " 'parent_functions': {('S', 0): {'func': at 0x148caa8b0>,\n", + " 'weight': -0.5453279550656607}}})\n", + "('x',\n", + " {'gaussian_noise_function': {'mean': 0.3455120880292426,\n", + " 'std': 1.441802865269937},\n", + " 'parent_functions': {'y': {'func': at 0x148caa8b0>,\n", + " 'weight': -0.5453279550656607},\n", + " ('F', 0): {'func': at 0x148caa940>,\n", + " 'weight': 0.5947309146654682},\n", + " ('F', 1): {'func': at 0x148caa8b0>,\n", + " 'weight': 0.3525093415019491}}})\n", + "(('F', 0),\n", + " {'gaussian_noise_function': {'mean': -0.5453279550656607,\n", + " 'std': 0.8167583397097529},\n", + " 'parent_functions': {}})\n", + "(('F', 1),\n", + " {'gaussian_noise_function': {'mean': 0.5947309146654682,\n", + " 'std': 1.1762546707509745},\n", + " 'parent_functions': {}})\n", + "(('S', 0),\n", + " {'domain_ids': (1, 2),\n", + " 'gaussian_noise_function': {'mean': -0.217780898796182,\n", + " 'std': 0.8328139278663845},\n", + " 'parent_functions': {}})\n" + ] + } + ], + "source": [ + "for node in md_lin_graph.nodes(data=True):\n", + " pprint(node)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "4ccfafbf-da75-4cd5-a0da-a6baeaa956f3", + "metadata": {}, + "outputs": [], + "source": [ + "# example analysis\n", + "est = KernelCITest()\n", + "est = FisherZCITest()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "8f8bbc3a-aba5-4977-976f-1776ab41944c", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'data' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_34343/1620990787.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"x\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m\"y\"\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'data' is not defined" + ] + } + ], + "source": [ + "est.test(data[1], {\"x\"}, {\"y\"}, {})" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "f9ece90e-27ac-488c-aa36-9fee3200f2c0", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (1201510190.py, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_33752/1201510190.py\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m x_var =\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:Cannot parse: 1:8: x_var = \n", + "Traceback (most recent call last):\n", + " File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/lab_black.py\", line 218, in format_cell\n", + " formatted_code = _format_code(cell)\n", + " File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/lab_black.py\", line 29, in _format_code\n", + " return format_str(src_contents=code, mode=FileMode())\n", + " File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/black/__init__.py\", line 1073, in format_str\n", + " dst_contents = _format_str_once(src_contents, mode=mode)\n", + " File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/black/__init__.py\", line 1083, in _format_str_once\n", + " src_node = lib2to3_parse(src_contents.lstrip(), mode.target_versions)\n", + " File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/black/parsing.py\", line 127, in lib2to3_parse\n", + " raise exc from None\n", + "black.parsing.InvalidInput: Cannot parse: 1:8: x_var = \n" + ] + } + ], + "source": [ + "x_var = \n", + "# compute conditional independence test\n", + "# get the sigma-map for this F-node\n", + "distribution_idx = context.sigma_map[x_var]\n", + "\n", + "# get the distributions across the two distributions\n", + "data_i = data[distribution_idx[0]].copy()\n", + "data_j = data[distribution_idx[1]].copy()\n", + "\n", + "# name the group column the F-node, so Oracle works as expected\n", + "data_i[x_var] = 0\n", + "data_j[x_var] = 1\n", + "this_data = pd.concat((data_i, data_j), axis=0)" + ] + }, + { + "cell_type": "markdown", + "id": "c183daec-9f74-4489-a4bf-34f70a11620e", + "metadata": { + "tags": [] + }, + "source": [ + "## Sample Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6b508e89-1fc8-4dc5-82e3-6557bd43bf87", + "metadata": {}, + "outputs": [], + "source": [ + "n_samples = 5000" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "2e343326-48f4-4451-8429-6ff77902664d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('F', 0), ('F', 1), ('S', 0)]\n", + "{'x', 'y'}\n", + "{'directed': OutEdgeView([('y', 'x'), (('F', 0), 'x'), (('F', 1), 'x'), (('S', 0), 'y')]), 'bidirected': EdgeView([]), 'undirected': EdgeView([])}\n", + "[('F', 0), ('F', 1), ('S', 0), 'y', 'x']\n" + ] + } + ], + "source": [ + "print(lin_graph.augmented_nodes)\n", + "print(md_lin_graph.non_augmented_nodes)\n", + "print(md_lin_graph.edges())\n", + "print(list(nx.topological_sort(md_lin_graph.get_graphs(\"directed\"))))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "973c3136-9721-412e-a951-e4bd9d27c50f", + "metadata": {}, + "outputs": [], + "source": [ + "domain_indices = []\n", + "intervention_targets = []\n", + "mechanisms = []\n", + "data = []\n", + "\n", + "for idx, domain_id in enumerate(range(1, n_domains + 1)):\n", + " df = sample_from_graph(\n", + " md_lin_graph,\n", + " sample_func=\"multidomain\",\n", + " n_samples=n_samples,\n", + " n_jobs=1,\n", + " random_state=seed,\n", + " domain_id=domain_id,\n", + " )\n", + "\n", + " domain_indices.append(domain_id)\n", + " intervention_targets.append({\"x\"})\n", + " mechanisms.append(idx)\n", + " data.append(df)" + ] + }, + { + "cell_type": "markdown", + "id": "1b90d6e9-68fe-40c7-84c9-b9358fb9f38e", + "metadata": { + "tags": [] + }, + "source": [ + "# Oracle Analysis\n", + "\n", + "First, we compare what would happen with the oracle graph, when we learn using the ground-truth augmented selection diagram.\n", + "\n", + "We compare the FCI, $\\Psi$-FCI and S-FCI algorithms" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "0fcfdd27-8600-45cb-8b34-a12722411700", + "metadata": {}, + "outputs": [], + "source": [ + "context = make_context().variables(aug_graph.non_augmented_nodes).build()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "6b3ed7a2-ccb0-4f8f-a885-58df23e6e636", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['x', 'y']\n" + ] + } + ], + "source": [ + "oracle = Oracle(graph)\n", + "dummy_df = dummy_sample(graph)\n", + "print(graph.nodes)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "0b5882d5-f2af-40d0-984a-598b38917560", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now learn the relationships\n", + "oracle_learner = FCI(ci_estimator=oracle, alpha=alpha)\n", + "oracle_learner.fit(\n", + " dummy_df,\n", + " context,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "70e68d34-8725-4368-9c92-caa47fd1e0f2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PAG\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fci_oracle_g = draw(oracle_learner.graph_, name=\"PAG\")\n", + "fci_oracle_g.render(\n", + " filename=\"./two-chain-fci-oracle\",\n", + " outfile=\"./two-chain-fci-oracle.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(fci_oracle_g)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "c5d42695-407a-41fc-bce0-60cf7c95e887", + "metadata": {}, + "outputs": [], + "source": [ + "context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " .obs_distribution(False)\n", + " .intervention_targets([(\"x\"), ()])\n", + " .num_distributions(2)\n", + " .build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "a6fdd4c1-ddf6-4f2e-afe3-88712a5a7593", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# IFCI\n", + "oracle_learner = PsiFCI(\n", + " ci_estimator=oracle,\n", + " cd_estimator=oracle,\n", + " alpha=alpha,\n", + " known_intervention_targets=True,\n", + ")\n", + "oracle_learner.fit(\n", + " [dummy_df, dummy_df],\n", + " context,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "2ec78a4a-f8e5-4c3b-8ab7-46ac38978d2a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "I-PAG\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "('F', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "('F', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "x->y\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ifci_oracle_g = draw(oracle_learner.graph_, name=\"I-PAG\")\n", + "ifci_oracle_g.render(\n", + " filename=\"./two-chain-ifci-oracle\",\n", + " outfile=\"./two-chain-ifci-oracle.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(ifci_oracle_g)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "f0e8e089-aded-4476-a9f7-8f1f51742531", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SFCI\n", + "oracle_learner = SFCI(ci_estimator=oracle, cd_estimator=oracle, alpha=alpha)\n", + "oracle_learner.fit(\n", + " [dummy_df, dummy_df],\n", + " context,\n", + " domain_indices=domain_indices,\n", + " intervention_targets=intervention_targets,\n", + " # debug=False\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9be4b9c7-4073-4d2a-9496-a6a19f8658ec", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "S-PAG\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)\n", + "\n", + "('S', 0)\n", + "\n", + "\n", + "\n", + "('S', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sfci_oracle_g = draw(oracle_learner.graph_, name=\"S-PAG\")\n", + "sfci_oracle_g.render(\n", + " filename=\"./two-chain-sfci-oracle\",\n", + " outfile=\"./two-chain-sfci-oracle.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(sfci_oracle_g)" + ] + }, + { + "cell_type": "markdown", + "id": "15a2b720-1742-414b-82a9-6d75048df390", + "metadata": {}, + "source": [ + "# Generated Data Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "6faffed0-11cb-4695-860e-55c9d622d015", + "metadata": {}, + "source": [ + "## With FCI" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "b81823ce-07dd-42b8-8692-869a4fd9cc87", + "metadata": {}, + "outputs": [], + "source": [ + "context = make_context().variables(aug_graph.non_augmented_nodes).build()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "074c3b07-cbcd-48d6-8d72-d2e636684d86", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now learn the relationships\n", + "learner = FCI(ci_estimator=FisherZCITest(), alpha=alpha)\n", + "learner.fit(\n", + " pd.concat(data, axis=0),\n", + " context,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "3ce0cfc1-8a1c-424d-b2e2-7aacbe2db63c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PAG\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fci_g = draw(learner.graph_, name=\"PAG\")\n", + "fci_g.render(\n", + " filename=\"./two-chain-fci\",\n", + " outfile=\"./two-chain-fci.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(fci_g)" + ] + }, + { + "cell_type": "markdown", + "id": "ea06f144-0435-40e2-89ad-4b4b2513224f", + "metadata": {}, + "source": [ + "## With I-FCI" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "62ce26bc-86c8-4a28-835c-2581ecd316b6", + "metadata": {}, + "outputs": [], + "source": [ + "context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " .obs_distribution(False)\n", + " .intervention_targets([(\"x\"), (\"x\")])\n", + " .mechanisms([{\"x\": 1}, {\"x\": 2}])\n", + " .num_distributions(2)\n", + " .build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "04b7843f-2ebf-4f65-8a04-4cff79050249", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# IFCI\n", + "learner = PsiFCI(\n", + " ci_estimator=FisherZCITest(),\n", + " cd_estimator=KernelCDTest(),\n", + " alpha=alpha,\n", + " known_intervention_targets=True,\n", + ")\n", + "learner.fit(\n", + " data,\n", + " context,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "467032f4-447b-404f-a9b7-c36c628064a6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "I-PAG\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "('F', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "('F', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "x->y\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ifci_g = draw(learner.graph_, name=\"I-PAG\")\n", + "ifci_g.render(\n", + " filename=\"./two-chain-ifci-oracle\",\n", + " outfile=\"./two-chain-ifci-oracle.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(ifci_g)" + ] + }, + { + "cell_type": "markdown", + "id": "80d98d9e-a8dd-4072-9209-5e4f343b49dc", + "metadata": {}, + "source": [ + "## Correct Answer with S-FCI" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "7808fbd4-0fd3-4392-9c82-6351e5c35e09", + "metadata": {}, + "outputs": [], + "source": [ + "context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " .num_distributions(2)\n", + " .build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "824bfe3a-e5b8-43b7-9dfd-ae3e931cf802", + "metadata": {}, + "outputs": [], + "source": [ + "# now learn the relationships\n", + "learner = SFCI(\n", + " ci_estimator=FisherZCITest(), cd_estimator=KernelCDTest(), alpha=alpha, debug=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "1a406382-3ca0-4b9f-8f1e-2aa2037f7c79", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Comparing x-y | set() : 0.0\n", + "Trying to learn skeleton for 1 and 2 to remove F-nodes: [('F', 0)] grouped with S-node: ('S', 0)\n", + "Comparing {('S', 0), ('F', 0)}-x | set() : 0.0\n", + "Comparing {('S', 0), ('F', 0)}-y | set() : 0.0\n", + "Comparing {('S', 0), ('F', 0)}-x | {'y'} : 0.0\n", + "Comparing {('S', 0), ('F', 0)}-y | {'x'} : 0.0\n", + "[('F', 0)]\n", + "[]\n", + "{('F', 0): frozenset()}\n", + "{('F', 0): [0, 1]}\n", + "Trying to learn skeleton for 1 to remove F-nodes: []\n", + "Trying to learn skeleton for 2 to remove F-nodes: []\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "learner.fit(\n", + " data,\n", + " context,\n", + " domain_indices=domain_indices,\n", + " intervention_targets=intervention_targets,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "f7aeb8c0-03f6-4fe4-95fc-fb29f1abe477", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "x\n", + "\n", + "x\n", + "\n", + "\n", + "\n", + "y\n", + "\n", + "y\n", + "\n", + "\n", + "\n", + "x->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)\n", + "\n", + "('S', 0)\n", + "\n", + "\n", + "\n", + "('S', 0)->x\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)->y\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw(learner.graph_)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "cca33f1f-2311-4355-8510-29b1897956fb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "defaultdict(. at 0x148d275e0>,\n", + " {('S', 0): defaultdict(, {('F', 0): []})})\n" + ] + } + ], + "source": [ + "pprint(learner.separating_sets_)" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "e07a008a-b117-4d4b-8aad-551cafcf8f20", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.88338169 0.11661831]\n", + " [0.95437093 0.04562907]\n", + " [0.92598123 0.07401877]\n", + " [0.74032007 0.25967993]\n", + " [0.74200266 0.25799734]\n", + " [0.89661462 0.10338538]\n", + " [0.54642251 0.45357749]\n", + " [0.94539668 0.05460332]\n", + " [0.67546416 0.32453584]\n", + " [0.75045264 0.24954736]\n", + " [0.89957344 0.10042656]\n", + " [0.85249165 0.14750835]\n", + " [0.81894958 0.18105042]\n", + " [0.84897506 0.15102494]\n", + " [0.86968602 0.13031398]\n", + " [0.96352565 0.03647435]\n", + " [0.81842388 0.18157612]\n", + " [0.80927313 0.19072687]\n", + " [0.58526745 0.41473255]\n", + " [0.84046682 0.15953318]]\n", + "[0.81835199 0.18164801]\n", + "0.8333333333333334\n", + "0.16666666666666666\n" + ] + } + ], + "source": [ + "rng = np.random.default_rng(seed)\n", + "test = rng.dirichlet((10, 2), 20)\n", + "print(test)\n", + "print(test.mean(axis=0))\n", + "\n", + "print(10 / 12)\n", + "print(2 / 12)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "5ea22be0-3a4d-4b22-a52c-5153c4c67569", + "metadata": {}, + "outputs": [], + "source": [ + "def convert_md_data_to_sd(data, domain_indices, intervention_targets):\n", + " # generate single-domain data\n", + " single_domain_data = []\n", + " single_domain_targets = []\n", + "\n", + " seen_indices = set()\n", + " for targets in intervention_targets:\n", + " indices = [\n", + " idx\n", + " for idx in range(len(domain_indices))\n", + " if intervention_targets[idx] == targets\n", + " ]\n", + " if any(idx in seen_indices for idx in indices):\n", + " continue\n", + " for idx in indices:\n", + " seen_indices.add(idx)\n", + "\n", + " single_domain_data.append(pd.concat([data[idx] for idx in indices], axis=0))\n", + " if targets == {}:\n", + " continue\n", + " single_domain_targets.append(targets)\n", + " return single_domain_data, single_domain_targets" + ] + }, + { + "cell_type": "markdown", + "id": "4d243b6a-13e4-4cb0-80fc-f053074e22a0", + "metadata": {}, + "source": [ + "# Large-scale random graph analysis\n", + "\n", + "Now, we instantiate a large number of functions over the two-chain graph setup we have to determine if this is just a function of the specific data setup we have. We demonstrate that in fact, consistently, I-FCI gets the wrong answer as is shown in the oracle setting across any function, noise parametrization, weight, or number of samples in our parameter grid.\n", + "\n", + "Our metric that we measure the performance of the algorithsm is the 1-0 loss. It is 0 if the Y->X is oriented as X o-o Y, or correctly and 1 otherwise." + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "aab3dcb4-c871-4a38-a36e-4cf41c3fdf6c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 5 6 7 8 9 10 11 12 13 14]\n", + "[0.1 0.175 0.25 0.325 0.4 ]\n" + ] + } + ], + "source": [ + "node_mean_lims = [-5, 5]\n", + "node_std_lims = [0.01, 1.5]\n", + "edge_functions = [lambda x: x, lambda x: x**2, lambda x: np.sin(x), lambda x: -x]\n", + "edge_weight_lims = [-5, 5]\n", + "n_node_grid = np.arange(5, 15)\n", + "p_grid = np.linspace(0.1, 0.4, 5)\n", + "n_domains_grid = np.arange(2, 10)\n", + "n_repeats = 5\n", + "\n", + "n_samples = 1000\n", + "ratio_interventions = 0.2\n", + "\n", + "print(n_node_grid)\n", + "print(p_grid)" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "4d5aaeef-b4c7-4500-832a-6e9e4d893b6c", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_34343/3255049111.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m )\n\u001b[0;32m---> 94\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets)\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 117\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 118\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 73\u001b[0m )\n\u001b[0;32m---> 74\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 75\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1904\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1905\u001b[0m \u001b[0;31m# apply algorithm to learn skeleton among the F-node subgraph within a single domain\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1906\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1907\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1908\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode, debug)\u001b[0m\n\u001b[1;32m 505\u001b[0m \u001b[0mx_var\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mx_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_with_snode\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 506\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 507\u001b[0;31m test_stat, pvalue = self.evaluate_edge(\n\u001b[0m\u001b[1;32m 508\u001b[0m \u001b[0mthis_data\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconditional_test_func\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_var\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcond_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 509\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mevaluate_edge\u001b[0;34m(self, data, conditional_test_func, X, Y, Z)\u001b[0m\n\u001b[1;32m 771\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 772\u001b[0m \u001b[0mZ\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 773\u001b[0;31m \u001b[0mtest_stat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mconditional_test_func\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mY\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 774\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_ci_tests\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 775\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtest_stat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/cd/kernel_test.py\u001b[0m in \u001b[0;36mtest\u001b[0;34m(self, df, group_col, y_vars, x_vars)\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0;31m# now compute null distribution\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m null_dist = self.compute_null(\n\u001b[0m\u001b[1;32m 139\u001b[0m \u001b[0me_hat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mK\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnull_reps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnull_reps\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrandom_state\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom_state\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 140\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/cd/base.py\u001b[0m in \u001b[0;36mcompute_null\u001b[0;34m(self, e_hat, X, Y, null_reps, random_state)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0;31m# dataset, where each group label is resampled for each sample\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0;31m# according to its propensity score\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 168\u001b[0;31m null_dist = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 169\u001b[0m [\n\u001b[1;32m 170\u001b[0m \u001b[0mdelayed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_statistic\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mY\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrng\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbinomial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0me_hat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mn_samps\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1086\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_iterator\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1087\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1088\u001b[0;31m \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_one_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1089\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1090\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mdispatch_one_batch\u001b[0;34m(self, iterator)\u001b[0m\n\u001b[1;32m 899\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 900\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 901\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtasks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 902\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m_dispatch\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m 817\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 818\u001b[0m \u001b[0mjob_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 819\u001b[0;31m \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 820\u001b[0m \u001b[0;31m# A job can complete so quickly than its callback is\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 821\u001b[0m \u001b[0;31m# called before we get here, causing self._jobs to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mapply_async\u001b[0;34m(self, func, callback)\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0;34m\"\"\"Schedule a func to be run\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImmediateResult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 209\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m 595\u001b[0m \u001b[0;31m# Don't delay the application, to avoid keeping the input\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 596\u001b[0m \u001b[0;31m# arguments in memory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 597\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 598\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 599\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 286\u001b[0m \u001b[0;31m# change the default number of processes to -1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 287\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 288\u001b[0;31m return [func(*args, **kwargs)\n\u001b[0m\u001b[1;32m 289\u001b[0m for func, args, kwargs in self.items]\n\u001b[1;32m 290\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 286\u001b[0m \u001b[0;31m# change the default number of processes to -1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 287\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 288\u001b[0;31m return [func(*args, **kwargs)\n\u001b[0m\u001b[1;32m 289\u001b[0m for func, args, kwargs in self.items]\n\u001b[1;32m 290\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/cd/kernel_test.py\u001b[0m in \u001b[0;36m_statistic\u001b[0;34m(self, K, L, group_ind)\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0;31m# compute W matrices from K and z\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 151\u001b[0;31m \u001b[0mW0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mW1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_compute_inverse_kernel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mK\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup_ind\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 152\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 153\u001b[0m \u001b[0;31m# compute L kernels\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/cd/kernel_test.py\u001b[0m in \u001b[0;36m_compute_inverse_kernel\u001b[0;34m(self, K, z)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0mn1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mz\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m \u001b[0mW0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mK0\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregs_\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0midentity\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mW1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mK1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mregs_\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0midentity\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mW0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mW1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/numpy/core/overrides.py\u001b[0m in \u001b[0;36minv\u001b[0;34m(*args, **kwargs)\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36minv\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 536\u001b[0m \u001b[0msignature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'D->D'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misComplexType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'd->d'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 537\u001b[0m \u001b[0mextobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_linalg_error_extobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 538\u001b[0;31m \u001b[0mainv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_umath_linalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 539\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mainv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_t\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "89732855-0923-4345-a027-064eb471e4bc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
algn_samplesloss
0sfci50.00
1sfci50.00
2sfci50.00
3sfci50.00
4sfci50.00
............
95ifci5000.01
96ifci5000.01
97ifci5000.01
98ifci5000.01
99ifci5000.01
\n", + "

100 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " alg n_samples loss\n", + "0 sfci 50.0 0\n", + "1 sfci 50.0 0\n", + "2 sfci 50.0 0\n", + "3 sfci 50.0 0\n", + "4 sfci 50.0 0\n", + ".. ... ... ...\n", + "95 ifci 5000.0 1\n", + "96 ifci 5000.0 1\n", + "97 ifci 5000.0 1\n", + "98 ifci 5000.0 1\n", + "99 ifci 5000.0 1\n", + "\n", + "[100 rows x 3 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "res_df = pd.DataFrame(sfci_results)\n", + "res_df[\"alg\"] = \"sfci\"\n", + "temp_df = pd.DataFrame(ifci_results)\n", + "temp_df[\"alg\"] = \"ifci\"\n", + "res_df = pd.concat((res_df, temp_df), axis=0)\n", + "res_df = res_df.reset_index()\n", + "\n", + "res_df = pd.melt(\n", + " res_df,\n", + " id_vars=\"alg\",\n", + " var_name=\"n_samples\",\n", + " value_vars=n_sample_grid,\n", + " value_name=\"loss\",\n", + ")\n", + "\n", + "display(res_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "dbacc3de-4a21-4b98-b10c-6c2a8cce6f68", + "metadata": {}, + "outputs": [], + "source": [ + "res_df.columns = [\"Alg.\", \"# Samples\", \"Loss\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "ce1d3be3-bbfa-4c6e-b040-7a30f3152fa1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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NbxVAABUv9WrV2vfvn3q27ev6tevb20fMmSIPD09tWjRIuXn55e7jh9//FGSdPPNN9v1RUVF2YSla4HTBSOpeAL00qVL5evrq2eeeUbTpk1TmzZtlJiYqHbt2l1yeTc3N3322WeaMmWKfvzxR40dO1aLFi3SoEGDtGnTJrVq1aoGtgIAgCvrnXfekSTrabQSISEhGjBggE6cOKHly5eXu46MjAxJUt26dUvtL6v9auV0k69LxMXFKS4urtwxsbGxZX5wnLe3tyZPnqzJkydfifIAAHCokydP6tNPP5UkPfDAA3rggQdKHffOO++U+35a8ikTx48f1w033GDXf/z48aoX60KcNhgBAICyLV68WBcuXFCnTp3Uvn37Usd89tln+u9//6sDBw6oUaNGpY7p0KGDPvnkE61fv169evWy6UtJSbnkx3BdbQhGAAC4oJKJ1W+++ab1auzfeuGFF/Tyyy9rwYIFmj59eqljhgwZopdeeklz5szRiBEjrHOKDMPQpEmTVFhYWOpyu3btkiRdf/31Vd0Up+KUc4wAAEDZEhIStHv3brVp06bMUCRJjz76qCwWi9577z0VFBSUOqZJkyZ66aWXdOrUKbVr106PP/64/vSnP6lz585KSkpSu3btSr3BY8uWLe3uN3g1IBgBAOBiSo4WjRw5stxx0dHR6tOnj9LS0vT555+XOW7SpEl6//33FRUVpffee08LFy5Uy5YtlZiYqIKCAus8pGuBxShr9jJsbNmyRZ06ddLmzZvVsWNHR5cDAHCwwsJC7d69W82bN79q7/WTmZmpunXrqn379qXeeNnRLud7UNH3b44YAQBwjTt58qTd/Y4KCgr09NNPKzc3V3fffbeDKqt5TL4GAOAa9/HHH+vFF19Unz591KBBA6Wnp2vdunXavXu32rdvrzFjxji6xBpDMAIA4Bp344036uabb9a6det0+vRpSVKjRo303HPP6dlnn5WPj4+DK6w5VQpGZ86cUVpampo0aSIvLy9r+3vvvadPP/1Ufn5+GjduXLkz5gEAgGN16NBBy5Ytc3QZTqFKwejPf/6zlixZohMnTljb5syZo3HjxlnvSP3pp5/qhx9+4GM4AACA06vS5OvExET17t3b5hDb66+/rvr162vdunX6z3/+I0n661//WrUqAQAAakCVjhgdOXJEvXv3tn79yy+/6PDhw5ox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CgoKbManpKQYdevWNXx9fY0///nPRnx8vHHnnXcakowXXnjB7jm//PJLw93d3YiKijJmzZplzJkzx3rn65UrV17R7a0J48aNM7p06WI8++yzxrx584w33njDiIuLMywWixEeHm5zw0vDcK3XNcGoBi1dutTo2rWr4ePjYwQGBhp33nmnsW3bNkeX5TRKbrhW1uO3Lly4YLzyyitGs2bNDE9PT6NevXrGY489Zpw8ebLU9Z84ccJ47LHHjHr16hmenp5Gs2bNjFdffdXIz88vdfzWrVuNO+64wwgMDDR8fHyMrl272v216KpKbrhW1iMqKspmPPu68latWmXExcUZ0dHRhq+vr+Hp6WlERUUZQ4YMMTZu3Gg3nn1d/UoLRoZhGOfOnTMmTpxoNGzY0PDw8DAaNmxoPPPMM3YfUVFi//79xv3332+EhoYaXl5eRps2bYz58+eX+byrV682YmNjDT8/P+vZgdJucuiKli9fbvTr18+IjIw0vL29DS8vL6NFixbG+PHjjePHj9uNd6XXtcUwDKNiJ98AAACuTky+BgAAMBGMAAAATAQjAAAAE8EIAADARDACAAAwEYwAAABMBCMAAAATwQgAAMBEMAIAADARjADAAaZMmSKLxaKEhARHlwLgIgQjANUiJydH3t7eGj9+vLXtscceU0BAgAoKCiq8vqVLl6pfv3667rrr5OHhodDQULVq1UpDhw7V4sWLq7N0ALCq5egCAFwdEhMTlZeXp169elnbvv32W91yyy2qVativ2oee+wxxcfHy8fHR3fccYcaNWokwzC0a9cuff7550pISNCwYcOqexMAgGAEoHqsXr1a7u7uuuWWWyRJBw8e1P79+/XHP/6xQutZv3694uPjFRkZqaSkJEVGRtr05+fnc/oJwBXDqTQAlXLu3Dnt3bvX+vjmm2/UsmVLnThxQnv37tV//vMfSVKjRo2sY3Jyci653u+//16SNHjwYLtQJEkeHh7q27evTduFCxc0d+5c9e/fX1FRUfLy8lJISIj69OmjFStWlPo80dHRio6OVlZWlp566ik1aNBAPj4+at++vT799FNJUkFBgaZPn65mzZrJ29tbTZo00dy5c+3WlZCQIIvFoilTpigpKUl9+vRRYGCg/P39dfvtt+uHH3645HZfbNeuXRo+fLgaNGggT09P1a1bV0OGDNGvv/5qN/b48eOaMGGCWrRoIT8/PwUFBalFixYaPny49u/fX6HnBcARIwCV9PHHH2vEiBF27c2aNbP5+ve//731/2vWrFFsbGy56w0NDZUk7dmz57JrSU9P19ixYxUTE6O+ffuqTp06SktL0+eff67+/fsrPj5eI0eOtFsuPz9fffv2VXp6uu666y5duHBB//rXvzR48GB98803evPNN7Vx40b97ne/k5eXl5YuXaoxY8aoTp06uu++++zWt3HjRr366qvq06eP/vjHP2rv3r1atmyZ1q1bp2+++UY9evS45LZ8/fXX+v3vf6/8/HwNGDBATZs2VWpqqpYtW6Yvv/xSa9asUceOHSVJ2dnZ6t69u/bt26e+fftqwIABMgxDKSkpWr58ueLi4tS4cePL3o8AJBkAUAkHDx40li5daixdutR46qmnDEnGSy+9ZG3z9fU1evbsaf166dKlxokTJy653tTUVCMwMNCQZAwYMMD4xz/+YezevdsoKioqc5nc3Fzj8OHDdu1nz541brjhBiM4ONjIzs626YuKijIkGXfeeaeRm5trbV+3bp0hyQgODjY6d+5snDlzxtq3b98+w8PDw2jfvr3NutasWWNIMiQZc+bMsen79NNPDUlG06ZNjcLCQmv75MmTDUnGmjVrrG3p6elGUFCQERoaauzYscNmPdu3bzf8/PyMDh06WNs+++wzQ5Ixbtw4u23Py8szMjMzS9lbAMpDMAJQZePHjzc8PDyMrKwswzAM49dffzUkGW+++Wal1rd69WqjSZMm1rAhyfD39zduv/1244MPPjAKCgoue12zZs0yJBlr1661aS8JRnv37rVbplGjRoYk49tvv7Xri42NNWrVqmVTQ0kw+m34KXHrrbcakoyEhARrW2nBaPbs2YYkY+7cuaVuy7hx4wxJ1tBUEowmTZpU/k4AcNk4lQagylavXq0uXbrIz89PkrR27VpJ0q233lqp9fXs2VO7d+9WYmKi1q5dqx9//FGJiYlauXKlVq5cqcWLF+uLL76Ql5eXdZkdO3Zo5syZWrdundLS0pSbm2uzziNHjtg9T1BQkJo0aWLXHhERoQMHDqhTp052ffXr11dBQYGOHTum+vXr2/T16NFDbm72UzdjY2Ot21HePklKSpIkbdu2TVOmTLHr3717tyRp586datWqlW699VbVr19fr732mrZs2aL+/fure/fuat++vdzd3ct8HgBlIxgBqLCEhATrlWFFRUXatm2bOnfubH0z/+qrr+Tu7m6dgC2p1Df68ri5ualHjx7WeTmGYWjVqlUaNmyY/vvf/+qtt97SuHHjJEkbNmxQr169VFBQoN69e2vgwIEKCAiQm5ubtm7dquXLlysvL8/uOQIDA0t97pLbC5TWX9KXn59v11e3bt1S11evXj1JUkZGRrnbfPr0aUlSfHx8ueOysrIkSQEBAdqwYYMmT56szz77TCtXrpQkhYWF6YknntDzzz8vDw+PctcFwBbBCECFJSQkaOrUqTZtycnJSk5Otmm7eExFg9FvWSwW3XbbbXr55Zc1cuRIrV692hqMXn75ZeXk5JQ6ufvVV1/V8uXLq/Tcl+v48eOlth87dkxS2UGsREn/tm3b1LZt28t6zsjISC1cuFCGYeiXX37R6tWrNW/ePL300ksqKirStGnTKrAFALhcH0CFTZkyRUbxHEU9/fTT8vLyUk5OjgzD0M6dOyVJb731lnWMYRjV9tz+/v6SZLPOvXv3KiQkpNQr3kpO69WE9evXq6ioyK695Ohahw4dyl2+W7dukqTvvvuuws9tsVh0ww03aMyYMVq1apUkWW87AODyEYwAVMmaNWvUrVs3eXt7S/pfCLjUZfll+frrr7Vs2bJST1VlZWVp9uzZkmS9kaRUfE+i9PR0/fTTTzbjFy5caD29VBP27NmjN99806Zt+fLlWrt2rZo2bXrJy/VHjBihoKAgTZ06VZs2bbLrLyoqsrm55Y4dO0o9SlXS5uvrW4mtAK5tnEoDUGlnz57V1q1b9cILL1jbEhISVK9ePV1//fWVWueuXbv01FNPKTg4WD169FCzZs1Uq1Ytpaam6ssvv9TZs2d14403avTo0dZlxo0bp5UrV+rmm2/Wvffeq8DAQP3www9av3694uLi9NFHH1V5Wy9Hv3799PTTT2vFihVq166d9T5G3t7eevfdd0udmH2x0NBQffTRR7r77rvVrVs39e7dWzfccIMsFosOHz6spKQknT592jqxfNWqVZo4caJuuukmNW/eXNddd51SU1O1fPlyubm5aeLEiTWx2cBVhWAEoNLWrl2roqIim6NDa9eurfTVaJI0dOhQBQQEaNWqVdq2bZvWrVunrKwsBQUFqX379rrnnns0cuRIeXp6Wpfp16+fPv/8c7388sv697//LXd3d3Xt2lVr1qzR/v37aywY3XjjjXrxxRf1wgsvaO7cuTIMQ7169dL06dPVpUuXy1pH79699dNPP+n111/XypUr9d1338nT01MRERHq1auXBg8ebB17++2369ChQ1q3bp2WL1+uzMxMhYeHq2/fvho/frxiYmKu1KYCVy2LUZ0n/wHgGpSQkKCePXtq8uTJVZ5kDsCxmGMEAABgIhgBAACYCEYAAAAm5hgBAACYOGIEAABgIhgBAACYCEYAAAAmghEAAICJYAQAAGAiGAEAAJgIRgAAACaCEQAAgOn/AUtGQBwe7/buAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set_context(\"paper\", font_scale=1.5)\n", + "sns.scatterplot(data=res_df, x=\"# Samples\", y=\"Loss\", hue=\"Alg.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59c43562-50fd-47a2-a037-425e1e5310db", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pywhy-discover", + "language": "python", + "name": "pywhy-discover" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/tutorials/multi-domain/example-sfci-algo.ipynb b/doc/tutorials/multi-domain/example-sfci-algo.ipynb new file mode 100644 index 000000000..4d061475e --- /dev/null +++ b/doc/tutorials/multi-domain/example-sfci-algo.ipynb @@ -0,0 +1,1754 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Causal discovery from observational and/or interventional data across multiple domains\n", + "\n", + "Causal discovery algorithms such as the PC, FCI and GeS algorithm typically assume data is iid and come from a single distribution (i.e. a single domain). In the real world, causal structure is typically shared among similar domains, but the distributional functions may differ (e.g. one domain may have Gaussian noise, whereas another domain has Poisson noise).\n", + "\n", + "The S-FCI algorithm is introduced as a constraint-based discovery method that is a generalization of the FCI algorithm and moreover a generalization of the I-FCI/$\\Psi$-FCI algorithms. It correctly leverages data across distributions to learn a S-PAG, which is a Markov equivalence class of augmented selection diagrams. Augmented selection diagrams are selection diagrams with additional F-nodes indicating interventional distributions in any specified domain. \n", + "\n", + "Here, we demonstrate how the S-FCI algorithm typically learns more compared to its predecessors on simulated data stemming from a real experiment. \n", + "\n", + "This is done because one of the challenges of evaluating modern causal discovery is the lack of a suite of datasets that have multiple domains, and various types of interventions, and an accepted ground-truth graph.\n", + "\n", + "## Pseudo-Real Data: Protein Sequencing Experiment\n", + "\n", + "The famous Sachs dataset [2]_ is a wet-lab experiment dataset where protein expression level were observed in resting-state and then proteins were perturbed in various scenarios to obtain interventional data. This dataset can be viewed as observational and interventional data stemming from a single domain.\n", + "\n", + "The ground truth graph that we will assume is true is: https://www.bnlearn.com/research/sachs05/\n", + "\n", + "We will create an in-silico multi-domain dataset from the real data. We will do this by i) specifying at random nodes that are \"latent\", causing latent confounders and ii) choosing random nodes with S-nodes pointing to them causing shifts in distribution from source to target domain.\n", + "\n", + "### Setup\n", + "\n", + "The setup we will first consider the ground-truth graph" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n", + "The lab_black extension is already loaded. To reload it, use:\n", + " %reload_ext lab_black\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%load_ext lab_black" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display_svg" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "from pprint import pprint\n", + "import numpy as np\n", + "import scipy\n", + "import pandas as pd\n", + "import collections\n", + "from itertools import combinations\n", + "import bnlearn\n", + "import pooch\n", + "from cdt.data import load_dataset\n", + "\n", + "from pywhy_graphs.functional import (\n", + " make_graph_linear_gaussian,\n", + " make_graph_multidomain,\n", + " set_node_attributes_with_G,\n", + " apply_linear_soft_intervention,\n", + " sample_multidomain_lin_functions,\n", + ")\n", + "from pywhy_graphs.classes import AugmentedGraph\n", + "from pywhy_graphs.viz import draw\n", + "\n", + "from dodiscover.cd import KernelCDTest\n", + "from dodiscover.ci import KernelCITest, FisherZCITest, Oracle, GSquareCITest\n", + "from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton\n", + "from dodiscover.datasets import sample_from_graph\n", + "\n", + "from dodiscover import PsiFCI, SFCI, Context, make_context, InterventionalContextBuilder" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "seed = 1234\n", + "rng = np.random.default_rng(seed)\n", + "n_jobs = -1" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 0.05" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Load the data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# use pooch to download robustly from a url\n", + "url = \"https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz\"\n", + "file_path = pooch.retrieve(\n", + " url=url,\n", + " known_hash=\"md5:39ee257f7eeb94cb60e6177cf80c9544\",\n", + ")\n", + "\n", + "df = pd.read_csv(file_path, delimiter=\" \")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[bnlearn] >Extracting files..\n" + ] + } + ], + "source": [ + "# download purely observational data\n", + "data = bnlearn.import_example(data='sachs', n=10000, verbose=3)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Erk Akt PKA Mek Jnk PKC Raf P38 PIP3 PIP2 Plcg\n", + "0 1 0 1 1 0 0 1 0 2 0 0\n", + "1 2 1 2 0 0 0 0 0 1 0 0\n", + "2 0 0 0 0 1 1 0 0 2 0 0\n", + "3 1 0 1 1 0 1 0 0 0 1 2\n", + "4 1 1 1 0 1 1 0 0 2 0 0\n", + " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk INT\n", + "0 1 1 1 2 3 2 1 3 1 2 1 8\n", + "1 1 1 1 1 3 3 2 3 1 2 1 8\n", + "2 1 1 2 2 3 2 1 3 2 1 1 8\n", + "3 1 1 1 1 3 2 1 3 1 3 1 8\n", + "4 1 1 1 1 3 2 1 3 1 1 1 8\n" + ] + } + ], + "source": [ + "print(data.head())\n", + "print(df.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['PKC', 'Raf', 'PKA', 'P38', 'PIP3', 'Plcg']\n" + ] + } + ], + "source": [ + "perturbations = [df.columns[perturbed_col] for perturbed_col in df['INT'].unique()]\n", + "\n", + "print(perturbations)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# the ground-truth dag is shown here: XXX: comment in when errors are fixed\n", + "ground_truth_dag = bnlearn.import_DAG(\"sachs\", verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/Users/adam2392/Dropbox/Apps/Overleaf/Learning selection diagrams (observational)/Figures/Appendix/ground_truth_sachs_bnlearn.pdf'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ground_truth_G = ground_truth_dag['model'].to_directed()\n", + "G = draw(ground_truth_G, direction='TD', shape='circle')\n", + "G.render(\n", + " outfile=\"/Users/adam2392/Dropbox/Apps/Overleaf/Learning selection diagrams (observational)/Figures/Appendix/ground_truth_sachs_bnlearn.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Linear SCM Simulation: Generate Ground-Truth Data\n", + "\n", + "First, we assume the causal diagram is induced by a linear SCM. In this setting, we are able to test the performance of S-FCI vs other algorithms when we artificially introduce differnet domain settings that simulate the collection of observations and experiments across e.g. different labs, and hospitals." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Augmented Sachs Graph\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n", + "Erk->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek\n", + "\n", + "Mek\n", + "\n", + "\n", + "\n", + "PKA->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf\n", + "\n", + "Raf\n", + "\n", + "\n", + "\n", + "PKA->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "PKA->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", + "\n", + "PKA->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "PKC->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)\n", + "\n", + "('F', 2)\n", + "\n", + "\n", + "\n", + "('F', 2)->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->PKC\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", + "\n", + "\n", + "\n", + "('F', 1)->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)\n", + "\n", + "('F', 3)\n", + "\n", + "\n", + "\n", + "('F', 3)->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)\n", + "\n", + "('F', 4)\n", + "\n", + "\n", + "\n", + "('F', 4)->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)\n", + "\n", + "('F', 5)\n", + "\n", + "\n", + "\n", + "('F', 5)->Plcg\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "aug_graph = AugmentedGraph(incoming_directed_edges=ground_truth_G.copy())\n", + "\n", + "# add perturbations\n", + "for node in perturbations:\n", + " aug_graph.add_f_node({node}, domain=1)\n", + "\n", + "draw(aug_graph, name='Augmented Sachs Graph')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "node_mean_lims = [-1, 1]\n", + "node_std_lims = [0.01, 1.5]\n", + "edge_functions = [lambda x: x, lambda x: x**2]\n", + "edge_weight_lims = [-0.5, 0.5]\n", + "\n", + "n_domains = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "n_samples = 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# convert graph to linear functional graph\n", + "aug_lin_graph = make_graph_linear_gaussian(\n", + " aug_graph,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + ")\n", + "md_lin_graph = sample_multidomain_lin_functions(\n", + " aug_lin_graph,\n", + " n_domains=n_domains,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "domain_indices = []\n", + "intervention_targets = []\n", + "# mechanisms = []\n", + "data = []\n", + "\n", + "for idx, domain_id in enumerate(range(1, n_domains + 1)):\n", + " df = sample_from_graph(\n", + " md_lin_graph,\n", + " sample_func=\"multidomain\",\n", + " n_samples=n_samples,\n", + " n_jobs=1,\n", + " random_state=seed,\n", + " domain_id=domain_id,\n", + " )\n", + "\n", + " domain_indices.append(domain_id)\n", + " intervention_targets.append({})\n", + " data.append(df)\n", + "\n", + " for perturbation in perturbations:\n", + " int_graph = md_lin_graph.copy()\n", + "\n", + " # generate a soft-intervention\n", + " int_graph = apply_linear_soft_intervention(\n", + " int_graph, targets={perturbation}, random_state=seed\n", + " )\n", + "\n", + " # sample data from the intervention distribution\n", + " df = sample_from_graph(\n", + " int_graph,\n", + " sample_func=\"multidomain\",\n", + " n_samples=n_samples,\n", + " n_jobs=1,\n", + " random_state=seed,\n", + " domain_id=domain_id,\n", + " )\n", + " domain_indices.append(domain_id)\n", + " intervention_targets.append({perturbation})\n", + " data.append(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'PKC'}, {'Raf'}, {'PKA'}, {'P38'}, {'PIP3'}, {'Plcg'}]\n", + "6\n" + ] + } + ], + "source": [ + "# generate single-domain data\n", + "single_domain_data = []\n", + "single_domain_targets = []\n", + "\n", + "seen_indices = set()\n", + "for targets in intervention_targets:\n", + " indices = [\n", + " idx\n", + " for idx in range(len(domain_indices))\n", + " if intervention_targets[idx] == targets\n", + " ]\n", + " if any(idx in seen_indices for idx in indices):\n", + " continue\n", + " for idx in indices:\n", + " seen_indices.add(idx)\n", + "\n", + " single_domain_data.append(pd.concat([data[idx] for idx in indices], axis=0))\n", + " if targets == {}:\n", + " continue\n", + " single_domain_targets.append(targets)\n", + "\n", + "print(single_domain_targets)\n", + "print(len(single_domain_targets))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With I-FCI" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " # .obs_distribution(False)\n", + " .intervention_targets(single_domain_targets)\n", + " # .mechanisms([{\"x\": 1}, {\"x\": 2}])\n", + " .num_distributions(len(single_domain_data))\n", + " .build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# IFCI\n", + "learner = PsiFCI(\n", + " ci_estimator=FisherZCITest(),\n", + " cd_estimator=KernelCDTest(),\n", + " alpha=alpha,\n", + " known_intervention_targets=True,\n", + ")\n", + "learner.fit(\n", + " single_domain_data,\n", + " context,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "I-PAG\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek\n", + "\n", + "Mek\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", + "\n", + "Raf\n", + "\n", + "Raf\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ifci_g = draw(learner.graph_.subgraph(aug_graph.non_augmented_nodes), name=\"I-PAG\")\n", + "ifci_g.render(\n", + " outfile=\"./sachs-ifci.pdf\",\n", + " format=\"pdf\",\n", + " cleanup=True,\n", + ")\n", + "display_svg(ifci_g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With S-FCI" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [], + "source": [ + "context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " .num_distributions(len(data))\n", + " .build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [], + "source": [ + "# now learn the relationships\n", + "learner = SFCI(\n", + " ci_estimator=FisherZCITest(), cd_estimator=KernelCDTest(), alpha=alpha, debug=False,\n", + " n_jobs=-1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_19318/3270696463.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mdomain_indices\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets)\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 117\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 118\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 73\u001b[0m )\n\u001b[0;32m---> 74\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 75\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1827\u001b[0m \u001b[0;31m# initially learn the skeleton without using PDS information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1828\u001b[0m \u001b[0;31m# apply algorithm to learn skeleton\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1829\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobs_data\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcausal_nodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maugmented_nodes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maugmented_nodes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1830\u001b[0m \u001b[0mcontext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prep_second_stage_skeleton\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1831\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, data, context, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, debug)\u001b[0m\n\u001b[1;32m 1404\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msecond_stage_condsel_method\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1405\u001b[0m \u001b[0;31m# setup context for the second round-of learning\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1406\u001b[0;31m \u001b[0mcontext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prep_second_stage_skeleton\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1407\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1408\u001b[0m \u001b[0;31m# now compute all possibly d-separating sets and learn a better skeleton\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_prep_second_stage_skeleton\u001b[0;34m(self, context)\u001b[0m\n\u001b[1;32m 1150\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1151\u001b[0m \u001b[0;31m# orient colliders\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1152\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_orient_unshielded_triples\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpag\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msep_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1153\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1154\u001b[0m \u001b[0;31m# convert the adjacency graph\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_orient_unshielded_triples\u001b[0;34m(self, graph, sep_set)\u001b[0m\n\u001b[1;32m 1132\u001b[0m \u001b[0;31m# Then check to see if 'u' is in the separating\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1133\u001b[0m \u001b[0;31m# set. If it is not, then there is a collider.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1134\u001b[0;31m if v_j not in graph.neighbors(v_i) and not is_in_sep_set(\n\u001b[0m\u001b[1;32m 1135\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msep_set\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv_i\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv_j\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"any\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1136\u001b[0m ):\n", + "\u001b[0;32m~/Documents/pywhy-graphs/pywhy_graphs/networkx/classes/mixededge.py\u001b[0m in \u001b[0;36mneighbors\u001b[0;34m(self, n)\u001b[0m\n\u001b[1;32m 866\u001b[0m \u001b[0mnbrs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 867\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_graphs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 868\u001b[0;31m \u001b[0mnbrs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnbrs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munion\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mall_neighbors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 869\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnbrs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 870\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "learner.fit(\n", + " data,\n", + " context,\n", + " domain_indices=domain_indices,\n", + " intervention_targets=intervention_targets,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "draw(learner.graph_.subgraph(aug_graph.non_augmented_nodes))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pprint(learner.separating_sets_)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Generating Artificial Domains Via Dirichlet Perturbation\n", + "\n", + "Next, we do not assume we can specify the true SCM of the Sachs dataset. Instead of completely specifying the data-generating model for the Sachs dataset, we now apply perturbations to the dataset that is commonly used to evaluate algorithms, such as the FCI, I-FCI, $\\Psi$-FCI in a single-domain setting. \n", + "\n", + "To simulate a multi-domain setting from the data, we will generate a random graph from the ground-truth\n", + "that contains S-nodes. S-nodes are added randomly to simulate a change in mechanism. S-nodes will perturb the node it is pointing to with a dirichlet distribution that perturbs the discrete distribution of the protein expression levels. In order to maintain consistency of the change in domain, all descendants of the S-node will get perturbed slightly." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "11\n" + ] + } + ], + "source": [ + "print(ground_truth_G.number_of_nodes())" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Erk Akt PKA Mek Jnk PKC Raf P38 PIP3 PIP2 Plcg\n", + "0 1 0 1 0 1 1 0 0 1 0 0\n", + "1 2 1 1 0 1 1 0 0 1 0 1\n", + "2 1 0 1 0 1 0 0 0 2 0 0\n", + "3 1 0 2 0 0 0 1 0 0 0 0\n", + "4 1 0 2 0 0 0 1 0 2 0 0\n" + ] + } + ], + "source": [ + "print(data.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize list of domain dataframes\n", + "domain_dfs = []\n", + "domain_dfs.append(df.copy())\n", + "all_s_nodes = []\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (Optional) Choose Latent Confounders" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "# choose a random node to delete to add latent confounders\n", + "node_delete = rng.choice(ground_truth_G.nodes)\n", + "node_delete = []\n", + "print(node_delete)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Second Domain Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "n_domains = 2" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "G = ground_truth_G.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "Adding edge... ('S', 0) Jnk\n", + "Adding edge... ('S', 0) PIP2\n" + ] + } + ], + "source": [ + "sdx = 0\n", + "s_nodes = []\n", + "s_node_domains = collections.defaultdict(list)\n", + "\n", + "# first, add all the S-nodes representing differences across pairs of domains\n", + "for domains in combinations(range(1, n_domains+1), 2):\n", + " source_domain, target_domain = sorted(domains)\n", + "\n", + " # choose a random number of S-nodes to add between (source, target)\n", + " n_s_nodes = rng.integers(0, 3)\n", + " print(n_s_nodes)\n", + " s_nodes_pointer = rng.choice(G.nodes, size=n_s_nodes, replace=False)\n", + "\n", + " # now modify the function of the edge, S-nodes are pointing to\n", + " s_node = ('S', sdx)\n", + " s_nodes.append(s_node)\n", + " G.add_node(s_node, domain_ids=(source_domain, target_domain))\n", + " for node in s_nodes_pointer:\n", + " # the source domain is always the \"reference\" distribution, that is\n", + " # the one we keep fixed\n", + " G.add_edge(s_node, node)\n", + " print('Adding edge... ', s_node, node)\n", + " # mape each source to its target and corresponding S-nodes\n", + " s_node_domains[source_domain].append((target_domain, node, s_node))\n", + " sdx +=1" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n", + "Erk->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek\n", + "\n", + "Mek\n", + "\n", + "\n", + "\n", + "PKA->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf\n", + "\n", + "Raf\n", + "\n", + "\n", + "\n", + "PKA->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "PKA->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", + "\n", + "PKA->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "PKC->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)\n", + "\n", + "('S', 0)\n", + "\n", + "\n", + "\n", + "('S', 0)->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "('S', 0)->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw(G, direction='TD')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# generate a random linear SCM dataset from the accepted ground-truth\n", + "ground_truth_G_lin_lab = make_graph_linear_gaussian(ground_truth_G, random_state=seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "non_s_nodes = set(ground_truth_G_lin_lab.nodes).difference(set(s_nodes))\n", + "# generate a dataset with invariances across domain\n", + "ground_truth_G_lin_hospital = make_graph_linear_gaussian(ground_truth_G, random_state=seed)\n", + "for node in non_s_nodes:\n", + " ground_truth_G_lin_hospital = set_node_attributes_with_G(ground_truth_G_lin_hospital, ground_truth_G_lin_hospital, node)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "data = []\n", + "domain_ids = []\n", + "intervention_targets = []" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# sample both datasets\n", + "lab_dataset = linear.sample_from_graph(ground_truth_G_lin_lab, n_samples=1000,\n", + " n_jobs=n_jobs)\n", + "hospital_dataset = linear.sample_from_graph(ground_truth_G_lin_hospital, n_samples=1000,\n", + " n_jobs=n_jobs)\n", + "\n", + "data.extend([lab_dataset, hospital_dataset])\n", + "domain_ids.extend([1, 2])\n", + "intervention_targets.extend([set(), set()])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# apply perturbations in the lab setting\n", + "for target in perturbations:\n", + " # apply soft intervention\n", + " G = apply_soft_intervention(ground_truth_G_lin_lab, targets={target}, random_state=seed)\n", + " df = linear.sample_from_graph(ground_truth_G_lin_hospital, n_samples=1000,\n", + " n_jobs=n_jobs)\n", + " \n", + " data.append(df)\n", + " domain_ids.append(1)\n", + " intervention_targets.append(target)\n", + " \n", + "# apply one perturbation in the hospital setting\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## $\\Psi$-FCI analysis\n", + "\n", + "Since, $\\Psi$-FCI is the most general learning algorithm that accounts for interventions and observational data, we will leverage this as a naive baseline." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "n_distributions = len(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "ci_estimator = KernelCITest()\n", + "\n", + "# Since our data is entirely discrete, we can also use the G^2 test as our\n", + "# CD test.\n", + "cd_estimator = KernelCDTest()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 0.05\n", + "learner = PsiFCI(ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha, n_jobs=-1)\n", + "\n", + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = (\n", + " ctx_builder.variables(data=data[0]).num_distributions(n_distributions).obs_distribution(False).build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "learner = learner.fit(data, ctx)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "est_pag = learner.graph_\n", + "\n", + "print(f\"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG\")\n", + "\n", + "# %%\n", + "# Visualize the graph without the F-nodes\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "dot_graph = draw(est_pag_no_fnodes, direction=\"LR\")\n", + "dot_graph.render(outfile=\"psi_pag.png\", view=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### S-FCI analysis\n", + "\n", + "Next, we run S-FCI to compare the outputs of the two algorithms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Comparing Outputs" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[bnlearn] >Set node properties.\n", + "[bnlearn] >Set edge properties.\n", + "[bnlearn] >Plot based on Bayesian model\n" + ] + }, + { + "data": { + "image/png": "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kSPp27cvEydOpLCwMGR1iIiIiEhoKXgSERFpYDIzMwFCGjxZLBamTp2KaZpMnjyZYDAYslpEREREJHQUPImIiDQwGRkZWCwWkpOTQ1pHQkICDz74IAsWLOCdd94JaS0iIiIiEhoKnkRERBqYzMxMkpOTsdlsoS6FgQMHcvXVV/Pcc8+xdu3aUJcjIiIiIrVMwZOIiEgDE6oV7Q5m1KhRdO3alXHjxlFaWhrqckRERESkFil4EhERaWAyMzNDtqLdgdhsNqZPn05RURHTp0/HNM1QlyQiIiIitUTBk4iISANT10Y8AaSkpDBx4kS+++47vvjii1CXIyIiIiK1RMGTiIhIA+J2u3G73XUueAI49dRTufDCC3n00UfZunVrqMsRERERkVqg4ElERKQBycrKAqiTwRPA6NGjad68OePGjcPj8YS6HBERERGpYQqeREREGpCMjAyAOtXj6b+FhYXx8MMPk5GRwcyZM0NdjoiIiIjUMAVPIiIiDUhmZiZRUVFER0eHupSDateuHWPGjOHjjz/mxx9/DHU5IiIiIlKDFDyJiIg0IHsbixuGEepSDun888/nL3/5C1OnTq2aHigiIiIiDY+CJxERkQYkIyOjzvZ3+m+GYTBhwgRcLhcTJkzA7/eHuiQRERERqQEKnkRERBqQzMzMOtvf6X9FRUUxffp01q5dy4svvhjqckRERESkBih4EhERaSACgQDZ2dn1JngC6N69O7feeiuvv/46ixYtCnU5IiIiIlLNFDyJiIg0ELm5uQSDwXox1e6/XXnllQwYMIBJkyaxa9euUJcjIiIiItVIwZOIiEgDkZGRAVDvgieLxcKUKVMAmDRpEsFgMMQViYiIiEh1UfAkIiLSQGRmZmKxWEhOTg51KUcsPj6eadOmsWTJEt56661QlyMiIiIi1UTBk4iISAORmZlJcnIyNpst1KUclX79+nHNNdcwa9YsVq1aFepyRERERKQaKHgSERFpIDIyMurdNLv/ddNNN9G9e3cmTJhASUlJqMsRERERkWOk4ElERKSByMzMrPfBk81mY9q0aZSWljJ16lRM0wx1SSIiIiJyDBQ8iYiINBANIXgCSElJYeLEifz00098+umnoS5HRERERI6BgicREZEGwO1243a7adGiRahLqRYnn3wyF198MY8//jhbtmwJdTkiIiIicpQUPImIiDQAWVlZ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GqeddtoR1yQiciRe+WgOL/3rx2NeSOFYFRSVEBnu5LWpNx3R674cnuXLl/PAAw9QXFzMmDFjOPfccxvMXecnn3ySDz74gNdee01T1kWkTggGg6xevZq0tDTmzJlDRkYGERERDB48mNTUVE466aQ/veFdH61Zs4ZHH32UNWvWcPrpp3PHHXeQmJgY6rJEDkjBUz1TWl7J7I9+4uPvl+Lx+YiLjjzsHkgHYpom5ZVe3KUVJMRGcePfTuaCU/r86fSADRs2MH78eHJycrj77ru54IIL9vtQvXPnTv7617+Sl5dHs2bNyMrKonPnznz77bc1lsJPmzaN559/fp87zNu3bwegTZs2+20fCATIzc3F4XBw9dVXc9999zXINyYRCb2SskouvuspSssriY+pnQafG5Z8x6Zl3zPgvJtp0vyP1eyCpknurmKuOW8ot12u0L0mlJWV8fjjj/Pvf/+boUOHcv/99x92P666zOfzce2111JSUsI777yj90wRCQmv18uyZcuYM2cOc+fOpbCwkPj4+KopdH369Gmwo3527drFc889x7///W86derEPffcQ69evUJdlsghHW5WFLrbslJl4/ZsJj73EVt25hIZ5iQp/tinaRiGQWS4k3Cng8LiUh599d/MX76BB2658IC9R4LBIO+88w6zZs2iffv2vPPOOwcMdABatmzJgw8+yG233UZeXh6GYXDHHXfU6JvAgY6dmJjIjh07KCkpITo6ep/nrFYrzZo1IzMzk1deeYWwsDDGjx9fY/WJSOP146Lfyc7KYPVXswBwhkdxysj7sVj277NUUpjL3PcfByA8Oo5Trqre1yWLYeC02/hq3gquOX/oUTc4l4OLjIzkgQceYNiwYTz00ENceuml3H///QwbNizUpR0Tu93O9OnTueKKK5gxYwZTp05tMKO5RKRuKy0tZcGCBaSlpTF//nzKy8tp0aIFZ599NsOHD6d79+4Nqrfe//L5fHzwwQe8/PLL2Gw2xo0bxwUXXNCgr1kaHwVPIbZqYzpjn3yfvEI3TWOjsVXz6nQWi0GTuGgqPF5+Xr6Bux55m0fHjKBp3B9pZH5+Pg888ABLlizhqquu4pZbbvnTEOncc89l/vz5vPbaa/Tr149zzz23Wuv+X3a7fb8PwBEREURGRpKXl7dP8GSaJqWlpRQXFxMZGcn555/PyJEja7Q+EWmc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csstt3DxxRfz4YcfctVVV4W6HBFpgI7v3JrLzhzA65/NIyLcid1Wu1N7HQ4HsfFNKdyVjz9nFTHREXTs2JFt27bh8Xj29PHzequm3VksFvz+Pb0HR48eTd++fenbty+jR49my5YtzJ07l7lz5zJp0iQsFgu9evVi2LBhDBs2jObNm9fqtTV2AwYM4P333+fRRx9l4sSJzJ07l3HjxhETExPq0oA9AdmMGTO46qqrmDlzJuPGjQt1SSL1mmmabNu2rWolunXr1mGz2ejbty9jx45l6NCh6jFUzXbs2METTzzBggUL6N+/P08++SRt27YNdVkiDYqCp1qSlBBDfEwkGe7aXa5662/zyN2xjvjkNoRHx2Gx2qgoKSJvxzoCfi/N2vckpnlXundsecD99/YC8fl8Vf80TZOmTZvW6nUci5YtW3L++efz2muvcf755+vOhYjUiGsvSGXhb5tYvy2bpPgYLJbaG5VSXunBZneQenxLvt3wNRW2eMLDw2nXrl1V+GS1WgkEAlXT64LBIImJiftMQzYMgw4dOtChQweuu+468vLy+Pnnn5k7dy7PPvssM2fOpH379lUhVNeuXTX9oBa4XC6mTZvG0KFDefjhh7n00kuZNGkSgwYNCnVpALRv354xY8Ywffp0+vXrxymnnBLqkkTqlWAwyO+//141sik9PZ2IiAhOOukkrrzySk466SStHlkDysrKeOWVV3j33XdJSkriiSeeYOjQoXVqVKlIQ6HgqZYYhkG39i3Yum1brZ63RefemKbJruzt5O3chBkMYLU7CYtNIialE1FJ7dm9ezefffgWX7/5WFXD2b1BUzAYrFoJae+P3W7nmWee4bTTTqvVazkWN9xwA19++SVvvfUWo0aNCnU5ItIAhYc5mHTzhdz5yFvkFRaTmBCD5TA/vPr8PjZu3EjrVq2P+MtFhceLu7SCMwYfz/gbzuX6gs388MMPpKSk4HQ6adeuHdu3b6eiogK73Y5pmlU3EeLi4li8eDEDBgw44AftxMRELrroIi666CLKy8urGtl+9NFHvPrqqzRp0qSqL1Tfvn3VF6qGnXbaafTq1YspU6bwj3/8g4suuog77riDiIjQj1i+4IILWLJkCVOnTqVr166kpKSEuiSROs3r9bJs2bKqsKmwsJD4+HiGDh3K3XffrdfUGhQMBvnqq6949tlnKS8v56ab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iIiImrmJEyfi3LlzSE9PN9uYkZGROHr0KCoqKsw2JhERNT8MnoiIiIiImrkhQ4agdevWZm0yHhERAaPRiP3795ttTCIian4YPBERERERNXNSqRQTJkzArl27UF5ebpYxPTw8EBAQgH379pllPCIiap4YPBERERERtQBjx46FKIrYvn272caMjIzEwYMHodFozDYmERE1LwyeiIiIiIhaAFdXVwwdOhQbN26EIAhmGTMqKgo6nQ6HDh0yy3hERNT8MHgiIiIiImohYmJicOPGDRw+fNgs4/n4+MDPz4/b7YiI6I4YPBERERERtRABAQHw8/NDQkKC2caMjIzE/v37odPpzDYmERE1HwyeiIiIiIhaCIlEgokTJ+LAgQPIzc01y5hRUVGoqqrC8ePHzTIeERE1LwyeiIiIiIhakBEjRsDOzg6bNm0yy3gdO3aEr68v9u7da5bxiIioeWHwRERERETUgtjY2GDMmDHYsmWLWbbHSSQSREZGIjk5GUaj0QwVEhFRc8LgiYiIiIiohYmOjkZ5eTl+/fVXs4wXFRWFsrIypKWlmWU8IiJqPhg8ERERERG1ML6+vujfvz/i4+PNMp6/vz88PDx4uh0REd2CwRMRERERUQs0ceJEnD17FhkZGXUeSyqVIioqComJiRAEwQzVERFRc8HgiYiIiIioBRoyZAg8PT2RkJBglvGioqJQWFholiCLiIiaDwZPREREREQtkEwmw4QJE7Br1y6o1eo6jxcYGAgXFxdutyMioloYPBERERERtVDjxo2DIAjYvn17nceSSqUIDw/Hvn37IIqiGaojIqLmgMETEREREVEL5erqiqFDh2Ljxo1m6c0UFRWF69ev4/Lly2aojoiImgMGT0RERERELdjEiRNx/fp1HDlypM5j9e3bF3Z2dtxuR0REJgyeiIiIiIhasICAAPj5+ZmlybhSqURoaCgSExPNUBkRETUHDJ6IiIiIiFowiUSCmJgY7N+/H7m5uXUeLyoqCpmZmbh+/boZqiMioqaOwRMRERERUQv36KOPws7ODj/++GOdxxo4cCCsrKy46omIiAAweCIiIiIiavFsbGzw+OOPY8uWLdDpdHUea9CgQQyeiIgIAIMnIiIiIiICEB0djbKyMvz66691HisyMhJnzpxBYWGhGSojIqKmjMETERERERGhXbt2CAkJwcaNG+s8VmhoKGQyGZKSkupeGBERNWkMnoiIiIiICAAQExOD06dP48KFC3Uax8HBASEhIdi3b5+ZKiMioqaKwRMREREREQEAwsLC4Onpifj4+DqPFRkZiZMnT6KsrKzuhRERUZPF4ImIiIiIiAAAMpkMEyZMwK5du6BWq+s0VkREBERRxP+3d69BVtd5nuc/5+QVUhIERUUQofB+v6BoIXAOrV2KpYIcdqendnZ3dqe7t/tBRW9P9cZGd8RGbOxGbHRNR888mJnoqN6o3p2pmVkSFC0v1VqS3LwUqHgrtPBaWCqioJBckrydfaASRYGSQJ68vl4Pz///+59vPjGCt7/f/2zYsGGApgNgJBKeAACAI+6777709vbmkUceOa3nTJ48Odddd53jdgBjnPAEAAAcMXny5CxevDirVq1KX1/faT2rVCrlF7/4RQ4cODBA0wEw0ghPAADAUSqVSnbs2JHNmzef1nNKpVK6u7vz9NNPD9BkAIw0whMAAHCUa665JhdddNFpv2T83HPPzeWXX+64HcAYJjwBAABHKRQKqVQq2bRpU3bu3HlazyqVSnn66adz+PDhAZoOgJFEeAIAAI7xne98J+PGjcvq1atP6znlcjmHDh3Kc889N0CTATCSCE8AAMAxxo8fn7vvvjtr1qxJV1fXKT9n5syZmT17tuN2AGOU8AQAABxXpVLJZ599lqeeeuq0nlMul7Nhw4b09PQM0GQAjBTCEwAAcFwXXnhhbrrpprS1tZ3Wc8rlcjo6OvLCCy8M0GQAjBTCEwAA8LWWL1+eV155Jdu3bz/lZ1x00UWZNm2a43YAY5DwBAAAfK2FCxdm6tSpp7XrqVAopFwup729PX19fQM4HQDDnfAEAAB8rbq6uixbtiyPP/54Ojo6Tvk55XI5e/bsyauvvjqA0wEw3AlPAADAN1q6dGm6u7vzyCOPnPIzrrzyykyZMuW0X1QOwMgiPAEAAN9oypQpWbx4cdra2k75qFyxWEypVEp7e3uq1eoATwjAcCU8AQAAJ1SpVLJjx45s2bLllJ9RLpfz0Ucf5Ve/+tUATgbAcCY8AQAAJ3Tttddmzpw5p/WS8euvvz6tra1+3Q5gDBGeAACAEyoUCqlUKtmwYUN27tx5Ss+or6/PwoUL097ePsDTATBcCU8AAEC/3HnnnWlubs4DDzxwys8olUp599138+677w7gZAAMV8ITAADQL+PHj8/dd9+dNWvWpKur65SeMW/evIwbN86uJ4AxQngCAAD6rVKpZM+ePaccjhobGzN//nzveQIYI4QnAACg32bNmpUbb7wxK1euPOVnlEqlvPHGG/nwww8HcDIAhiPhCQAAOCkrVqzIyy+/nO3bt5/S+vnz56exsTHr1q0b2MEAGHaEJwAA4KQsWLAgZ599dlatWnVK68ePH5958+Y5bgcwBghPAADASamvr8+yZcvy2GOPpaOj45SeUSqV8vLLL2f37t0DPB0Aw4nwBAAAnLSlS5emu7s7jz766CmtX7BgQQqFQtavXz/AkwEwnAhPAADASTvrrLNSLpfT1taWarV60usnTpyYG2+80XE7gFFOeAIAAE5JpVLJr3/962zZsuWU1pdKpWzZsiX79u0b4MkAGC6EJwAA4JRcd911mT17dtra2k5p/aJFi9Lb25uNGzcO8GQADBfCEwAAcEoKhUJWrFiR9evXZ9euXSe9/uyzz87VV1/tuB3AKCY8AQAAp+yuu+5Kc3NzVq9efUrry+Vynn322Rw8eHCAJwNgOBCeAACAUzZ+/PjcfffdefDBB9Pd3X3S60ulUrq6uvLss8/WYDoAhprwBAAAnJbly5dnz549aW9vP+m1559/fi6++GLH7QBGKeEJAAA4LbNnz84NN9yQlStXntL6crmcjRs3pqura4AnA2CoCU8AAMBpW7FiRV566aW8+eabJ722XC7n4MGD2bJlSw0mA2AoCU8AAMBpW7hwYc4+++y0tbWd9NpZs2blggsucNwOYBQSngAAgNNWX1+fpUuX5vHHH8/+/ftPam2hUEi5XM66devS29tbowkBGArCEwAAMCCWLl2arq6uPProoye9tlwuZ+/evdm6dWsNJgNgqAhPAADAgDj77LNTKpXS1taWarV6Umsvu+yynHPOOY7bAYwywhMAADBgKpVK3nvvvTz//PMnte63j9v19fXVaDoABpvwBAAADJjrr78+s2fPPqWXjJdKpezatSvbtm2rwWQADAXhCQAAGDCFQiHLly/PunXrsmvXrpNae+211+bMM8903A5gFBGeAACAAbVkyZI0NzfngQceOKl1xWIxixYtSnt7+0m/IwqA4Ul4AgAABlRLS0uWLFmSBx98MN3d3Se1tlQqv9A0LQAAH4dJREFU5f33389bb71Vo+kAGEzCEwAAMOAqlUp2796d9vb2k1o3d+7cnHHGGSe9DoDhSXgCAAAG3OzZs3P99ddn1apVJ7WuoaEhCxYs8J4ngFFCeAIAAGqiUqnkxRdfPOljc6VSKW+99VZ27NhRo8kAGCzCEwAAUBOlUilTpkw56V1Pt9xyS5qamrJu3braDAbAoBGeAACAmqivr8+yZcvy2GOP5cCBA/1e19zcnG9/+9uO2wGMAsITAABQM0uXLk1nZ2ceffTRk1pXKpXy2muvZdeuXTWaDIDBIDwBAAA1M3Xq1CxatChtbW2pVqv9Xjd//vzU19f7dTuAEU54AgAAamrFihV5991388ILL/R7zYQJE3LTTTc5bgcwwglPAABATd1www2ZNWtW2traTmpduVzO1q1b89lnn9VoMgBqTXgCAABqqlAopFKppL29/aTe2bRgwYIkyYYNG2o1GgA1JjwBAAA1t2TJkjQ1NWXNmjX9XjN58uRce+21jtsBjGDCEwAAUHMtLS2566678sADD6Snp6ff68rlcjZv3pz9+/fXcDoAakV4AgAABkWlUsmnn36adevW9XtNqVRKd3d3nn766doNBkDNCE8AAMCgmDNnTq677rqsXLmy32vOOeecXH755XnqqadqOBkAtSI8AQAAg6ZSqeTFF1/M22+/3e81ixcvzjPPPJPOzs4aTgZALQhPAADAoCmVSpkyZUpWrVp1Ums6Ozvz3HPP1XAyAGpBeAIAAAZNQ0NDli5dmkcffTQHDhzo15oLLrgg3/rWt/y6HcAIJDwBAACDatmyZens7Mxjjz3W7zXlcjkbN25Md3d3DScDYKAJTwAAwKCaOnVqFi1alLa2tlSr1X6tKZVK6ejoyAsvvFDj6QAYSMITAAAw6CqVSt55551s3bq1X/dfdNFFOf/88x23AxhhhCcAAGDQ3XjjjbnwwguzcuXKft1fKBRSLpezbt269PX11Xg6AAaK8AQAAAy6QqGQSqWS9vb2fPLJJ/1aUyqVsmfPnrz88ss1ng6AgSI8AQAAQ2LJkiVpbGzMgw8+2K/7r7zyypx99tlpb2+v8WQADBThCQAAGBJnnHFG7rzzzjzwwAPp6ek54f3FYjGlUilr167t90vJARhawhMAADBkKpVKPv3006xfv75f95dKpezcuTNvvPFGjScDYCAITwAAwJC56KKLcu211/b7JePXX399WltbHbcDGCGEJwAAYEitWLEiL7zwQt55550T3ltXV5dFixZl7dq1gzAZAKdLeAIAAIZUqVTK5MmTs2rVqn7f/9577/UrVAEwtIQnAABgSDU0NGTp0qV55JFHcvDgwRPef/PNN2f8+PGO2wGMAMITAAAw5JYtW5bOzs489thjJ7y3sbEx8+fPd9wOYAQQngAAgCF3zjnnZOHChWlra0u1Wj3h/eVyOb/61a/y4YcfDsJ0AJwq4QkAABgWKpVK3n777WzduvWE9956661pbGx03A5gmBOeAACAYWHu3LmZOXNm2traTnjv+PHjM2/ePMftAIY54QkAABgWCoVCKpVK1q5dm08//fSE95fL5bzyyiv9uheAoSE8AQAAw8aSJUvS0NCQBx988IT3LliwIIVCIevWrav9YACcEuEJAAAYNiZMmJC77rorDzzwQHp6er7x3tbW1tx4442O2wEMY8ITAAAwrCxfvjyffPJJNmzYcMJ7Fy9enOeffz779u0bhMkAOFnCEwAAMKxcfPHFueaaa/r1kvGFCxemWq32K1IBMPiEJwAAYNipVCrZsmVL3n333W+876yzzsrVV1/tuB3AMCU8AQAAw065XM7kyZP7teupXC7nueeey8GDBwdhMgBOhvAEAAAMO42NjbnvvvvyyCOPnDAolUqldHV15Zlnnhmk6QDoL+EJAAAYlpYtW5bOzs48/vjj33jftGnTcskllzhuBzAMCU8AAMCwdO6552bBggVpa2tLtVr9xnvL5XI2bdqUrq6uQZoOgP4QngAAgGGrUqnkrbfeyksvvfSN95XL5Rw8eDC/+MUvBmcwAPpFeAIAAIatuXPn5oILLjjhS8ZnzZqVCy+8MO3t7YM0GQD9ITwBAADDVrFYzPLly7N27drs3r37G+8tl8tZt25dent7B2k6AE5EeAIAAIa17373u6mrq8uaNWu+8b5SqZR9+/blxRdfHJzBADgh4QkAABjWJkyYkDvvvDOrV6/+xt1Ml156ac4991zH7QCGEeEJAAAY9lasWJFdu3Zl/fr1X3tPoVBIuVzO2rVr09fXN4jTAfB1hCcAAGDYu/jii3P11Vdn1apV33hfqVTKp59+mtdee22QJgPgmwhPAADAiFCpVLJ58+a89957X3vPNddck8mTJztuBzBMCE8AAMCIsHjx4px55pnfuOupWCxm0aJFWbt2barV6iBOB8DxCE8A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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk INT\n", + "0 1 1 1 2 3 2 1 3 1 2 1 8\n", + "1 1 1 1 1 3 3 2 3 1 2 1 8\n", + "2 1 1 2 2 3 2 1 3 2 1 1 8\n", + "3 1 1 1 1 3 2 1 3 1 3 1 8\n", + "4 1 1 1 1 3 2 1 3 1 1 1 8\n", + "(5400, 12)\n" + ] + } + ], + "source": [ + "# use pooch to download robustly from a url\n", + "url = \"https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz\"\n", + "file_path = pooch.retrieve(\n", + " url=url,\n", + " known_hash=\"md5:39ee257f7eeb94cb60e6177cf80c9544\",\n", + ")\n", + "\n", + "df = pd.read_csv(file_path, delimiter=\" \")\n", + "\n", + "# the ground-truth dag is shown here: XXX: comment in when errors are fixed\n", + "ground_truth_dag = bnlearn.import_DAG(\"sachs\", verbose=False)\n", + "fig = bnlearn.plot(ground_truth_dag)\n", + "\n", + "# .. note::\n", + "# The Sachs dataset has previously been preprocessed, and the steps are described\n", + "# in bnlearn, at the web-page https://www.bnlearn.com/research/sachs05/.\n", + "print(df.head())\n", + "print(df.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6 6 6\n", + "Graph with 26 nodes and 325 edges\n", + "There are 284 edges in the resulting PAG\n" + ] + }, + { + "data": { + "text/plain": [ + "'s_pag.png'" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# %%\n", + "# Preprocess the dataset\n", + "# ----------------------\n", + "# Since the data is one dataframe, we need to process it into a form\n", + "# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We\n", + "# will form a list of separate dataframes.\n", + "unique_ints = df[\"INT\"].unique()\n", + "\n", + "# get the list of intervention targets and list of dataframe associated with each intervention\n", + "intervention_targets = [df.columns[idx] for idx in unique_ints]\n", + "data_cols = [col for col in df.columns if col != \"INT\"]\n", + "data = []\n", + "domain_ids = np.array([0, 0, 0, 0, 0, 1])\n", + "for interv_idx in unique_ints:\n", + " _data = df[df[\"INT\"] == interv_idx][data_cols]\n", + " data.append(_data)\n", + "\n", + "print(len(data), len(intervention_targets), len(domain_ids))\n", + "# %%\n", + "# Setup constraint-based learner\n", + "# ------------------------------\n", + "# Since we have access to interventional data, the causal discovery algorithm\n", + "# we will use that leverages CI and CD tests to estimate causal constraints\n", + "# is the Psi-FCI algorithm :footcite:`Jaber2020causal`.\n", + "\n", + "# Our dataset is comprised of discrete valued data, so we will utilize the\n", + "# G^2 (Chi-square) CI test.\n", + "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "# Since our data is entirely discrete, we can also use the G^2 test as our\n", + "# CD test.\n", + "cd_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "alpha = 0.8\n", + "learner = SFCI(\n", + " ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha, n_jobs=-1\n", + ")\n", + "\n", + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = ctx_builder.variables(data=data[0]).num_distributions(len(data)).build()\n", + "\n", + "print(ctx.init_graph)\n", + "\n", + "# %%\n", + "# Run the learning process\n", + "# ------------------------\n", + "# We have setup our causal context and causal discovery learner, so we will now\n", + "# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's\n", + "# `fit` design. All fitted attributes contain an underscore at the end.\n", + "learner = learner.fit(\n", + " data, ctx, domain_indices=domain_ids, intervention_targets=intervention_targets\n", + ")\n", + "\n", + "# %%\n", + "# Analyze the results\n", + "# ===================\n", + "# Now that we have learned the graph, we will show it here. Note differences and similarities\n", + "# to the ground-truth DAG that is \"assumed\". Moreover, note that this reproduces Supplementary\n", + "# Figure 8 in :footcite:`Jaber2020causal`.\n", + "est_pag = learner.graph_\n", + "\n", + "print(f\"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG\")\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "# dot_graph = draw(est_pag, direction=\"LR\")\n", + "# dot_graph.render(outfile=\"_pag_full.png\", view=True)\n", + "\n", + "# %%\n", + "# Visualize the graph without the F-nodes\n", + "est_pag_no_fnodes = est_pag.subgraph(data_cols)\n", + "dot_graph = draw(est_pag_no_fnodes, direction=\"LR\")\n", + "dot_graph.render(outfile=\"s_pag.png\", view=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Graph with 26 nodes and 325 edges\n", + "[('F', 0), ('F', 1), ('F', 2), ('F', 3), ('F', 4), ('F', 5), ('F', 6), ('F', 7), ('F', 8), ('F', 9), ('F', 10), ('F', 11), ('F', 12), ('F', 13), ('F', 14)]\n", + "There are 167 edges in the resulting PAG\n" + ] + }, + { + "data": { + "text/plain": [ + "'psi_pag.png'" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Setup constraint-based learner\n", + "# ------------------------------\n", + "# Since we have access to interventional data, the causal discovery algorithm\n", + "# we will use that leverages CI and CD tests to estimate causal constraints\n", + "# is the Psi-FCI algorithm :footcite:`Jaber2020causal`.\n", + "\n", + "# Our dataset is comprised of discrete valued data, so we will utilize the\n", + "# G^2 (Chi-square) CI test.\n", + "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "# Since our data is entirely discrete, we can also use the G^2 test as our\n", + "# CD test.\n", + "cd_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "alpha = 0.05\n", + "learner = PsiFCI(\n", + " ci_estimator=ci_estimator, cd_estimator=cd_estimator, alpha=alpha, n_jobs=-1\n", + ")\n", + "\n", + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = (\n", + " ctx_builder.variables(data=data[0])\n", + " .num_distributions(6)\n", + " .obs_distribution(False)\n", + " .build()\n", + ")\n", + "\n", + "print(ctx.init_graph)\n", + "print(ctx.f_nodes)\n", + "\n", + "# %%\n", + "# Run the learning process\n", + "# ------------------------\n", + "# We have setup our causal context and causal discovery learner, so we will now\n", + "# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's\n", + "# `fit` design. All fitted attributes contain an underscore at the end.\n", + "learner = learner.fit(data, ctx)\n", + "\n", + "# %%\n", + "# Analyze the results\n", + "# ===================\n", + "# Now that we have learned the graph, we will show it here. Note differences and similarities\n", + "# to the ground-truth DAG that is \"assumed\". Moreover, note that this reproduces Supplementary\n", + "# Figure 8 in :footcite:`Jaber2020causal`.\n", + "est_pag = learner.graph_\n", + "\n", + "print(f\"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG\")\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "dot_graph = draw(est_pag, direction=\"LR\")\n", + "dot_graph.render(outfile=\"psi_pag_full.png\", view=True)\n", + "\n", + "# %%\n", + "# Visualize the graph without the F-nodes\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "dot_graph = draw(est_pag_no_fnodes, direction=\"LR\")\n", + "dot_graph.render(outfile=\"psi_pag.png\", view=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pywhy-discover", + "language": "python", + "name": "pywhy-discover" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/doc/tutorials/multi-domain/random-graph-analysis.ipynb b/doc/tutorials/multi-domain/random-graph-analysis.ipynb new file mode 100644 index 000000000..858461817 --- /dev/null +++ b/doc/tutorials/multi-domain/random-graph-analysis.ipynb @@ -0,0 +1,807 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "dd37974a-507e-406f-af4a-d927248ca73f", + "metadata": {}, + "source": [ + "# Random ER-G" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a2e4ad0a-86e4-44d6-9e2e-ebce00716483", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%load_ext lab_black" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "735b60f6-a74f-4a1b-85d5-e3fec97c0b62", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display_svg" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "id": "5404ecd8-17bf-4fe6-93fd-dbc2fffb8df0", + "metadata": {}, + "outputs": [], + "source": [ + "from pprint import pprint\n", + "import numpy as np\n", + "import scipy\n", + "import pandas as pd\n", + "import collections\n", + "from itertools import combinations\n", + "import networkx as nx\n", + "import pywhy_graphs as pgraphs\n", + "from pywhy_graphs import AugmentedGraph\n", + "from pywhy_graphs.functional import (\n", + " make_graph_linear_gaussian,\n", + " make_graph_multidomain,\n", + " set_node_attributes_with_G,\n", + " apply_linear_soft_intervention,\n", + " sample_multidomain_lin_functions,\n", + ")\n", + "from pywhy_graphs.viz import draw\n", + "from pywhy_graphs.simulate import simulate_random_er_dag\n", + "\n", + "from dodiscover.cd import KernelCDTest\n", + "from dodiscover.ci import KernelCITest, FisherZCITest, Oracle\n", + "from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton\n", + "from dodiscover.constraint.utils import dummy_sample\n", + "from dodiscover.datasets import sample_from_graph\n", + "\n", + "from dodiscover import (\n", + " SFCI,\n", + " PsiFCI,\n", + " FCI,\n", + " Context,\n", + " make_context,\n", + " InterventionalContextBuilder,\n", + ")\n", + "from dodiscover.metrics import (\n", + " structure_hamming_dist,\n", + " confusion_matrix_networks,\n", + " structure_hamming_dist_ec,\n", + ")\n", + "\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "514e7715-203e-4362-8eda-6569a029a849", + "metadata": {}, + "outputs": [], + "source": [ + "seed = 12345" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3c9267d5-6845-404d-b2b1-8c991f0a516a", + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 0.05" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "07d7b26f-a025-42da-989a-2a245a86a440", + "metadata": {}, + "outputs": [], + "source": [ + "def convert_md_data_to_sd(data, domain_indices, intervention_targets):\n", + " # generate single-domain data\n", + " single_domain_data = []\n", + " single_domain_targets = []\n", + "\n", + " seen_indices = set()\n", + " for targets in intervention_targets:\n", + " indices = [\n", + " idx\n", + " for idx in range(len(domain_indices))\n", + " if intervention_targets[idx] == targets\n", + " ]\n", + " if any(idx in seen_indices for idx in indices):\n", + " continue\n", + " for idx in indices:\n", + " seen_indices.add(idx)\n", + "\n", + " single_domain_data.append(pd.concat([data[idx] for idx in indices], axis=0))\n", + " if targets == {}:\n", + " continue\n", + " single_domain_targets.append(targets)\n", + " return single_domain_data, single_domain_targets" + ] + }, + { + "cell_type": "markdown", + "id": "859b79a5-980e-47e2-b36b-0635807216b6", + "metadata": {}, + "source": [ + "# Run Experiment" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "03e8ed34-ef56-496f-923a-04ba4e10894c", + "metadata": {}, + "outputs": [], + "source": [ + "rng = np.random.default_rng(seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "48a7f96a-d9e6-4503-8c68-b368466f0dee", + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 0.2" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "id": "bc0b93f4-c7f4-49d9-8af9-4fece68c33f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4]\n", + "[0.3 0.35 0.4 0.45 0.5 ]\n" + ] + } + ], + "source": [ + "node_mean_lims = [-1, 1]\n", + "node_std_lims = [0.5, 1.5]\n", + "edge_functions = [\n", + " lambda x: x,\n", + " lambda x: x**2,\n", + "]\n", + "edge_weight_lims = [1, 5]\n", + "n_node_grid = np.arange(4, 5)\n", + "p_grid = np.linspace(0.3, 0.5, 5)\n", + "n_domains_grid = np.arange(2, 10)\n", + "n_repeats = 1\n", + "\n", + "max_cond_set_size = 3\n", + "\n", + "n_samples = 2000\n", + "ratio_interventions = 0.9\n", + "n_jobs = -1\n", + "print(n_node_grid)\n", + "print(p_grid)" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "16f1b69c-6733-40cf-b3f6-5bac8156b4a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0, 1, 2, 3}\n" + ] + } + ], + "source": [ + "print(aug_lin_graph.non_augmented_nodes)" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "id": "0e0c709f-ced6-497e-a19e-626ae70c0bf2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{0, 2}" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set(rng.choice(list(aug_lin_graph.non_augmented_nodes), size=2, replace=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "id": "bde56fd2-6adc-4181-8efb-acdc2945ead8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_46438/1098357664.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 133\u001b[0m )\n\u001b[0;32m--> 134\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 135\u001b[0m \u001b[0msingle_domain_data\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 147\u001b[0m )\n\u001b[0;32m--> 148\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, check_input)\u001b[0m\n\u001b[1;32m 1490\u001b[0m \u001b[0;31m# initially learn the skeleton without using PDS information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1491\u001b[0m \u001b[0;31m# apply algorithm to learn skeleton\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1492\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobs_data\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpossible_x_nodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnon_augmented_nodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipped_y_nodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf_nodes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipped_z_nodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf_nodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1493\u001b[0m \u001b[0mcontext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prep_second_stage_skeleton\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1494\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, data, context, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, debug)\u001b[0m\n\u001b[1;32m 1389\u001b[0m \u001b[0;31m# initially learn the skeleton without using PDS information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1390\u001b[0m \u001b[0;31m# apply algorithm to learn skeleton\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1391\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1392\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode, debug)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 541\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 542\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 543\u001b[0m delayed(_parallel_test_xy_edges)(\n\u001b[1;32m 544\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 973\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 974\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 975\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 976\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 565\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 566\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 567\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 568\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mCfTimeoutError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 441\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 442\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 443\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mCANCELLED\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCANCELLED_AND_NOTIFIED\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 310\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 312\u001b[0;31m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 313\u001b[0m \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "sfci_results = collections.defaultdict(list)\n", + "ifci_results = collections.defaultdict(list)\n", + "parameters = collections.defaultdict(list)\n", + "\n", + "for n_nodes in n_node_grid:\n", + " n_interventions = int(ratio_interventions * n_nodes)\n", + "\n", + " for p in p_grid:\n", + " # simulate random ER-graph\n", + " G = simulate_random_er_dag(n_nodes=n_nodes, p=p, seed=seed, ensure_acyclic=True)\n", + " aug_graph = AugmentedGraph(incoming_directed_edges=G)\n", + " # convert graph into a multi-domain linear graph\n", + " aug_lin_graph = make_graph_linear_gaussian(\n", + " aug_graph,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + " )\n", + " non_augmented_nodes = set(G.nodes)\n", + "\n", + " for n_domains in n_domains_grid:\n", + " md_lin_graph = sample_multidomain_lin_functions(\n", + " aug_lin_graph,\n", + " n_domains=n_domains,\n", + " node_mean_lims=node_mean_lims,\n", + " node_std_lims=node_std_lims,\n", + " edge_functions=edge_functions,\n", + " edge_weight_lims=edge_weight_lims,\n", + " random_state=seed,\n", + " )\n", + " # keep a copy of the ground-truth graph\n", + " groundtruth_graph = md_lin_graph.copy()\n", + "\n", + " # now generate interventions\n", + " for idx in range(n_repeats):\n", + " domain_indices = []\n", + " intervention_targets = []\n", + " mechanisms = []\n", + " data = []\n", + "\n", + " # generate observational distirbution\n", + " for jdx, domain_id in enumerate(range(1, n_domains + 1)):\n", + " df = sample_from_graph(\n", + " md_lin_graph,\n", + " sample_func=\"multidomain\",\n", + " n_samples=int(n_samples),\n", + " n_jobs=1,\n", + " random_state=seed + idx,\n", + " domain_id=domain_id,\n", + " )\n", + "\n", + " domain_indices.append(domain_id)\n", + " intervention_targets.append({})\n", + " mechanisms.append(jdx)\n", + " data.append(df)\n", + " for jdx in range(n_interventions):\n", + " # get random node to perturb\n", + " perturbation = set(\n", + " rng.choice(\n", + " list(aug_lin_graph.non_augmented_nodes),\n", + " size=1,\n", + " replace=False,\n", + " )\n", + " )\n", + "\n", + " int_graph = md_lin_graph.copy()\n", + "\n", + " # generate a soft-intervention\n", + " int_graph = apply_linear_soft_intervention(\n", + " int_graph, targets=perturbation, random_state=seed + idx\n", + " )\n", + "\n", + " # sample data from the intervention distribution\n", + " df = sample_from_graph(\n", + " int_graph,\n", + " sample_func=\"multidomain\",\n", + " n_samples=n_samples,\n", + " n_jobs=1,\n", + " random_state=seed + idx,\n", + " domain_id=domain_id,\n", + " )\n", + " domain_indices.append(domain_id)\n", + " intervention_targets.append(perturbation)\n", + " mechanisms.append(jdx)\n", + " data.append(df)\n", + "\n", + " # run S-FCI\n", + " context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " .num_distributions(len(data))\n", + " .build()\n", + " )\n", + " # now learn the relationships\n", + " learner = SFCI(\n", + " ci_estimator=KernelCITest(),\n", + " cd_estimator=KernelCDTest(),\n", + " alpha=alpha,\n", + " debug=False,\n", + " n_jobs=n_jobs,\n", + " max_cond_set_size=max_cond_set_size,\n", + " )\n", + " learner.fit(\n", + " data,\n", + " context,\n", + " domain_indices=domain_indices,\n", + " intervention_targets=intervention_targets,\n", + " )\n", + " spag = learner.graph_\n", + "\n", + " # run I-FCI\n", + " single_domain_data, single_domain_targets = convert_md_data_to_sd(\n", + " data, domain_indices, intervention_targets\n", + " )\n", + " context = (\n", + " make_context(create_using=InterventionalContextBuilder)\n", + " .variables(aug_graph.non_augmented_nodes)\n", + " # .obs_distribution(False)\n", + " .intervention_targets(single_domain_targets)\n", + " # .mechanisms([{\"x\": 1}, {\"x\": 2}])\n", + " .num_distributions(len(single_domain_data))\n", + " .build()\n", + " )\n", + " learner = PsiFCI(\n", + " ci_estimator=KernelCITest(),\n", + " cd_estimator=KernelCDTest(),\n", + " alpha=alpha,\n", + " known_intervention_targets=True,\n", + " n_jobs=n_jobs,\n", + " max_cond_set_size=max_cond_set_size,\n", + " )\n", + " learner.fit(\n", + " single_domain_data,\n", + " context,\n", + " )\n", + " ipag = learner.graph_\n", + "\n", + " # analyze skeleton\n", + " cm_ipag = confusion_matrix_networks(\n", + " aug_lin_graph.to_undirected(),\n", + " ipag.subgraph(non_augmented_nodes).to_undirected(),\n", + " )\n", + " cm_spag = confusion_matrix_networks(\n", + " aug_lin_graph.to_undirected(),\n", + " spag.subgraph(non_augmented_nodes).to_undirected(),\n", + " )\n", + "\n", + " # analyze directionality orietnations\n", + " shd_ipag = structure_hamming_dist(\n", + " aug_lin_graph.sub_directed_graph(),\n", + " ipag.subgraph(non_augmented_nodes).sub_directed_graph(),\n", + " )\n", + " shd_spag = structure_hamming_dist(\n", + " aug_lin_graph.sub_directed_graph(),\n", + " spag.subgraph(non_augmented_nodes).sub_directed_graph(),\n", + " )\n", + "\n", + " print(cm_ipag, cm_spag)\n", + " print(shd_ipag, shd_spag)\n", + "\n", + " sfci_results[\"shd\"].append(shd_spag)\n", + " sfci_results[\"cm_skel\"].append(cm_spag)\n", + " ifci_results[\"shd\"].append(shd_ipag)\n", + " ifci_results[\"cm_skel\"].append(cm_ipag)\n", + "\n", + " # analyze skeleton\n", + " cm_ipag = confusion_matrix_networks(\n", + " aug_lin_graph.sub_directed_graph(),\n", + " ipag.subgraph(non_augmented_nodes).sub_directed_graph(),\n", + " )\n", + " cm_spag = confusion_matrix_networks(\n", + " aug_lin_graph.sub_directed_graph(),\n", + " spag.subgraph(non_augmented_nodes).sub_directed_graph(),\n", + " )\n", + " print(cm_ipag)\n", + " print(cm_spag)\n", + " sfci_results[\"cm_direct\"].append(cm_spag)\n", + " ifci_results[\"shd\"].append(shd_ipag)\n", + " ifci_results[\"cm_direct\"].append(cm_ipag)\n", + " parameters[\"idx\"].append(idx)\n", + " parameters[\"n_domains\"].append(n_domains)\n", + " parameters[\"p_edge\"].append(p)\n", + " parameters[\"n_nodes\"].append(n_nodes)\n", + " # break\n", + " # break\n", + " break\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "3c6cae59-7337-4d8b-bb8a-748e68a33d09", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "[{}, {}, {}, {}, {}, {2}, {3}, {0}]\n", + "8\n", + "0.3 4\n" + ] + } + ], + "source": [ + "print(n_domains)\n", + "print(intervention_targets)\n", + "print(len(data))\n", + "print(p, n_nodes)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "13c6c922-0ba5-4a59-88ee-a8090f9eb5a2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[2 1]\n", + " [0 3]]\n", + "[[2 1]\n", + " [1 2]]\n", + "2.0 2.0\n" + ] + } + ], + "source": [ + "# analyze directionality orietnations\n", + "shd_ipag = structure_hamming_dist_ec(\n", + " aug_lin_graph,\n", + " ipag.subgraph(non_augmented_nodes),\n", + ")\n", + "shd_spag = structure_hamming_dist_ec(\n", + " aug_lin_graph,\n", + " spag.subgraph(non_augmented_nodes),\n", + ")\n", + "\n", + "# analyze skeleton\n", + "cm_ipag = confusion_matrix_networks(\n", + " aug_lin_graph.sub_directed_graph(),\n", + " ipag.subgraph(non_augmented_nodes).sub_directed_graph(),\n", + ")\n", + "cm_spag = confusion_matrix_networks(\n", + " aug_lin_graph.sub_directed_graph(),\n", + " spag.subgraph(non_augmented_nodes).sub_directed_graph(),\n", + ")\n", + "\n", + "print(cm_ipag)\n", + "print(cm_spag)\n", + "print(shd_ipag, shd_spag)" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "5d9d610c-4cce-4a5e-a1ba-ac9dedf68ad8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "0->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "1->3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2->3\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw(groundtruth_graph)" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "id": "5aef1b41-0c62-4d35-a10d-213fca31b9a0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "3->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "0->3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "1->3\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw(ipag.subgraph(non_augmented_nodes))" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "id": "2b48e391-59f0-42be-b21c-27382cde56c3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "0->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "3->0\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "3->1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw(spag.subgraph(non_augmented_nodes))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "da273420-b573-4323-8a5b-f039330aa104", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pywhy-discover", + "language": "python", + "name": "pywhy-discover" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/dodiscover/constraint/sfcialg.py b/dodiscover/constraint/sfcialg.py new file mode 100644 index 000000000..2db308f1f --- /dev/null +++ b/dodiscover/constraint/sfcialg.py @@ -0,0 +1,231 @@ +from typing import FrozenSet, List, Optional, Tuple + +import networkx as nx +import pandas as pd + +from dodiscover._protocol import EquivalenceClass +from dodiscover.cd import BaseConditionalDiscrepancyTest +from dodiscover.ci import BaseConditionalIndependenceTest +from dodiscover.constraint.config import ConditioningSetSelection +from dodiscover.typing import Column, SeparatingSet + +from ..context import Context +from .intervention import PsiFCI +from .skeleton import LearnMultiDomainSkeleton + + +class SFCI(PsiFCI): + def __init__( + self, + ci_estimator: BaseConditionalIndependenceTest, + cd_estimator: BaseConditionalDiscrepancyTest, + alpha: float = 0.05, + min_cond_set_size: Optional[int] = None, + max_cond_set_size: Optional[int] = None, + max_combinations: Optional[int] = None, + condsel_method: ConditioningSetSelection = ConditioningSetSelection.NBRS, + apply_orientations: bool = True, + keep_sorted: bool = False, + max_iter: int = 1000, + max_path_length: Optional[int] = None, + pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, + n_jobs: Optional[int] = None, + debug: bool = False + ): + super().__init__( + ci_estimator, + cd_estimator, + alpha, + min_cond_set_size, + max_cond_set_size, + max_combinations, + condsel_method, + apply_orientations, + keep_sorted, + max_iter, + max_path_length, + pds_condsel_method, + n_jobs=n_jobs, + ) + self.debug = debug + + def learn_skeleton( + self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None + ) -> Tuple[nx.Graph, SeparatingSet]: + # now compute all possibly d-separating sets and learn a better skeleton + self.skeleton_learner_ = LearnMultiDomainSkeleton( + self.ci_estimator, + self.cd_estimator, + sep_set=sep_set, + alpha=self.alpha, + min_cond_set_size=self.min_cond_set_size, + max_cond_set_size=self.max_cond_set_size, + max_combinations=self.max_combinations, + condsel_method=self.condsel_method, + second_stage_condsel_method=self.pds_condsel_method, + keep_sorted=False, + max_path_length=self.max_path_length, + n_jobs=self.n_jobs, + ) + self.skeleton_learner_.fit(data, context, self.domain_indices, self.intervention_targets, debug=self.debug) + + self.context_ = self.skeleton_learner_.context_.copy() + skel_graph = self.skeleton_learner_.adj_graph_ + sep_set = self.skeleton_learner_.sep_set_ + self.n_ci_tests += self.skeleton_learner_.n_ci_tests + return skel_graph, sep_set + + def fit(self, data: List[pd.DataFrame], context: Context, domain_indices, intervention_targets): + """Learn the relevant causal graph equivalence class. + + From the pairs of datasets, we take all combinations and + construct F-nodes corresponding to those. + + Parameters + ---------- + data : List[pd.DataFrame] + The list of different datasets assigned to different + environments. We assume the first dataset is always + observational. + context : Context + The context with interventional assumptions. + + Returns + ------- + self : PsiFCI + The fitted learner. + """ + if not isinstance(data, list): + raise RuntimeError("The input datasets must be in a Python list.") + + # n_datasets = len(data) + # n_distributions = context.num_distributions + + # if n_datasets != n_distributions: + # raise RuntimeError( + # f"There are {n_datasets} passed in, but {n_distributions} " + # f"total assumed distributions. There must be a matching number of datasets and " + # f"'context.num_distributions'." + # ) + self.domain_indices = domain_indices + self.intervention_targets = intervention_targets + + return super().fit(data, context) + + def _apply_rule11(self, graph: EquivalenceClass, context: Context) -> Tuple[bool, List]: + augmented_nodes = context.f_nodes + context.s_nodes + + oriented_edges = [] + added_arrows = True + for node in augmented_nodes: + for nbr in graph.neighbors(node): + if nbr in augmented_nodes: + continue + + # remove all edges between node and nbr and orient this out + graph.remove_edge(node, nbr) + graph.remove_edge(nbr, node) + graph.add_edge(node, nbr, graph.directed_edge_name) + oriented_edges.append((node, nbr)) + return added_arrows, oriented_edges + + def _apply_rule12( + self, + graph: EquivalenceClass, + u: Column, + a: Column, + c: Column, + context: Context, + ) -> bool: + """Apply "Rule 9" of the I-FCI algorithm. + + Checks for inducing paths where 'u' is the F-node, and 'a' and 'c' are connected: + + 'u' -> 'a' *-* 'c' with 'u' -> 'c', then orient 'a' -> 'c'. + + For original details of the rule, see :footcite:`Kocaoglu2019characterization`. + + Parameters + ---------- + graph : EquivalenceClass + The causal graph. + u : Column + The candidate F-node + a : Column + Neighbors of the F-node. + c : Column + Neighbors of the F-node. + symmetric_diff_map : dict + A mapping from the F-nodes to the symmetric difference of the pair of + intervention targets each F-node represents. I.e. if F-node, F1 represents + the pair of intervention distributions with targets {'x'}, and {'x', 'y'}, + then F1 maps to {'y'} in the symmetric diff map. + + Returns + ------- + added_arrows : bool + Whether or not an orientation was made. + + References + ---------- + .. footbibliography:: + """ + f_nodes = context.f_nodes + symmetric_diff_map = context.symmetric_diff_map + + added_arrows = False + if u in f_nodes and self.known_intervention_targets: + # get sigma map to map F-node to its symmetric difference target + S_set: FrozenSet = symmetric_diff_map.get(u, frozenset()) + + # check domain + domains_u = context.domain_map[u] + + # check the presence of an S-node for that domain + if len(domains_u) == 2: + for s_node in context.s_nodes: + if context.domain_map[s_node] == domains_u: + # check if the s-node is d-connected to F + if graph.has_edge(s_node, c): + return False + + # now, we know that there is no S-node for the domain of u + # that will alter the distribution of a/c, so we check for + # an inducing path that we can orient properly + # check a *-* c + if ( + len(S_set) == 1 + and a in S_set + and (graph.has_edge(a, c) or graph.has_edge(c, a)) + and graph.has_edge(u, a) + and graph.has_edge(u, c) + ): + # remove all edges between a and c + graph.remove_edge(a, c) + graph.remove_edge(c, a) + + # then orient X -> Y + graph.add_edge(a, c, graph.directed_edge_name) + + added_arrows = True + return added_arrows + + def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: + import pywhy_graphs as pgraph + + # convert the undirected skeleton graph to its PAG-class, where + # all left-over edges have a "circle" endpoint + pag = pgraph.AugmentedPAG(incoming_circle_edges=graph, + name="SPAG derived with S-FCI") + + # get the graph attributes + pag.graph = graph.graph + + # XXX: assign targets as well + # assign f-nodes + # for f_node in self.context_.f_nodes: + # pag.set_f_node(f_node) + # for s_node in self.context_.s_nodes: + # domain_ids = self.context_.domain_map[s_node] + # pag.add_s_node(s_node, domain_ids=domain_ids, node_changes=) + return pag \ No newline at end of file From 3143bfc15f10a921ee90769382f55b9450744d03 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 24 May 2023 01:17:08 -0400 Subject: [PATCH 53/61] Almost working sfci Signed-off-by: Adam Li --- .../multi-domain/random-graph-analysis.ipynb | 92 +++------- dodiscover/__init__.py | 2 +- dodiscover/constraint/__init__.py | 8 +- dodiscover/constraint/sfcialg.py | 11 +- dodiscover/constraint/skeleton.py | 172 +++++++++++------- dodiscover/datasets/linear.py | 1 - dodiscover/datasets/multidomain.py | 1 - examples/plot_sfci_alg.py | 150 +++++++++++++++ .../skeleton/test_multidomain_skeleton.py | 2 +- 9 files changed, 301 insertions(+), 138 deletions(-) create mode 100644 examples/plot_sfci_alg.py diff --git a/doc/tutorials/multi-domain/random-graph-analysis.ipynb b/doc/tutorials/multi-domain/random-graph-analysis.ipynb index 858461817..24eeb43bc 100644 --- a/doc/tutorials/multi-domain/random-graph-analysis.ipynb +++ b/doc/tutorials/multi-domain/random-graph-analysis.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "735b60f6-a74f-4a1b-85d5-e3fec97c0b62", "metadata": {}, "outputs": [], @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": 4, "id": "5404ecd8-17bf-4fe6-93fd-dbc2fffb8df0", "metadata": {}, "outputs": [], @@ -73,7 +73,7 @@ "from dodiscover.metrics import (\n", " structure_hamming_dist,\n", " confusion_matrix_networks,\n", - " structure_hamming_dist_ec,\n", + " # structure_hamming_dist_ec,\n", ")\n", "\n", "import seaborn as sns\n", @@ -82,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "514e7715-203e-4362-8eda-6569a029a849", "metadata": {}, "outputs": [], @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "3c9267d5-6845-404d-b2b1-8c991f0a516a", "metadata": {}, "outputs": [], @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "07d7b26f-a025-42da-989a-2a245a86a440", "metadata": {}, "outputs": [], @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 8, "id": "03e8ed34-ef56-496f-923a-04ba4e10894c", "metadata": {}, "outputs": [], @@ -151,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 9, "id": "48a7f96a-d9e6-4503-8c68-b368466f0dee", "metadata": {}, "outputs": [], @@ -161,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 10, "id": "bc0b93f4-c7f4-49d9-8af9-4fece68c33f3", "metadata": {}, "outputs": [ @@ -198,71 +198,35 @@ }, { "cell_type": "code", - "execution_count": 141, - "id": "16f1b69c-6733-40cf-b3f6-5bac8156b4a6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{0, 1, 2, 3}\n" - ] - } - ], - "source": [ - "print(aug_lin_graph.non_augmented_nodes)" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "id": "0e0c709f-ced6-497e-a19e-626ae70c0bf2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{0, 2}" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "set(rng.choice(list(aug_lin_graph.non_augmented_nodes), size=2, replace=False))" - ] - }, - { - "cell_type": "code", - "execution_count": 169, + "execution_count": 20, "id": "bde56fd2-6adc-4181-8efb-acdc2945ead8", "metadata": { "tags": [] }, "outputs": [ { - "ename": "KeyboardInterrupt", - "evalue": "", + "ename": "Exception", + "evalue": "The y variables are not all in the DataFrame.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_46438/1098357664.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 133\u001b[0m )\n\u001b[0;32m--> 134\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 135\u001b[0m \u001b[0msingle_domain_data\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31m_RemoteTraceback\u001b[0m Traceback (most recent call last)", + "\u001b[0;31m_RemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 114, in _test_xy_edges\n test_stat, pvalue = parallel_fun(\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 685, in evaluate_edge\n test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/cd/kernel_test.py\", line 134, in test\n self._check_test_input(df, y_vars, group_col, x_vars)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/cd/base.py\", line 42, in _check_test_input\n raise ValueError(\"The y variables are not all in the DataFrame.\")\nValueError: The y variables are not all in the DataFrame.\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 428, in _process_worker\n r = call_item()\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 275, in __call__\n return self.fn(*self.args, **self.kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\", line 620, in __call__\n return self.func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in __call__\n return [func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in \n return [func(*args, **kwargs)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 123, in _test_xy_edges\n raise Exception(e)\nException: The y variables are not all in the DataFrame.\n\"\"\"", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_59486/3346600287.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 104\u001b[0m )\n\u001b[0;32m--> 105\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 106\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 147\u001b[0m )\n\u001b[0;32m--> 148\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskeleton_learner_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, check_input)\u001b[0m\n\u001b[1;32m 1490\u001b[0m \u001b[0;31m# initially learn the skeleton without using PDS information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1491\u001b[0m \u001b[0;31m# apply algorithm to learn skeleton\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1492\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobs_data\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpossible_x_nodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnon_augmented_nodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipped_y_nodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf_nodes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipped_z_nodes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mf_nodes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1493\u001b[0m \u001b[0mcontext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_prep_second_stage_skeleton\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1494\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, data, context, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, debug)\u001b[0m\n\u001b[1;32m 1389\u001b[0m \u001b[0;31m# initially learn the skeleton without using PDS information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1390\u001b[0m \u001b[0;31m# apply algorithm to learn skeleton\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1391\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1392\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode, debug)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 541\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 542\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 543\u001b[0m delayed(_parallel_test_xy_edges)(\n\u001b[1;32m 544\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m )\n\u001b[0;32m---> 70\u001b[0;31m self.skeleton_learner_.fit(\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1719\u001b[0m \u001b[0;34mf\"{this_f_nodes} grouped with S-node: {s_node}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1720\u001b[0m )\n\u001b[0;32m-> 1721\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1722\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1723\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 449\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 450\u001b[0m delayed(_test_xy_edges)(\n\u001b[1;32m 451\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 973\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 974\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 975\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 976\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 565\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 566\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 567\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 568\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mCfTimeoutError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 441\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 442\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 443\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mCANCELLED\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCANCELLED_AND_NOTIFIED\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 310\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 312\u001b[0;31m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 313\u001b[0m \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 444\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 445\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 446\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 447\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 390\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 391\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 392\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0;31m# Break a reference cycle with the exception in self._exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mException\u001b[0m: The y variables are not all in the DataFrame." ] } ], @@ -364,8 +328,8 @@ " )\n", " # now learn the relationships\n", " learner = SFCI(\n", - " ci_estimator=KernelCITest(),\n", - " cd_estimator=KernelCDTest(),\n", + " ci_estimator=FisherZCITest(),\n", + " cd_estimator=KernelCDTest(null_reps=500),\n", " alpha=alpha,\n", " debug=False,\n", " n_jobs=n_jobs,\n", @@ -393,8 +357,8 @@ " .build()\n", " )\n", " learner = PsiFCI(\n", - " ci_estimator=KernelCITest(),\n", - " cd_estimator=KernelCDTest(),\n", + " ci_estimator=FisherZCITest(),\n", + " cd_estimator=KernelCDTest(null_reps=500),\n", " alpha=alpha,\n", " known_intervention_targets=True,\n", " n_jobs=n_jobs,\n", diff --git a/dodiscover/__init__.py b/dodiscover/__init__.py index cd2e49053..1c6ee7682 100644 --- a/dodiscover/__init__.py +++ b/dodiscover/__init__.py @@ -4,6 +4,6 @@ from . import metrics # noqa: F401 from ._protocol import EquivalenceClass, Graph from ._version import __version__ # noqa: F401 -from .constraint import FCI, PC, PsiFCI +from .constraint import FCI, PC, SFCI, PsiFCI from .context import Context from .context_builder import ContextBuilder, InterventionalContextBuilder, make_context diff --git a/dodiscover/constraint/__init__.py b/dodiscover/constraint/__init__.py index f21aed4ce..08f692474 100644 --- a/dodiscover/constraint/__init__.py +++ b/dodiscover/constraint/__init__.py @@ -2,4 +2,10 @@ from .fcialg import FCI from .intervention import PsiFCI from .pcalg import PC -from .skeleton import LearnInterventionSkeleton, LearnSemiMarkovianSkeleton, LearnSkeleton +from .sfcialg import SFCI +from .skeleton import ( + LearnInterventionSkeleton, + LearnMultiDomainSkeleton, + LearnSemiMarkovianSkeleton, + LearnSkeleton, +) diff --git a/dodiscover/constraint/sfcialg.py b/dodiscover/constraint/sfcialg.py index 2db308f1f..23f16a3f5 100644 --- a/dodiscover/constraint/sfcialg.py +++ b/dodiscover/constraint/sfcialg.py @@ -30,7 +30,7 @@ def __init__( max_path_length: Optional[int] = None, pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, n_jobs: Optional[int] = None, - debug: bool = False + debug: bool = False, ): super().__init__( ci_estimator, @@ -67,7 +67,9 @@ def learn_skeleton( max_path_length=self.max_path_length, n_jobs=self.n_jobs, ) - self.skeleton_learner_.fit(data, context, self.domain_indices, self.intervention_targets, debug=self.debug) + self.skeleton_learner_.fit( + data, context, self.domain_indices, self.intervention_targets, debug=self.debug + ) self.context_ = self.skeleton_learner_.context_.copy() skel_graph = self.skeleton_learner_.adj_graph_ @@ -215,8 +217,7 @@ def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: # convert the undirected skeleton graph to its PAG-class, where # all left-over edges have a "circle" endpoint - pag = pgraph.AugmentedPAG(incoming_circle_edges=graph, - name="SPAG derived with S-FCI") + pag = pgraph.AugmentedPAG(incoming_circle_edges=graph, name="SPAG derived with S-FCI") # get the graph attributes pag.graph = graph.graph @@ -228,4 +229,4 @@ def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: # for s_node in self.context_.s_nodes: # domain_ids = self.context_.domain_map[s_node] # pag.add_s_node(s_node, domain_ids=domain_ids, node_changes=) - return pag \ No newline at end of file + return pag diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index d9e27e3d5..aafc5e718 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -13,10 +13,10 @@ from dodiscover.ci import BaseConditionalIndependenceTest from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import is_in_sep_set +from dodiscover.context import Context from dodiscover.typing import Column, SeparatingSet from .._protocol import EquivalenceClass -from ..context import Context from .utils import _find_neighbors_along_path logger = logging.getLogger() @@ -38,6 +38,7 @@ def _test_xy_edges( data: pd.DataFrame, context: Context, cross_distribution_test: bool = False, + group_with_snode =None, ) -> Dict[str, Any]: """Private function used to test edge between X and Y in parallel for candidate separating sets. @@ -80,6 +81,8 @@ def _test_xy_edges( size_cond_set=size_cond_set, ) + # TODO: figure out more elegant way of doing this + old_xvar = None # now iterate through the possible parents for comb_idx, cond_set in enumerate(conditioning_sets): # check the number of combinations of possible parents we have tried @@ -103,6 +106,9 @@ def _test_xy_edges( data_j[x_var] = 1 this_data = pd.concat((data_i, data_j), axis=0) + if group_with_snode is not None: + old_xvar = x_var + x_var = frozenset({x_var, group_with_snode}) try: # compute conditional independence test test_stat, pvalue = parallel_fun( @@ -126,6 +132,7 @@ def _test_xy_edges( result: Dict[str, Any] = dict() result["x_var"] = x_var + result['old_xvar'] = old_xvar result["y_var"] = y_var result["cond_set"] = list(cond_set) result["test_stat"] = test_stat @@ -310,6 +317,7 @@ def _learn_skeleton( skipped_y_nodes=None, skipped_z_nodes=None, cross_distribution_test: bool = False, + group_with_snode=None, ): """Core function for learning the skeleton of a causal graph. @@ -433,6 +441,7 @@ def _learn_skeleton( data, context, cross_distribution_test, + group_with_snode=group_with_snode ) out.append(result) else: @@ -450,6 +459,7 @@ def _learn_skeleton( data, context, cross_distribution_test, + group_with_snode=group_with_snode ) for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( possible_x_nodes, @@ -467,9 +477,15 @@ def _learn_skeleton( x_var = result["x_var"] y_var = result["y_var"] cond_set = result["cond_set"] + old_xvar = result["old_xvar"] + if group_with_snode is not None: + self._postprocess_ci_test(context, group_with_snode, y_var, test_stat, pvalue) + self._postprocess_ci_test(context, old_xvar, y_var, test_stat, pvalue) + else: + self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) # post-process the CI test results - self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) + # self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) # two variables found to be independent given a separating set if pvalue > self.alpha: @@ -1091,12 +1107,9 @@ def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): # if there is no second stage skeleton method to be run, then we # will stop with the skeleton here - print(self.second_stage_condsel_method) - print(context) if self.second_stage_condsel_method is None: self.context_ = deepcopy(context.copy()) self.adj_graph_ = deepcopy(context.init_graph.copy()) - print("Shuldnt run second stage...") return self # setup context for the second round-of learning @@ -1208,6 +1221,23 @@ def __init__( self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets + def _prep_second_stage_skeleton(self, context: Context) -> Context: + # prepare the context object for the second stage of learning + # all separating sets are either: + # i) augmented with all F-nodes, or + # ii) augmented with all F-nodes except intervention index 'i' + # R9 allows us to leverage F-nodes being not in separating sets to + # augment all separating sets that have non-empty sets with all + # F-nodes to keep consistency with the algorithm + for x_var, y_vars in self.sep_set_.items(): + for y_var in y_vars: + sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + if len(sep_sets) > 0: + for idx in range(len(sep_sets)): + self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) + + return super()._prep_second_stage_skeleton(context) + def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = True) -> None: # ensure data is a list if isinstance(data, pd.DataFrame): @@ -1253,8 +1283,19 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr cross_distribution_test=False, ) - # keep track of the observational skeleton graph - obs_skel_graph = self.adj_graph_.copy() + context = self._prep_second_stage_skeleton(context) + + # secibd learn the skeleton using only "PDS data" + self._learn_skeleton( + data=obs_data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.ci_estimator, + possible_x_nodes=list(context.get_non_augmented_nodes()), + skipped_y_nodes=context.get_augmented_nodes(), + skipped_z_nodes=context.get_augmented_nodes(), + cross_distribution_test=False, + ) # prepare the context object for the second stage of learning # all separating sets are either: @@ -1268,47 +1309,7 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore if len(sep_sets) > 0: for idx in range(len(sep_sets)): - self.sep_set_[x_var][y_var][idx].update(f_nodes) - - # index all datasets, where the first one may be observational - non_f_nodes = context.get_non_augmented_nodes() - - # reset the init graph and this time learn the skeleton using - # interventional distributions - # create a complete subgraph of F-nodes with all other nodes - for node in f_nodes: - for obs_node in set(non_f_nodes): - if node == obs_node: - continue - self.adj_graph_.add_edge(node, obs_node, test_stat=np.inf, pvalue=-1e-5) - - # reset context and add observational skeleton - context.add_state_variable("obs_skel_graph", obs_skel_graph) - - # convert the undirected skeleton graph to a PAG, where - # all left-over edges have a "circle" endpoint - sep_set = self.sep_set_ - import pywhy_graphs - - pag = pywhy_graphs.PAG(incoming_circle_edges=obs_skel_graph, name="PAG derived with FCI") - - # orient colliders - self._orient_unshielded_triples(pag, sep_set) - - context.add_state_variable("PAG", pag) - context.add_state_variable("max_path_length", self.max_path_length_) - - # secibd learn the skeleton using only "PDS data" - self._learn_skeleton( - data=obs_data, - context=context, - condsel_method=self.second_stage_condsel_method, - conditional_test_func=self.ci_estimator, - possible_x_nodes=list(context.get_non_augmented_nodes()), - skipped_y_nodes=context.f_nodes, - skipped_z_nodes=context.f_nodes, - cross_distribution_test=False, - ) + self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) # now, we'll fit the data using interventional data by looping over all # combinations of F-nodes and their neighbors @@ -1319,8 +1320,8 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr condsel_method=self.second_stage_condsel_method, conditional_test_func=self.cd_estimator, possible_x_nodes=list(self.context_.f_nodes), - skipped_y_nodes=context.f_nodes, - skipped_z_nodes=context.f_nodes, + skipped_y_nodes=context.get_augmented_nodes(), + skipped_z_nodes=context.get_augmented_nodes(), cross_distribution_test=True, ) @@ -1397,9 +1398,9 @@ class LearnMultiDomainSkeleton(LearnInterventionSkeleton): experimental distribution dataset, or one may not know the explicit targets. If the interventional targets are known, then the skeleton discovery algorithm of :footcite:`Kocaoglu2019characterization` is used. That is we learn the skeleton of a - AugmentedPAG. Otherwise, we will not know the intervention targets, and use the skeleton discovery - algorithm described in :footcite:`Jaber2020causal`. To define intervention targets, one - must use the :class:`dodiscover.InterventionalContextBuilder`. + AugmentedPAG. Otherwise, we will not know the intervention targets, and use the skeleton + discovery algorithm described in :footcite:`Jaber2020causal`. To define intervention + targets, one must use the :class:`dodiscover.InterventionalContextBuilder`. References ---------- @@ -1479,7 +1480,8 @@ def _create_augmented_nodes( augmented_nodes : List Set of augmented nodes (i.e. F and S nodes). symmetric_diff_map : Dict[Any, FrozenSet] - Mapping of augmented nodes to intervention targets, or distribution indices represented by the node. + Mapping of augmented nodes to intervention targets, or distribution indices represented + by the node. sigma_map : Dict[Any, FrozenSet] Mapping of augmented nodes to distribution indices represented by the node. node_domain_map : Dict[Any, FrozenSet] @@ -1528,8 +1530,8 @@ def _create_augmented_nodes( seen_domain_pairs[distr_memo_key] = None seen_distr_pairs[domain_memo_key] = None - # map each augmented-node to a tuple of distribution indices, or to a set of nodes representing - # the intervention targets + # map each augmented-node to a tuple of distribution indices, or to a set of nodes + # representing the intervention targets if intervention_targets[idx] is None or intervention_targets[jdx] is None: targets = frozenset([idx, jdx]) else: @@ -1631,7 +1633,7 @@ def fit( for node in augmented_nodes: if node[0] == "S": s_nodes.append(node) - elif node[0] == 'F': + elif node[0] == "F": f_nodes.append(node) n_domains = len(np.unique(domain_indices)) @@ -1646,9 +1648,46 @@ def fit( # first learn the skeleton using only "observational data" # initially learn the skeleton without using PDS information # apply algorithm to learn skeleton - self._fit(obs_data, context, list(causal_nodes), augmented_nodes, augmented_nodes, debug=debug) + # first learn the skeleton using only "observational data" + self._learn_skeleton( + data=obs_data, + context=context, + condsel_method=self.condsel_method, + conditional_test_func=self.ci_estimator, + possible_x_nodes=list(context.get_non_augmented_nodes()), + skipped_y_nodes=context.get_augmented_nodes(), + skipped_z_nodes=context.get_augmented_nodes(), + cross_distribution_test=False, + ) + context = self._prep_second_stage_skeleton(context) + # secibd learn the skeleton using only "PDS data" + self._learn_skeleton( + data=obs_data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.ci_estimator, + possible_x_nodes=list(context.get_non_augmented_nodes()), + skipped_y_nodes=context.get_augmented_nodes(), + skipped_z_nodes=context.get_augmented_nodes(), + cross_distribution_test=False, + ) + + # prepare the context object for the second stage of learning + # all separating sets are either: + # i) augmented with all F-nodes, or + # ii) augmented with all F-nodes except intervention index 'i' + # R9 allows us to leverage F-nodes being not in separating sets to + # augment all separating sets that have non-empty sets with all + # F-nodes to keep consistency with the algorithm + for x_var, y_vars in self.sep_set_.items(): + for y_var in y_vars: + sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + if len(sep_sets) > 0: + for idx in range(len(sep_sets)): + self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) + # loop through each domain to learn the F-node skeleton seen_domain_pairs = set() for idx, source in enumerate(range(1, n_domains + 1)): @@ -1668,15 +1707,17 @@ def fit( break if s_node is None: continue - raise RuntimeError('wtf') + raise RuntimeError("wtf") this_f_nodes = [ node for node in f_nodes if node_domain_map[node] == {source, target} and node in symmetric_diff_map ] if debug: - print(f'Trying to learn skeleton for {source} and {target} to remove F-nodes: {this_f_nodes} ' - f'grouped with S-node: {s_node}') + print( + f"Trying to learn skeleton for {source} and {target} to remove F-nodes: " + f"{this_f_nodes} grouped with S-node: {s_node}" + ) self._learn_skeleton( data=data, context=context, @@ -1687,7 +1728,7 @@ def fit( skipped_z_nodes=skip_nodes, cross_distribution_test=True, group_with_snode=s_node, - debug=debug, + # debug=debug, ) # this is only possible if there is explicitly observational data between @@ -1707,7 +1748,10 @@ def fit( print(sigma_map) if this_s_nodes: if debug: - print(f'Trying to learn skeleton for {source} and {target} to remove S-nodes: {this_s_nodes}') + print( + f"Trying to learn skeleton for {source} and {target} to remove " + f"S-nodes: {this_s_nodes}" + ) self._learn_skeleton( data=data, context=context, @@ -1722,7 +1766,7 @@ def fit( # analyze F-nodes only within the 'source' domain source_fnodes = [node for node in augmented_nodes if node_domain_map[node] == {source}] if debug: - print(f'Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}') + print(f"Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}") # apply algorithm to learn skeleton among the F-node subgraph within a single domain self._learn_skeleton( data=data, diff --git a/dodiscover/datasets/linear.py b/dodiscover/datasets/linear.py index f3c37d8fb..a72499b79 100644 --- a/dodiscover/datasets/linear.py +++ b/dodiscover/datasets/linear.py @@ -1,6 +1,5 @@ from typing import Dict -import networkx as nx import numpy as np diff --git a/dodiscover/datasets/multidomain.py b/dodiscover/datasets/multidomain.py index da7b7e726..dc8e9369a 100644 --- a/dodiscover/datasets/multidomain.py +++ b/dodiscover/datasets/multidomain.py @@ -1,6 +1,5 @@ from typing import Dict -import networkx as nx import numpy as np diff --git a/examples/plot_sfci_alg.py b/examples/plot_sfci_alg.py new file mode 100644 index 000000000..663b56cc2 --- /dev/null +++ b/examples/plot_sfci_alg.py @@ -0,0 +1,150 @@ +""" +.. _ex-psifci-algorithm: + +========================================================= +Causal discovery with interventional data - Sachs dataset +========================================================= + +We will analyze the Sachs dataset :footcite:`sachsdataset2005` and reproduce analyses +from the Supplemental Figure 8 in :footcite:`Jaber2020causal` demonstrating the +usage of the :class:`dodiscover.constraint.PsiFCI` algorithm for learning causal graphs +from observational and interventional data. + +.. currentmodule:: dodiscover +""" + + +# %% +# Authors: Adam Li +# +# License: BSD (3-clause) + +from pywhy_graphs.viz import draw +from dodiscover.ci import GSquareCITest +from dodiscover import SFCI, Context, make_context, InterventionalContextBuilder + +import numpy as np +import pandas as pd +import bnlearn + +import pooch + +# %% +# Pull in the Sachs Dataset +# ------------------------- +# The Sachs dataset is a famous dataset in causal discovery because of its real-life +# applicability and access to experimental data that analyzed the causal network of +# 11 proteins using knockouts and spikings :footcite:`sachsdataset2005`. The pathways +# for those proteins are already known, so it is an ideal dataset for benchmarking +# causal discovery algorithms. +# +# We will download a preprocessed version of the dataset from the following +# url: https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz +# +# Ref: https://erdogant.github.io/bnlearn/pages/html/bnlearn.bnlearn.html#bnlearn.bnlearn.import_example # noqa + +# use pooch to download robustly from a url +url = "https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz" +file_path = pooch.retrieve( + url=url, + known_hash="md5:39ee257f7eeb94cb60e6177cf80c9544", +) + +df = pd.read_csv(file_path, delimiter=" ") + +# the ground-truth dag is shown here: XXX: comment in when errors are fixed +ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) +fig = bnlearn.plot(ground_truth_dag) + +# .. note:: +# The Sachs dataset has previously been preprocessed, and the steps are described +# in bnlearn, at the web-page https://www.bnlearn.com/research/sachs05/. +print(df.head()) +print(df.shape) + +# %% +# Preprocess the dataset +# ---------------------- +# Since the data is one dataframe, we need to process it into a form +# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We +# will form a list of separate dataframes. +unique_ints = df["INT"].unique() + +# get the list of intervention targets and list of dataframe associated with each intervention +intervention_targets = [df.columns[idx] for idx in unique_ints] +data_cols = [col for col in df.columns if col != "INT"] +data = [] +domain_ids = np.array([0, 0, 0, 0, 0, 1]) +for interv_idx in unique_ints: + _data = df[df["INT"] == interv_idx][data_cols] + data.append(_data) + +print(len(data), len(intervention_targets)) +# %% +# Setup constraint-based learner +# ------------------------------ +# Since we have access to interventional data, the causal discovery algorithm +# we will use that leverages CI and CD tests to estimate causal constraints +# is the Psi-FCI algorithm :footcite:`Jaber2020causal`. + +# Our dataset is comprised of discrete valued data, so we will utilize the +# G^2 (Chi-square) CI test. +ci_estimator = GSquareCITest(data_type="discrete") + +# Since our data is entirely discrete, we can also use the G^2 test as our +# CD test. +cd_estimator = GSquareCITest(data_type="discrete") + +alpha = 0.05 +learner = SFCI( + ci_estimator=ci_estimator, + cd_estimator=cd_estimator, + alpha=alpha, + max_combinations=10, + max_cond_set_size=4, + n_jobs=-1, +) + +# create context with information about the interventions +ctx_builder = make_context(create_using=InterventionalContextBuilder) +ctx: Context = ctx_builder.variables(data=data[0]).num_distributions(len(data)).build() + +# %% +# Run the learning process +# ------------------------ +# We have setup our causal context and causal discovery learner, so we will now +# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's +# `fit` design. All fitted attributes contain an underscore at the end. +learner = learner.fit( + data, ctx, domain_indices=domain_ids, intervention_targets=intervention_targets +) + +# %% +# Analyze the results +# =================== +# Now that we have learned the graph, we will show it here. Note differences and similarities +# to the ground-truth DAG that is "assumed". Moreover, note that this reproduces Supplementary +# Figure 8 in :footcite:`Jaber2020causal`. +est_pag = learner.graph_ + +print(f"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG") + +# %% +# Visualize the full graph including the F-node +dot_graph = draw(est_pag, direction="LR") +dot_graph.render(outfile="psi_pag_full.png", view=True, cleanup=True) + +# %% +# Visualize the graph without the F-nodes +est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes()) +dot_graph = draw(est_pag_no_fnodes, direction="LR") +dot_graph.render(outfile="psi_pag.png", view=True, cleanup=True) + +# Interpretation +# -------------- +# Looking at the supplemental figure 8b in :footcite:`Jaber2020causal`, we see that the +# learned PAG matches quite well. + +# References +# ---------- +# .. footbibliography:: diff --git a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py index c63c8bd6f..c8efab4d1 100644 --- a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py +++ b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py @@ -161,4 +161,4 @@ def test_basic_multidomain_fsnode_skeleton_with_lindata(): # check the skeleton after intervention print(skel_graph.edges()) print(expected_skeleton.edges()) - assert nx.is_isomorphic(expected_skeleton, skel_graph) \ No newline at end of file + assert nx.is_isomorphic(expected_skeleton, skel_graph) From fd1af9b1f787ebc318bb7b4523d635b3aa5d4ff4 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 24 May 2023 10:19:44 -0400 Subject: [PATCH 54/61] Almost there Signed-off-by: Adam Li --- .../multi-domain/random-graph-analysis.ipynb | 18 +++++++-------- dodiscover/cd/base.py | 2 +- dodiscover/constraint/skeleton.py | 22 +++++++++++-------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/doc/tutorials/multi-domain/random-graph-analysis.ipynb b/doc/tutorials/multi-domain/random-graph-analysis.ipynb index 24eeb43bc..923042d2e 100644 --- a/doc/tutorials/multi-domain/random-graph-analysis.ipynb +++ b/doc/tutorials/multi-domain/random-graph-analysis.ipynb @@ -198,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 25, "id": "bde56fd2-6adc-4181-8efb-acdc2945ead8", "metadata": { "tags": [] @@ -206,27 +206,27 @@ "outputs": [ { "ename": "Exception", - "evalue": "The y variables are not all in the DataFrame.", + "evalue": "unhashable type: 'set'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31m_RemoteTraceback\u001b[0m Traceback (most recent call last)", - "\u001b[0;31m_RemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 114, in _test_xy_edges\n test_stat, pvalue = parallel_fun(\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 685, in evaluate_edge\n test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/cd/kernel_test.py\", line 134, in test\n self._check_test_input(df, y_vars, group_col, x_vars)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/cd/base.py\", line 42, in _check_test_input\n raise ValueError(\"The y variables are not all in the DataFrame.\")\nValueError: The y variables are not all in the DataFrame.\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 428, in _process_worker\n r = call_item()\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 275, in __call__\n return self.fn(*self.args, **self.kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\", line 620, in __call__\n return self.func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in __call__\n return [func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in \n return [func(*args, **kwargs)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 123, in _test_xy_edges\n raise Exception(e)\nException: The y variables are not all in the DataFrame.\n\"\"\"", + "\u001b[0;31m_RemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 113, in _test_xy_edges\n test_stat, pvalue = parallel_fun(\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 689, in evaluate_edge\n test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z)\nTypeError: unhashable type: 'set'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 428, in _process_worker\n r = call_item()\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 275, in __call__\n return self.fn(*self.args, **self.kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\", line 620, in __call__\n return self.func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in __call__\n return [func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in \n return [func(*args, **kwargs)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 127, in _test_xy_edges\n raise Exception(e)\nException: unhashable type: 'set'\n\"\"\"", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_59486/3346600287.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 104\u001b[0m )\n\u001b[0;32m--> 105\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 106\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_59486/2593794972.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 104\u001b[0m )\n\u001b[0;32m--> 105\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 106\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m )\n\u001b[0;32m---> 70\u001b[0;31m self.skeleton_learner_.fit(\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m )\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1719\u001b[0m \u001b[0;34mf\"{this_f_nodes} grouped with S-node: {s_node}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1720\u001b[0m )\n\u001b[0;32m-> 1721\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1722\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1723\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 449\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 450\u001b[0m delayed(_test_xy_edges)(\n\u001b[1;32m 451\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1723\u001b[0m \u001b[0;34mf\"{this_f_nodes} grouped with S-node: {s_node}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1724\u001b[0m )\n\u001b[0;32m-> 1725\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1726\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1727\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode)\u001b[0m\n\u001b[1;32m 451\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 452\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 453\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 454\u001b[0m delayed(_test_xy_edges)(\n\u001b[1;32m 455\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 973\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 974\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 975\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 976\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 565\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 566\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 567\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 568\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mCfTimeoutError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 444\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 445\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 446\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 447\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 390\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 391\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 392\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0;31m# Break a reference cycle with the exception in self._exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: The y variables are not all in the DataFrame." + "\u001b[0;31mException\u001b[0m: unhashable type: 'set'" ] } ], @@ -332,7 +332,7 @@ " cd_estimator=KernelCDTest(null_reps=500),\n", " alpha=alpha,\n", " debug=False,\n", - " n_jobs=n_jobs,\n", + " n_jobs=1,\n", " max_cond_set_size=max_cond_set_size,\n", " )\n", " learner.fit(\n", @@ -417,7 +417,7 @@ " parameters[\"p_edge\"].append(p)\n", " parameters[\"n_nodes\"].append(n_nodes)\n", " # break\n", - " # break\n", + " break\n", " break\n", " break" ] diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index 20add5f82..f447c9e51 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -39,7 +39,7 @@ def _check_test_input( if x_vars is not None and any(col not in df.columns for col in x_vars): raise ValueError("The x variables are not all in the DataFrame.") if any(col not in df.columns for col in y_vars): - raise ValueError("The y variables are not all in the DataFrame.") + raise ValueError(f"The y variables, {y_vars} are not all in the DataFrame: {df.columns}") if group_col_var not in df.columns: raise ValueError(f"The group column {group_col_var} is not in the DataFrame.") diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index aafc5e718..d2f570e08 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -82,7 +82,7 @@ def _test_xy_edges( ) # TODO: figure out more elegant way of doing this - old_xvar = None + new_x_var = None # now iterate through the possible parents for comb_idx, cond_set in enumerate(conditioning_sets): # check the number of combinations of possible parents we have tried @@ -106,14 +106,18 @@ def _test_xy_edges( data_j[x_var] = 1 this_data = pd.concat((data_i, data_j), axis=0) - if group_with_snode is not None: - old_xvar = x_var - x_var = frozenset({x_var, group_with_snode}) try: - # compute conditional independence test - test_stat, pvalue = parallel_fun( - this_data, conditional_test_func, x_var, y_var, set(cond_set) - ) + if group_with_snode is not None: + new_x_var = set([x_var, group_with_snode]) + # compute conditional independence test + test_stat, pvalue = parallel_fun( + this_data, conditional_test_func, new_x_var, y_var, set(cond_set) + ) + else: + # compute conditional independence test + test_stat, pvalue = parallel_fun( + this_data, conditional_test_func, x_var, y_var, set(cond_set) + ) except Exception as e: if "Not enough samples." in str(e): print(e) @@ -132,7 +136,7 @@ def _test_xy_edges( result: Dict[str, Any] = dict() result["x_var"] = x_var - result['old_xvar'] = old_xvar + result['old_xvar'] = new_x_var result["y_var"] = y_var result["cond_set"] = list(cond_set) result["test_stat"] = test_stat From df678a52a45c34002a59378490d787ab182e95a7 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 9 Jun 2023 14:20:00 -0400 Subject: [PATCH 55/61] SFCI algo wip Signed-off-by: Adam Li --- Untitled.ipynb | 256 +++++++ doc/tutorials/markovian/Untitled.ipynb | 6 + .../multi-domain/example-sfci-algo.ipynb | 717 ++++++++++++++++-- .../multi-domain/random-graph-analysis.ipynb | 371 ++++----- dodiscover/cd/base.py | 19 +- dodiscover/cd/bregman.py | 2 +- dodiscover/cd/kernel_test.py | 105 +-- dodiscover/cd/residual.py | 154 ++++ dodiscover/ci/kernel_utils.py | 6 + dodiscover/ci/oracle.py | 7 +- dodiscover/constraint/skeleton.py | 266 ++++--- dodiscover/metrics.py | 2 + examples/plot_sfci_alg.py | 2 +- examples/plot_sfci_with_artificial_sachs.py | 207 +++++ tests/unit_tests/conditional/cd/test_cd.py | 88 ++- .../skeleton/test_multidomain_skeleton.py | 237 +++++- 16 files changed, 2000 insertions(+), 445 deletions(-) create mode 100644 Untitled.ipynb create mode 100644 doc/tutorials/markovian/Untitled.ipynb create mode 100644 dodiscover/cd/residual.py create mode 100644 examples/plot_sfci_with_artificial_sachs.py diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 000000000..fbde50e50 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,256 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 9, + "id": "938fea3f-4cd8-476b-9e29-64c3c4d92d65", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e0cb2aef-909f-4efd-90a8-98cd10ae6b64", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " Name Sex Age SibSp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titanic = pd.read_csv(\"~/harvard_survery_data.csv\")\n", + "\n", + "titanic.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c3272fb4-3019-418e-89b5-37ce1556210e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "29.69911764705882 +/- 14.526497332334042\n" + ] + } + ], + "source": [ + "print(titanic[\"Age\"].mean(), \"+/-\", titanic[\"Age\"].std())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ac4ed766-9a66-4894-9331-3b2cf779a8ae", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAekAAAHpCAYAAACmzsSXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8EklEQVR4nO3deXxU1f3/8XeSyWQSQhYTCUuDUEPByipLRBa/aCou1eLSUquCKLUqIIq1gAvYKgS/Vr+oUGktqP1VNjdqxWJtcMNSKZtgVRalgkqCIGSSkHXm/v6AGWaS2TJJmBPzej4e89DcOefM5565d97M5J5MnGVZlgAAgHHiY10AAAAIjJAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGCoNhfSlmXJ6XSK5eEAANO1uZAuKytTenq6ysrKYl0KAAAhtbmQBgCgtSCkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEPZYl1Aa1V6tEaHKmpU53LLLamssk7tkhKUnJigJFu84uPidLiyVs7KWqUnJyotOVGyLJVW1clZWavs9olKstlUdvzn9OREpTpsSpB0xGdbmsMmW0K8vqmokbOqTmnJNmWm2OWwxetgeY2cVbVKS05Udju7qurcOny8XXqyTalJNpXX1Kn06Il+OWmOgPtSfyxJ3m0ZyYlKSkyQs7LWrwbLbfntY2ZyouosS06f+ts7bIqTvPvt2SbJ2y4zNVEpif5zEaxffFycjoSYV8+cWT7je+a2oqZORyqO/ZzhsKlOiugxfWvNSElUuySbyqvrVHrUp656z1ugsYI9Ztjx7QnH2tS4/PYnvt746Q6bXGHG9/S11bm1v/LE811eXefXJt1hk7tev0D7lOqwqbKuTofLjx0XWSl2VbvcDY7r9km2BsfY0RqX33OZcfz4qd/3O5kpYY/X+vU3OJdSEo+dDz7zmuawKSEh3nvOeI5rt9tqcIy1syc0eMyKGpdKfdq1d9hUW+fW4crA52Soc/CrI5V+Y6UlJ6pzRrJfmxJnVURjBWoXL+lQBH0RXKDjLj3F3uKPG9OQfuedd/Twww9r06ZN2r9/v15++WWNGTMmZJ+33npL06ZN03/+8x/l5ubq3nvv1fXXX39S6vX46kilZv3lQ/0sv6ueXrdH7+4+5L1vWF6WJo/KU4c0h65b/L4OltdIkobnZen+y87UdYvfV+d0hx6/+ixNf3Gb3vPpOyIvW5NGna4bnt2oozWuY9t6ZOvW/zldN/psOzZWb/30D+t1sLxGKfYELbl+sBau3eVXy/C8LF0/rLtuW7ZFR2tcGp6XpbmX91HXrHZ++zL9xW16d9fBE3X0yNakUXm64Zl/K8WeoOcmnq17//KBX62++3OwvEa5mcn6fzcO0T2rPmzUPnnG952LFHuCFo8fpN+9udtvfwLNRcDxA2zznYsUe4KW3zRUs1/5MORjBqvDdyxJgWutV0N2qr3BY9bfJ0l6/OoBevq9PUHb+B8Doec/VP0PjumjFRv+q1e2lTQ4doIdT8HqeGBMb925cqsyUxL1+NVn6Z5V2xt9XAebn+F5WZpzeR+ddvyYDXa8RnJcNDwGztbsCM7BxpxvD4zprduWbVFlrSvo/tQ/Bz8/VKG7X94ecr/3HqrQzABt6o8VrN39l52pa+u9HtXvi+ACHXcje2Rr3pV9G/xjqrnFWZZltegjhPC3v/1N7733ngYOHKgrrrgibEjv2bNHvXv31s0336yJEyeqqKhIt99+u1avXq3Ro0dH9JhOp1Pp6ekqLS1VWlpao2suPVqjycu2qF9uhrbuPax1PieDx7C8LP2wTyd1SHN4X3ylYyfGhGHddfqp7RqEmW/fAV0ztWDt7pDbPGPd+OxGTT4vT1v2Ho5ovOF5WXrkJ/2Vk+bw7ovvgVe/34DcDC2pFxqBanhl8jA9tOaTRu9ToPEbsz/RbIv0MSOpQ1JEtS4ePyjoPDZ2LI9w8x+q/uF5WSq8vI9WbPoiqv2uX8evLuylNIct6uM61PwMz8vSvCv7qn2SLezx2pRjINw+RnK+eebi67LqkPvjOQe/OlKpu174IGi7/72qnxLi4zRt5dawY5U4q0K289QfqC+CC/U6ObJHtp64ekCLvqOO6e+kL7roIj344IO6/PLLI2q/aNEide/eXY888ojOOOMMTZ48WVdddZX+7//+L2if6upqOZ1Ov1tTHCyv0bu7DmpAbkbAgJak93YfUoc0hzqkJfltX7f7kDqkJamy1h3wRPL0HZCbEXabZyxJGpCbEfF463Yf0uGKGr99CdWvQ1pS0LF9a7AlxEe1T4HGb8z+RLMt0seMpI5Iaw01j40dyyPc/Icab93uQyqvcUW93/XHsiXEN+m4DneclVXVRXS8Rrotkuejfg2RnG+euQi3P55zsLSyNmS70spaHa6oiWiscO0CvR55+iK4UMfdO7sOej+daCmt6sKx9evXq6CgwG/b6NGjtX79+qB9CgsLlZ6e7r3l5uY2qQZnVa0kqbrOHbJddZ1b5VWuBtvLq479XjFc30i2ecaPpBZfzqq64/8NX0egfQhUQ1mU+xRo/MbuT2O3RfqYkdQRaa3h5rExY/kKNf/hxiurrI16vwON1ZTjOtz8lFXVRnS8RrotkuejvkjPt7LK2rDje8/BMHN2bL/rIhsrTLtANYXrg/Cvk2Vh7m+qVhXSxcXFysnJ8duWk5Mjp9OpysrKgH1mzpyp0tJS723fvn1NqiHNkShJSrKFnrokW7xSHQkNtqc6Eo5d7BSmbyTbPONHUouvtOMXE3n2JVS/QPsQqIb2Ue5ToPEbuz+N3RbpY0ZSR6S1hpvHxozlK9T8hxuvfXJi1PsdaKymHNfh5qe9IzGi4zXSbZE8H/VFer61T04MO773HAwzZ8f2O/SlQyfO59DtAtUUrg/Cv062D3N/U7WqkI5GUlKS0tLS/G5NkZ1q18ge2dqy74hG5GUFbDMsL0sHnFU64Kz22z48L0sHnNVKTozX8BB9t+w7EnabZyxJ2rLviIZFON7wvCxlHr9627MvofodcFYHrdW3hjqXO6p9CjR+Y/Ynmm2RPmYkdURaa6h5bOxYHuHmP9R4w/OylGpPiHq/649V53I36bgOd5y1d9giOl4j3RbJ81G/hkjON89chNsfzzmYnpwYsl16cqIy29kjGitcu0CvR56+CC7UcTeyR7ayU1t2DltVSHfs2FElJSV+20pKSpSWlqbk5Ja9ws4jPcWueVf21Y79Tk0Y3l0j8vyfvGNXd/fQkO9mafqL27zbPVeITn9xm25btkUPjunT4IQakZetKef10JJ1e05s65GtyaP8t/mOJUlL1u3RlPN6NKjFc7GIp6/nik7PhSKefal/AI7ocaKO6S9u030/PLNBrfVrmPTcZj04pnej9ynQ+EvW7dHkUXkaEaCu+nMxIi9bUyLY5jsX01/cpvsv6x32MYPV4TtW0Frr1RDoMevv05J1ezRhWPeQbRoz/6Hqn3N5Hy18c2fAYyfY8RSsjgfG9NGk5zY36bgONj+eWr+TmRLyeA14XJwX7hhoeFwHO3YiPd88cxFqf3zPwc4ZyZpzecM58+x354xk5aQ5NDdIG9+xQrXzrT9QXwQX7Lgb2SNbD13Zt8WXYcX06m5fcXFxYa/unj59ul577TVt377du+1nP/uZvvnmG61Zsyaix2nq1d0egdZJpxxfJ+3wWSddVlWr9o5Epfus5y2rqtUpqYlyHF8n7WnT3mdtp7df/XXSDpsy251YJ+1pl53acE1me9910sf7hVon7TuWJO+29PrrpI+P5Vkn7el3is86ac+2NJ+1tb7bJHnbZbQ7sU46XD/POulg8+qZM8tnfM/cVtQcWyPb3pGoTJ81y42pNS35xHpbZ6VPXfWet0BjBXvMsOP7rJP23Z/4euNn+KyTDja+p6+tzq3iyhPPt2edse9Y7nr9Au1Te9910g6bstqdWCft28azTtr3GPOsk/bOj886ad++wdZJ+45Vv/5A51J7h/+8ptdfJ338uPask/Y9xjzrpH0f07NO2nd+auvcOuIzr37nZIhz0LNO2vcxQ66TDjFWoHZ+66RD9EVwgY67k7FOOqYhXV5ert27jy1zGDBggB599FGNGjVKp5xyirp27aqZM2fqyy+/1J/+9CdJJ5ZgTZo0STfccIPWrl2r22677aQuwQIA4GSJ6cfdGzdu1IABAzRgwABJ0rRp0zRgwADNmjVLkrR//37t3bvX27579+5avXq13njjDfXr10+PPPKI/vjHP0Yc0AAAtCbGfNx9svBOGgDQWrSqC8cAAGhLCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADBXzkF64cKG6desmh8Oh/Px8bdiwIWT7+fPnq2fPnkpOTlZubq7uuOMOVVVVnaRqAQA4eWIa0itWrNC0adM0e/Zsbd68Wf369dPo0aN14MCBgO2XLl2qGTNmaPbs2fr444+1ePFirVixQnffffdJrhwAgJYXZ1mWFasHz8/P1+DBg7VgwQJJktvtVm5urqZMmaIZM2Y0aD958mR9/PHHKioq8m6788479f7772vdunURPabT6VR6erpKS0uVlpbWPDsCAEALiNk76ZqaGm3atEkFBQUniomPV0FBgdavXx+wzznnnKNNmzZ5PxL/7LPP9Nprr+niiy8O+jjV1dVyOp1+NwAAWgNbrB744MGDcrlcysnJ8duek5OjTz75JGCfn/3sZzp48KCGDx8uy7JUV1enm2++OeTH3YWFhfr1r3/drLUDAHAyxPzCscZ46623NHfuXP3ud7/T5s2b9dJLL2n16tV64IEHgvaZOXOmSktLvbd9+/adxIoBAIhezN5JZ2dnKyEhQSUlJX7bS0pK1LFjx4B97rvvPl133XWaOHGiJKlPnz6qqKjQTTfdpHvuuUfx8Q3/zZGUlKSkpKTm3wEAAFpYzN5J2+12DRw40O8iMLfbraKiIg0dOjRgn6NHjzYI4oSEBElSDK9/AwCgRcTsnbQkTZs2TePHj9egQYM0ZMgQzZ8/XxUVFZowYYIkady4cerSpYsKCwslSZdeeqkeffRRDRgwQPn5+dq9e7fuu+8+XXrppd6wBgDg2yKmIT127Fh9/fXXmjVrloqLi9W/f3+tWbPGezHZ3r17/d4533vvvYqLi9O9996rL7/8UqeeeqouvfRSzZkzJ1a7AABAi4npOulYYJ00AKC1aFVXdwMA0JYQ0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQMQ/phQsXqlu3bnI4HMrPz9eGDRtCtj9y5IgmTZqkTp06KSkpSd/73vf02muvnaRqAQA4eWyxfPAVK1Zo2rRpWrRokfLz8zV//nyNHj1aO3bsUIcOHRq0r6mp0Q9+8AN16NBBL7zwgrp06aLPP/9cGRkZJ794AABaWJxlWVasHjw/P1+DBw/WggULJElut1u5ubmaMmWKZsyY0aD9okWL9PDDD+uTTz5RYmJiVI/pdDqVnp6u0tJSpaWlNal+AABaUsw+7q6pqdGmTZtUUFBwopj4eBUUFGj9+vUB+7zyyisaOnSoJk2apJycHPXu3Vtz586Vy+UK+jjV1dVyOp1+NwAAWoOYhfTBgwflcrmUk5Pjtz0nJ0fFxcUB+3z22Wd64YUX5HK59Nprr+m+++7TI488ogcffDDo4xQWFio9Pd17y83Nbdb9AACgpcT8wrHGcLvd6tChg/7whz9o4MCBGjt2rO655x4tWrQoaJ+ZM2eqtLTUe9u3b99JrBgAgOjF7MKx7OxsJSQkqKSkxG97SUmJOnbsGLBPp06dlJiYqISEBO+2M844Q8XFxaqpqZHdbm/QJykpSUlJSc1bPAAAJ0HM3knb7XYNHDhQRUVF3m1ut1tFRUUaOnRowD7Dhg3T7t275Xa7vdt27typTp06BQxoAABas5h+3D1t2jQ99dRTevbZZ/Xxxx/rlltuUUVFhSZMmCBJGjdunGbOnOltf8stt+ibb77R1KlTtXPnTq1evVpz587VpEmTYrULAAC0mJiukx47dqy+/vprzZo1S8XFxerfv7/WrFnjvZhs7969io8/8e+I3Nxcvf7667rjjjvUt29fdenSRVOnTtX06dNjtQsAALSYmK6TjgXWSQMAWotWdXU3AABtCSENAIChCGkAAAxFSAMAYChCGgAAQ0W8BOuKK66IeNCXXnopqmIAAMAJEb+T9v2SirS0NBUVFWnjxo3e+zdt2qSioiKlp6e3SKEAALQ1Eb+Tfvrpp73/P336dP3kJz/RokWLvH9H2+Vy6dZbb2XtMQAAzSSqP2Zy6qmnat26derZs6ff9h07duicc87RoUOHmq3A5sYfMwEAtBZRXThWV1enTz75pMH2Tz75xO/LLwAAQPSi+tvdEyZM0I033qhPP/1UQ4YMkSS9//77mjdvnvfLMQAAQNNEFdK//e1v1bFjRz3yyCPav3+/pGPf9XzXXXfpzjvvbNYCAQBoq5r8BRtOp1OSWs3vd/mdNACgtYj6j5nU1dXpH//4h5YtW6a4uDhJ0ldffaXy8vJmKw4AgLYsqo+7P//8c1144YXau3evqqur9YMf/EDt27fXQw89pOrqai1atKi56wQAoM2J6p301KlTNWjQIB0+fFjJycne7ZdffrmKioqarTgAANqyqN5Jv/vuu/rnP/8pu93ut71bt2768ssvm6UwAADauqjeSbvdbrlcrgbbv/jiC7Vv377JRQEAgChD+oILLtD8+fO9P8fFxam8vFyzZ8/WxRdf3Fy1AQDQpkW1BOuLL77Q6NGjZVmWdu3apUGDBmnXrl3Kzs7WO++8ow4dOrRErc2CJVgAgNYi6nXSdXV1Wr58ubZt26by8nKdddZZuuaaa/wuJDMRIQ0AaC2iCumqqio5HI6WqKfFEdIAgNYiqt9Jd+jQQePHj9cbb7zBF2oAANBCogrpZ599VkePHtWPfvQjdenSRbfffrs2btzY3LUBANCmNelvd5eVlemFF17QsmXLtHbtWn33u9/Vtddeq1mzZjVnjc2Kj7sBAK1Fk79gw+Ojjz7SNddco23btgVcQ20KQhoA0FpE/QUb0rELyFauXKkxY8borLPO0jfffKO77rqruWoDAKBNi+rPgr7++utaunSpVq1aJZvNpquuukp///vfNXLkyOauDwCANiuqj7tTUlL0wx/+UNdcc40uvvhiJSYmtkRtLYKPuwEArUVU76RLSkr4G90AALSwiEPa6XR633laliWn0xm0Le9QAQBouohDOjMzU/v371eHDh2UkZGhuLi4Bm0sy1JcXJzRV3cDANBaRBzSa9eu1SmnnOL9/0AhDQAAmk+zrZNuLbhwDADQWkS1TrpHjx66//77tWvXruauBwAAHBdVSN96661avXq1evXqpcGDB+uxxx5TcXFxc9cGAECb1qSPu3fu3KnnnntOy5Yt0549ezRq1Chde+21GjduXHPW2Kz4uBsA0Fo02++k//Wvf+mWW27hb3cDANBMovpjJr42bNigpUuXasWKFXI6nfrxj3/cHHUBANDmRRXS9T/mPu+88/TQQw/piiuuUGpqanPXCABAmxRVSHsuGJs0aZJ++tOfKicnp7nrAgCgzWt0SLtcLv3+97/XVVddpczMzJaoCQAAKIolWAkJCZoyZYqOHDnSAuUAAACPqNZJ9+7dW5999llz1wIAAHxEFdIPPvigfvnLX+rVV1/V/v375XQ6/W4AAKDpolonHR9/Itt9v2ijNXwLFuukAQCtRVRXd7/55pvNXQcAAKiHb8ECAMBQUb2Tfuedd0LeP3LkyKiKAQAAJzT5d9LegXx+N83vpAEAaLqoru4+fPiw3+3AgQNas2aNBg8erL///e/NXSMAAG1SVB93p6enN9j2gx/8QHa7XdOmTdOmTZuaXBgAAG1dVO+kg8nJydGOHTuac0gAANqsqN5Jb9u2ze9ny7K0f/9+zZs3T/3792+OugAAaPOiCun+/fsrLi5O9a85O/vss7VkyZJmKQwAgLYuqpDes2eP38/x8fE69dRT5XA4mqUoAADQyN9Jr1+/Xq+++qpOO+007+3tt9/WyJEj1bVrV910002qrq5uqVoBAGhTGhXSv/nNb/Sf//zH+/P27dt14403qqCgQDNmzNBf//pXFRYWNnuRAAC0RY0K6a1bt+r888/3/rx8+XLl5+frqaee0rRp0/T4449r5cqVzV4kAABtUaNC+vDhw8rJyfH+/Pbbb+uiiy7y/jx48GDt27ev+aoDAKANa1RI5+TkeC8aq6mp0ebNm3X22Wd77y8rK1NiYmLzVggAQBvVqJC++OKLNWPGDL377ruaOXOmUlJSNGLECO/927Zt0+mnn97sRQIA0BY1agnWAw88oCuuuELnnnuuUlNT9eyzz8put3vvX7JkiS644IJmLxIAgLYoqm/BKi0tVWpqqhISEvy2f/PNN0pNTfULbtPwLVgAgNai2b5gQ5JOOeWUJhUDAABOaNYv2AAAAM2HkAYAwFBGhPTChQvVrVs3ORwO5efna8OGDRH1W758ueLi4jRmzJiWLRAAgBiIeUivWLFC06ZN0+zZs7V582b169dPo0eP1oEDB0L2++9//6tf/vKXfkvAAAD4Nonq6u7mlJ+fr8GDB2vBggWSJLfbrdzcXE2ZMkUzZswI2MflcmnkyJG64YYb9O677+rIkSNatWpVwLbV1dV+X/rhdDqVm5vL1d0AAOPF9J10TU2NNm3apIKCAu+2+Ph4FRQUaP369UH7/eY3v1GHDh104403hn2MwsJCpaene2+5ubnNUjsAAC0tpiF98OBBuVwuv78HLh3786PFxcUB+6xbt06LFy/WU089FdFjzJw5U6Wlpd4bf1scANBaRLVOOlbKysp03XXX6amnnlJ2dnZEfZKSkpSUlNTClQEA0PxiGtLZ2dlKSEhQSUmJ3/aSkhJ17NixQftPP/1U//3vf3XppZd6t7ndbkmSzWbTjh07+NvhAIBvjZh+3G232zVw4EAVFRV5t7ndbhUVFWno0KEN2vfq1Uvbt2/X1q1bvbfLLrtMo0aN0tatW/l9MwDgWyXmH3dPmzZN48eP16BBgzRkyBDNnz9fFRUVmjBhgiRp3Lhx6tKliwoLC+VwONS7d2+//hkZGZLUYDsAAK1dzEN67Nix+vrrrzVr1iwVFxerf//+WrNmjfdisr179yo+PubLuQEAOOlivk76ZONbsAAArQVvUQEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChjAjphQsXqlu3bnI4HMrPz9eGDRuCtn3qqac0YsQIZWZmKjMzUwUFBSHbAwDQWsU8pFesWKFp06Zp9uzZ2rx5s/r166fRo0frwIEDAdu/9dZbuvrqq/Xmm29q/fr1ys3N1QUXXKAvv/zyJFcOAEDLirMsy4plAfn5+Ro8eLAWLFggSXK73crNzdWUKVM0Y8aMsP1dLpcyMzO1YMECjRs3Lmx7p9Op9PR0lZaWKi0trcn1AwDQUmL6TrqmpkabNm1SQUGBd1t8fLwKCgq0fv36iMY4evSoamtrdcoppwS8v7q6Wk6n0+8GAEBrENOQPnjwoFwul3Jycvy25+TkqLi4OKIxpk+frs6dO/sFva/CwkKlp6d7b7m5uU2uGwCAkyHmv5Nuinnz5mn58uV6+eWX5XA4AraZOXOmSktLvbd9+/ad5CoBAIiOLZYPnp2drYSEBJWUlPhtLykpUceOHUP2/e1vf6t58+bpH//4h/r27Ru0XVJSkpKSkpqlXgAATqaYvpO22+0aOHCgioqKvNvcbreKioo0dOjQoP3+93//Vw888IDWrFmjQYMGnYxSAQA46WL6TlqSpk2bpvHjx2vQoEEaMmSI5s+fr4qKCk2YMEGSNG7cOHXp0kWFhYWSpIceekizZs3S0qVL1a1bN+/vrlNTU5Wamhqz/QAAoLnFPKTHjh2rr7/+WrNmzVJxcbH69++vNWvWeC8m27t3r+LjT7zhf/LJJ1VTU6OrrrrKb5zZs2fr/vvvP5mlAwDQomK+TvpkY500AKC1aNVXdwMA8G1GSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDQCAoQhpAAAMRUgDAGAoQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKFusC/g2KHFW6XBFjZxVdUpLtikrxa5ql1tlVXVyVtYqPTlRqQ6b2ifZdLC8Rs6qY9uSbPFy+rRJS05U54zkBuOXHq3x9ktLTlR2O7uq69z6xucxT0mxy5K8dWSk2JRitzWowZ4Q79cvM8Uut9vSkcrasHXU99WRSpX69EuxJ6jG7Vady9LR6jqlp9iV3c6usuo6vzraO2yKk1Tq2ZaSqNQkm8qr61R6NEib49skeecsLTlR7e0JipdUWuMKOn5GSqLa1R/fnnBsrOP90pITlWZPkCWprJFjpTlssnzqSk9OVDt7gqpdLtW6pPKqOrV32JTmsMktqby6TrIkS1J1bZ1OaZekiuOP6R2/qk6llYFr9TyX8ZKcPmNV1tQp8/ix5zx6fH4CzGM7e4Kq3C59Uxa8/gyHTXVSw+NH0qGqOpVV1iqjXaKSbQkqDzFfwbYFesxUh00Jko74zHVK4rHxy6pqleZIVEZyouosq8HxFB8X1+AYToyP06Hjx3p6ik3t6p0P7Y/P4ZF6dSkuzu+4DnY+fHH4aIP5qalzq7SyVqlJNiXZ4uW2LFXWuo/Vn5yorBS73D7nqeccjJManJfxkrf+jHY2tUs8Xr9PG8tt6XC9Wm3xcQ3GyklzhHzNCvY60M6e0OC1Jz3FHva1IZD6j9ku0eccqa5TmsOmjAC1BhLoNTHaukxnREgvXLhQDz/8sIqLi9WvXz898cQTGjJkSND2zz//vO677z7997//VY8ePfTQQw/p4osvPokVn7D3UIVmvrxd7+0+JEnKTrVr+U1DNfuVD73bJGl4Xpbuv+xM/fQP/9LRGpcev3qAnn5vT4M2cy7vo9Oy2nm3fXWkUtNf3KZ3dx30bhvRI1u3/s/puvHZjTpa41KKPUGLxw/S797crXd3H1KKPSHg+CPysjVp1Om64Xi/QGMFq6O+zw9V6G6f/fbdx2v/+L4Olteob5c0PX71Wbpn1Yl29Wv17Xv9sO66bdkWSQrYJlCt9fcp2vFT7Alacv1gLVy7K+hjSgo8r0Hm8P7LztR1i/+lg+U1x4+LszX3tY/1s/zT9PR7e7SjuEzPTTzbe/wEfd6Cjt9bB0qr9ft3P9WWvUf0+NUD9MgbOwM+J9ctPvaceLY9OKaP7lu1RV8cqYx4Ljz9Zv9luz47eFTPTTxbM+odAwGPsQDP0ZLxg7XwzUDj99ZNf9qoQxU1DeYikueo/vxfu/j9oOdb/bo8z9HsV/4T9rwMdvx7jrGjNa4GdQUbP9Cc+dYvSc9NPFu/enFb2Oc22FhzL++jrsfrr/+aFarfg2P66PqnN2jf4UpJ0sge2Zp3Zd+I/hHvK9Bj1j9HAtUaSKDXxGjrag3iLMuyYlnAihUrNG7cOC1atEj5+fmaP3++nn/+ee3YsUMdOnRo0P6f//ynRo4cqcLCQv3whz/U0qVL9dBDD2nz5s3q3bt32MdzOp1KT09XaWmp0tLSmlR7ibNK01Zu9TvwFo8fpCX1Xgw8hudlacKw7tqy74i27D0ctM3/XtVPnTOSVXq0RpOXbfE7GD2G5WVpQNdMLVi7W5PPy/Mbr/7PwfqF2uZbR31fHanUXS98EHIfb3x2o9765bm6Z5X/P1YiqU1S1PVHO35L1OU7F57jYkDXTO8Y9Y+Vxj5vw/OyNPm8PP30D++H7Otbh++22Zedqb9s/apRc+F5Ed11oDzocd6U52h4XpZ+dWEv/f2jkqieo0DzH+p88+0X7tz1nA9fHD6q6fUCM1gdkY4fqn5JYV9TfJ/bYGM98pP+ktTgNStcv19d2EuXLXjPu21kj2w9cfWAiN+5BnqdDFW/p9ZA76hDvSY2tq7WIua/k3700Uf185//XBMmTND3v/99LVq0SCkpKVqyZEnA9o899pguvPBC3XXXXTrjjDP0wAMP6KyzztKCBQsCtq+urpbT6fS7NZfDFTUNDrwOaUkBD0ZJWrf7kDqkJWlAbkbINqWVtZKkg+U1AQ9GSXpv9yENyM2QpAbjhRrft1+obb511FdaWRt2HyWpstbdoF0ktTWl/mjHb4m6fOfCc1z4jlH/WIlm/HZJtrB9fevw3Vbnsho9F+t2H1JFjSvkcd6U52jd7kOyJcRH/RzVHyvc+ebbL9y56zkfyqrqIq4j0vFD1R/Ja0okYx2uqAn4mhWuny3BPybe2XXQ+843EqEeM9ixebgi8PihXhMbW1drEdOQrqmp0aZNm1RQUODdFh8fr4KCAq1fvz5gn/Xr1/u1l6TRo0cHbV9YWKj09HTvLTc3t9nqd1bVNdhWXuUK2ae8yqXqOnfINmVVtcfHDxySHp5x6o8XbvxA9wfaVhbk8Z1BwtvDMweB2kVSW1Pqj3b8lqrLMxee//q2qX+sNGX8cH0DHZdllbVRzUVZZW3Y47wpz1G0dQWbn0j7hdsn73kZ5vgPdj5GM2flVa6IXlMiGct5/PfZja2hLMD+BnttCCTcYwaqP1ifcK+JjamrtYhpSB88eFAul0s5OTl+23NyclRcXBywT3FxcaPaz5w5U6Wlpd7bvn37mqd46dhFJvWkOhJC9kl1JCjJFnra2zsSj4+fGLKdZ5z644UbP9D9gba1D/L4acmh6/LMQaB2kdTWlPqjHb+l6vLMhee/vm3qHytNGT9c30DHZfvjFy9G8jj1+4U7zpvyHEVbV7D5ibRfuH3ynpdhjv9g52M0c5bqSIjoNSWSsdKOX7zY2BraB9jfYK8NgYR7zED1B+sT7jWxMXW1FjH/uLulJSUlKS0tze/WXDLb2TU8L8tv2wFndYNtHsPzsnTAWa0t+45oWIg26cdPiuxUu0b2yA7YblhelrbsOyJJDcYLNb5vv1DbfOuoLz05Mew+SlJyYnyDdpHU1pT6ox2/JerynQvPceE7Rv1jJZrxK6rrwvb1rcN3my0hrtFzMTwvS+3sCSGP86Y8R8PzslTnckf9HNUfK9z55tsv3LnrOR/aO2wR73uk44eqP5LXlEjGymxnD/iaFa5fncv/3fXIHtnKTo38976hHjPYsZnZLvD4oV4TG1tXaxHTkM7OzlZCQoJKSkr8tpeUlKhjx44B+3Ts2LFR7VtSTppDcy/v43cATn9xm+6/rHeDg9JzNe70F7dpybo9mjCse8A2cy7v471YKz3FrnlX9m1wUI7oka3Jo3poybo9kqQl6/Zo8qg8jTjeLtj4I/KyNeW8E/0CjRWojvo6ZyRrTr39rr+PknTbsi16cIx/u/q1+vadMKy7lqzbE7RNoFpH5GVrSoi5iHT8Jev2aMp5PTQiL/hjBp3XIHPoOxfHjosz9fFXpZowrLuG5WVp+ovbdN8Pz/SOF834NbWWhuVlefvWD6P6dXi2PXh5H0368+ZGzYXnuPjl81sb1B7s+Qj2HE0ZFXj8B8f00aTnNgeci0ieo0D7Hen54HmOwp2X38lMCXr8e46xQHUFGz/QnPnWH2yuAz23wcaae3kf5aQ5Ar5mherneT48RvbI1kNX9m3UxVnBHjPYsempNZBgr4nR1NVaxPzq7vz8fA0ZMkRPPPGEJMntdqtr166aPHmyZsyY0aD92LFjdfToUf31r3/1bjvnnHPUt29fLVq0KOzjNefV3R5+6/8cNmW1O7FOuqyqVu0dx9ZketZJe9ZMetZJe9qkh1kn7WmXnVpvnbTDplPaBV8n7VuD3zpph02Z7U6sjwxXR32eddKefu3sCap1u1VbZ+lojUvpycdq9ayT9rRL81k365kLzzppZ2XgNp5tkvzmzHeddKPG91l77O3ns066MWOl+6z59fRLrbdOOtVhU3qYddJ+41fVyVkVvFbPGl/fddJVNXXK8KyTDjGPqcfXSR8uD15/ps86ab/jR8fXSVcdW9+eYjuxjjnU81Z/W6DHbO+zTtozF+0S/cfP9Fkn7Tu+Z5207zHst0462aZ2SbaG/Xwez1OXZ510uPPBs07at/6aumNz3+74OmnLsnS09thrgee1wW+d9PFz0G+d9PFtfuukfdd5+7TxrJP2rdVvnfTxdiHXSYd4HfCsk/Z97WmWddIO2/G/JeBWrctSefWxvyUQaE13IIFeE7+NAS0ZENIrVqzQ+PHj9fvf/15DhgzR/PnztXLlSn3yySfKycnRuHHj1KVLFxUWFko6tgTr3HPP1bx583TJJZdo+fLlmjt3bkyWYAEA0JJi/sdMxo4dq6+//lqzZs1ScXGx+vfvrzVr1ngvDtu7d6/i4098Kn/OOedo6dKluvfee3X33XerR48eWrVqVUQBDQBAaxLzd9InG++kAQCtxbf+6m4AAForQhoAAEMR0gAAGIqQBgDAUIQ0AACGIqQBADAUIQ0AgKEIaQAADEVIAwBgKEIaAABDEdIAABgq5l+wcbJ5/lS50+mMcSUAgLauffv2iouLC3p/mwvpsrIySVJubm6MKwEAtHXhvuypzX0Lltvt1ldffRX2Xy+hOJ1O5ebmat++fa3ym7SoP7aoP3Zac+0S9cdaS9TPO+l64uPj9Z3vfKdZxkpLS2uVB5oH9ccW9cdOa65dov5YO5n1c+EYAACGIqQBADAUIR2FpKQkzZ49W0lJSbEuJSrUH1vUHzutuXaJ+mMtFvW3uQvHAABoLXgnDQCAoQhpAAAMRUgDAGAoQhoAAEMR0lFYuHChunXrJofDofz8fG3YsCHWJQX0zjvv6NJLL1Xnzp0VFxenVatW+d1vWZZmzZqlTp06KTk5WQUFBdq1a1dsiq2nsLBQgwcPVvv27dWhQweNGTNGO3bs8GtTVVWlSZMmKSsrS6mpqbryyitVUlISo4r9Pfnkk+rbt6/3jx4MHTpUf/vb37z3m1x7IPPmzVNcXJxuv/127zaT9+H+++9XXFyc361Xr17e+02uXZK+/PJLXXvttcrKylJycrL69OmjjRs3eu83+dyVpG7dujWY/7i4OE2aNEmS2fPvcrl03333qXv37kpOTtbpp5+uBx54QL7XWJ/U+bfQKMuXL7fsdru1ZMkS6z//+Y/185//3MrIyLBKSkpiXVoDr732mnXPPfdYL730kiXJevnll/3unzdvnpWenm6tWrXK+uCDD6zLLrvM6t69u1VZWRmbgn2MHj3aevrpp60PP/zQ2rp1q3XxxRdbXbt2tcrLy71tbr75Zis3N9cqKiqyNm7caJ199tnWOeecE8OqT3jllVes1atXWzt37rR27Nhh3X333VZiYqL14YcfWpZldu31bdiwwerWrZvVt29fa+rUqd7tJu/D7NmzrTPPPNPav3+/9/b111977ze59m+++cY67bTTrOuvv956//33rc8++8x6/fXXrd27d3vbmHzuWpZlHThwwG/u33jjDUuS9eabb1qWZfb8z5kzx8rKyrJeffVVa8+ePdbzzz9vpaamWo899pi3zcmcf0K6kYYMGWJNmjTJ+7PL5bI6d+5sFRYWxrCq8OqHtNvttjp27Gg9/PDD3m1HjhyxkpKSrGXLlsWgwtAOHDhgSbLefvtty7KO1ZqYmGg9//zz3jYff/yxJclav359rMoMKTMz0/rjH//YqmovKyuzevToYb3xxhvWueee6w1p0/dh9uzZVr9+/QLeZ3rt06dPt4YPHx70/tZ27lqWZU2dOtU6/fTTLbfbbfz8X3LJJdYNN9zgt+2KK66wrrnmGsuyTv7883F3I9TU1GjTpk0qKCjwbouPj1dBQYHWr18fw8oab8+ePSouLvbbl/T0dOXn5xu5L6WlpZKkU045RZK0adMm1dbW+tXfq1cvde3a1bj6XS6Xli9froqKCg0dOrRV1T5p0iRdcsklfrVKrWP+d+3apc6dO+u73/2urrnmGu3du1eS+bW/8sorGjRokH784x+rQ4cOGjBggJ566inv/a3t3K2pqdGf//xn3XDDDYqLizN+/s855xwVFRVp586dkqQPPvhA69at00UXXSTp5M9/m/uCjaY4ePCgXC6XcnJy/Lbn5OTok08+iVFV0SkuLpakgPviuc8Ubrdbt99+u4YNG6bevXtLOla/3W5XRkaGX1uT6t++fbuGDh2qqqoqpaam6uWXX9b3v/99bd261fjaJWn58uXavHmz/v3vfze4z/T5z8/P1zPPPKOePXtq//79+vWvf60RI0boww8/NL72zz77TE8++aSmTZumu+++W//+97912223yW63a/z48a3q3JWkVatW6ciRI7r++uslmX/szJgxQ06nU7169VJCQoJcLpfmzJmja665RtLJf+0kpGG8SZMm6cMPP9S6detiXUqj9OzZU1u3blVpaaleeOEFjR8/Xm+//Xasy4rIvn37NHXqVL3xxhtyOByxLqfRPO96JKlv377Kz8/XaaedppUrVyo5OTmGlYXndrs1aNAgzZ07V5I0YMAAffjhh1q0aJHGjx8f4+oab/HixbrooovUuXPnWJcSkZUrV+q5557T0qVLdeaZZ2rr1q26/fbb1blz55jMPx93N0J2drYSEhIaXIVYUlKijh07xqiq6HjqNX1fJk+erFdffVVvvvmm31eMduzYUTU1NTpy5Ihfe5Pqt9vtysvL08CBA1VYWKh+/frpscceaxW1b9q0SQcOHNBZZ50lm80mm82mt99+W48//rhsNptycnKM3wdfGRkZ+t73vqfdu3cbP/+dOnXS97//fb9tZ5xxhvfj+tZy7krS559/rn/84x+aOHGid5vp83/XXXdpxowZ+ulPf6o+ffrouuuu0x133KHCwkJJJ3/+CelGsNvtGjhwoIqKirzb3G63ioqKNHTo0BhW1njdu3dXx44d/fbF6XTq/fffN2JfLMvS5MmT9fLLL2vt2rXq3r273/0DBw5UYmKiX/07duzQ3r17jag/ELfbrerq6lZR+/nnn6/t27dr69at3tugQYN0zTXXeP/f9H3wVV5erk8//VSdOnUyfv6HDRvWYLnhzp07ddppp0ky/9z19fTTT6tDhw665JJLvNtMn/+jR48qPt4/GhMSEuR2uyXFYP6b/VK0b7nly5dbSUlJ1jPPPGN99NFH1k033WRlZGRYxcXFsS6tgbKyMmvLli3Wli1bLEnWo48+am3ZssX6/PPPLcs6towgIyPD+stf/mJt27bN+tGPfmTMMo5bbrnFSk9Pt9566y2/pRxHjx71trn55putrl27WmvXrrU2btxoDR061Bo6dGgMqz5hxowZ1ttvv23t2bPH2rZtmzVjxgwrLi7O+vvf/25Zltm1B+N7dbdlmb0Pd955p/XWW29Ze/bssd577z2roKDAys7Otg4cOGBZltm1b9iwwbLZbNacOXOsXbt2Wc8995yVkpJi/fnPf/a2Mfnc9XC5XFbXrl2t6dOnN7jP5PkfP3681aVLF+8SrJdeesnKzs62fvWrX3nbnMz5J6Sj8MQTT1hdu3a17Ha7NWTIEOtf//pXrEsK6M0337QkNbiNHz/esqxjSwnuu+8+Kycnx0pKSrLOP/98a8eOHbEt+rhAdUuynn76aW+byspK69Zbb7UyMzOtlJQU6/LLL7f2798fu6J93HDDDdZpp51m2e1269RTT7XOP/98b0Bbltm1B1M/pE3eh7Fjx1qdOnWy7Ha71aVLF2vs2LF+64xNrt2yLOuvf/2r1bt3byspKcnq1auX9Yc//MHvfpPPXY/XX3/dkhSwLpPn3+l0WlOnTrW6du1qORwO67vf/a51zz33WNXV1d42J3P++apKAAAMxe+kAQAwFCENAIChCGkAAAxFSAMAYChCGgAAQxHSAAAYipAGAMBQhDQAAIYipAEAMBQhDcBr/fr1SkhI8PtCBACxw58FBeA1ceJEpaamavHixdqxY0er+Q5g4NuKd9IAJB37OscVK1bolltu0SWXXKJnnnnG7/5XXnlFPXr0kMPh0KhRo/Tss88qLi7O73uB161bpxEjRig5OVm5ubm67bbbVFFRcXJ3BPgWIaQBSJJWrlypXr16qWfPnrr22mu1ZMkSeT5o27Nnj6666iqNGTNGH3zwgX7xi1/onnvu8ev/6aef6sILL9SVV16pbdu2acWKFVq3bp0mT54ci90BvhX4uBuAJGnYsGH6yU9+oqlTp6qurk6dOnXS888/r//5n//RjBkztHr1am3fvt3b/t5779WcOXN0+PBhZWRkaOLEiUpISNDvf/97b5t169bp3HPPVUVFhRwORyx2C2jVeCcNQDt27NCGDRt09dVXS5JsNpvGjh2rxYsXe+8fPHiwX58hQ4b4/fzBBx/omWeeUWpqqvc2evRoud1u7dmz5+TsCPAtY4t1AQBib/Hixaqrq/O7UMyyLCUlJWnBggURjVFeXq5f/OIXuu222xrc17Vr12arFWhLCGmgjaurq9Of/vQnPfLII7rgggv87hszZoyWLVumnj176rXXXvO779///rffz2eddZY++ugj5eXltXjNQFvB76SBNm7VqlUaO3asDhw4oPT0dL/7pk+frrVr12rlypXq2bOn7rjjDt14443aunWr7rzzTn3xxRc6cuSI0tPTtW3bNp199tm64YYbNHHiRLVr104fffSR3njjjYjfjQPwx++kgTZu8eLFKigoaBDQknTllVdq48aNKisr0wsvvKCXXnpJffv21ZNPPum9ujspKUmS1LdvX7399tvauXOnRowYoQEDBmjWrFmstQaagHfSAKIyZ84cLVq0SPv27Yt1KcC3Fr+TBhCR3/3udxo8eLCysrL03nvv6eGHH2YNNNDCCGkAEdm1a5cefPBBffPNN+ratavuvPNOzZw5M9ZlAd9qfNwNAIChuHAMAABDEdIAABiKkAYAwFCENAAAhiKkAQAwFCENAIChCGkAAAxFSAMAYKj/D51rLY0XPcSTAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a visualization\n", + "sns.relplot(\n", + " data=titanic,\n", + " x=\"Age\", y=\"Survived\", \n", + " # col=\"Sex\",\n", + " # hue=\"smoker\", \n", + " # style=\"smoker\",\n", + " # size=\"size\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f2ff08c-8c8c-4e7c-944a-8acb5c02746b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pywhy-discover", + "language": "python", + "name": "pywhy-discover" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/tutorials/markovian/Untitled.ipynb b/doc/tutorials/markovian/Untitled.ipynb new file mode 100644 index 000000000..363fcab7e --- /dev/null +++ b/doc/tutorials/markovian/Untitled.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/tutorials/multi-domain/example-sfci-algo.ipynb b/doc/tutorials/multi-domain/example-sfci-algo.ipynb index 4d061475e..78781577e 100644 --- a/doc/tutorials/multi-domain/example-sfci-algo.ipynb +++ b/doc/tutorials/multi-domain/example-sfci-algo.ipynb @@ -29,20 +29,9 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", - "The lab_black extension is already loaded. To reload it, use:\n", - " %reload_ext lab_black\n" - ] - } - ], + "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", @@ -51,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -60,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -94,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -105,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -121,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 119, "metadata": {}, "outputs": [], "source": [ @@ -137,54 +126,73 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[bnlearn] >Extracting files..\n" - ] - } - ], + "outputs": [], "source": [ "# download purely observational data\n", - "data = bnlearn.import_example(data='sachs', n=10000, verbose=3)" + "# data = bnlearn.import_example(data=\"sachs\", n=10000, verbose=3)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 122, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " Erk Akt PKA Mek Jnk PKC Raf P38 PIP3 PIP2 Plcg\n", - "0 1 0 1 1 0 0 1 0 2 0 0\n", - "1 2 1 2 0 0 0 0 0 1 0 0\n", - "2 0 0 0 0 1 1 0 0 2 0 0\n", - "3 1 0 1 1 0 1 0 0 0 1 2\n", - "4 1 1 1 0 1 1 0 0 2 0 0\n", " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk INT\n", "0 1 1 1 2 3 2 1 3 1 2 1 8\n", "1 1 1 1 1 3 3 2 3 1 2 1 8\n", "2 1 1 2 2 3 2 1 3 2 1 1 8\n", "3 1 1 1 1 3 2 1 3 1 3 1 8\n", - "4 1 1 1 1 3 2 1 3 1 1 1 8\n" + "4 1 1 1 1 3 2 1 3 1 1 1 8\n", + "(5400, 12)\n" ] } ], "source": [ - "print(data.head())\n", - "print(df.head())" + "print(df.head())\n", + "print(df.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Raf [1, 3, 2]\n", + "Mek [1, 2, 3]\n", + "Plcg [1, 2, 3]\n", + "PIP2 [2, 1, 3]\n", + "PIP3 [3, 2, 1]\n", + "Erk [2, 3, 1]\n", + "Akt [1, 2, 3]\n", + "PKA [3, 2, 1]\n", + "PKC [1, 2, 3]\n", + "P38 [2, 1, 3]\n", + "Jnk [1, 2, 3]\n", + "INT [8, 0, 7, 9, 4, 2]\n", + "dtype: object" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.apply(lambda x: x.unique())" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 123, "metadata": {}, "outputs": [ { @@ -196,14 +204,15 @@ } ], "source": [ - "perturbations = [df.columns[perturbed_col] for perturbed_col in df['INT'].unique()]\n", + "perturbations = [df.columns[perturbed_col] for perturbed_col in df[\"INT\"].unique()]\n", + "n_proteins = len(df.columns) - 1\n", "\n", "print(perturbations)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -218,8 +227,190 @@ "outputs": [ { "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Erk\n", + "\n", + "Erk\n", + "\n", + "\n", + "\n", + "Akt\n", + "\n", + "Akt\n", + "\n", + "\n", + "\n", + "Erk->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA\n", + "\n", + "PKA\n", + "\n", + "\n", + "\n", + "PKA->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek\n", + "\n", + "Mek\n", + "\n", + "\n", + "\n", + "PKA->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKA->Akt\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf\n", + "\n", + "Raf\n", + "\n", + "\n", + "\n", + "PKA->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Jnk\n", + "\n", + "Jnk\n", + "\n", + "\n", + "\n", + "PKA->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "P38\n", + "\n", + "P38\n", + "\n", + "\n", + "\n", + "PKA->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Mek->Erk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC\n", + "\n", + "PKC\n", + "\n", + "\n", + "\n", + "PKC->PKA\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Raf\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->Jnk\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PKC->P38\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Raf->Mek\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "PIP3\n", + "\n", + "PIP3\n", + "\n", + "\n", + "\n", + "PIP2\n", + "\n", + "PIP2\n", + "\n", + "\n", + "\n", + "PIP3->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg\n", + "\n", + "Plcg\n", + "\n", + "\n", + "\n", + "Plcg->PIP3\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Plcg->PIP2\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - "'/Users/adam2392/Dropbox/Apps/Overleaf/Learning selection diagrams (observational)/Figures/Appendix/ground_truth_sachs_bnlearn.pdf'" + "" ] }, "execution_count": 11, @@ -228,18 +419,444 @@ } ], "source": [ - "ground_truth_G = ground_truth_dag['model'].to_directed()\n", - "G = draw(ground_truth_G, direction='TD', shape='circle')\n", - "G.render(\n", - " outfile=\"/Users/adam2392/Dropbox/Apps/Overleaf/Learning selection diagrams (observational)/Figures/Appendix/ground_truth_sachs_bnlearn.pdf\",\n", - " format=\"pdf\",\n", - " cleanup=True,\n", - ")" + "ground_truth_G = ground_truth_dag[\"model\"].to_directed()\n", + "G = draw(ground_truth_G, direction=\"TD\", shape=\"circle\")\n", + "G\n", + "# G.render(\n", + "# outfile=\"/Users/adam2392/Dropbox/Apps/Overleaf/Learning selection diagrams (observational)/Figures/Appendix/ground_truth_sachs_bnlearn.pdf\",\n", + "# format=\"pdf\",\n", + "# cleanup=True,\n", + "# )\n", + "# ['PKC', 'Raf', 'PKA', 'P38', 'PIP3', 'Plcg']" ] }, { "cell_type": "markdown", "metadata": {}, + "source": [ + "# Generate Artificial Multi-Domain Discrete Interventional Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.18575566 0.13968558 0.67455876]\n", + "1.0\n" + ] + } + ], + "source": [ + "rng = np.random.default_rng(seed)\n", + "\n", + "# generate now bernoulli probability exogenous per protein\n", + "prior_protein_exp = rng.dirichlet(\n", + " rng.standard_gamma(rng.integers(1, 4), size=3), 1\n", + ").squeeze()\n", + "\n", + "outcome_values = np.array([1, 2, 3])\n", + "nodes_to_resample = np.array([\"Erk\", \"Mek\", \"PIP2\"])\n", + "\n", + "print(prior_protein_exp)\n", + "print(prior_protein_exp.sum(axis=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [], + "source": [ + "def resample_dataset(\n", + " G,\n", + " df,\n", + " prior_multi_dist,\n", + " nodes_to_resample,\n", + " outcome_values,\n", + " n_samples=1000,\n", + " seed=12345,\n", + "):\n", + " rng = np.random.default_rng(seed)\n", + "\n", + " new_df = np.zeros((n_samples, len(df.columns)))\n", + " for idx in range(n_samples):\n", + " row_idx = rng.integers(0, len(df))\n", + "\n", + " new_df[idx, :] = df.iloc[row_idx, :]\n", + "\n", + " for jdx, node in enumerate(nodes_to_resample):\n", + " prior_dist = prior_multi_dist\n", + " col_idx = np.argwhere(df.columns == node).squeeze()\n", + "\n", + " # sample which index from 1, 2, or 3 it hit\n", + " new_sample_idx = rng.multinomial(1, pvals=prior_dist, size=1).squeeze()\n", + " new_sample = outcome_values[np.argwhere(new_sample_idx == 1).squeeze()]\n", + " new_df[idx, col_idx] = new_sample\n", + "\n", + " # print(\"new sample for \", node, new_sample)\n", + " # sample the children according to a re-weighted Dirichlet distribution\n", + " children = list(G.successors(node))\n", + " for child in children:\n", + " child_prior = prior_multi_dist.copy()\n", + " child_prior[new_sample_idx] *= new_sample\n", + " child_prior = rng.dirichlet(child_prior, 1)\n", + "\n", + " child_idx = np.argwhere(df.columns == child).squeeze()\n", + "\n", + " # sample which index from 1, 2, or 3 it hit for children\n", + " child_sample_idx = rng.multinomial(\n", + " 1, pvals=child_prior, size=1\n", + " ).squeeze()\n", + " child_sample = outcome_values[\n", + " np.argwhere(child_sample_idx == 1).squeeze()\n", + " ]\n", + " new_df[idx, child_idx] = child_sample\n", + " # print(\"New sample for \", child, child_sample)\n", + "\n", + " new_df = pd.DataFrame(new_df)\n", + " new_df.columns = df.columns\n", + " return new_df" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 2 3]\n", + "['Erk' 'Mek' 'PIP2']\n" + ] + } + ], + "source": [ + "print(outcome_values)\n", + "print(nodes_to_resample)" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": {}, + "outputs": [], + "source": [ + "new_df = resample_dataset(\n", + " ground_truth_G,\n", + " df,\n", + " prior_multi_dist=prior_protein_exp,\n", + " nodes_to_resample=nodes_to_resample,\n", + " outcome_values=outcome_values,\n", + " n_samples=5000,\n", + " seed=12345,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5000, 12)\n", + "Raf [1.0, 2.0, 3.0]\n", + "Mek [1.0, 3.0, 2.0]\n", + "Plcg [1.0, 3.0, 2.0]\n", + "PIP2 [3.0, 2.0, 1.0]\n", + "PIP3 [1.0, 3.0, 2.0]\n", + "Erk [3.0, 1.0, 2.0]\n", + "Akt [3.0, 1.0, 2.0]\n", + "PKA [2.0, 1.0, 3.0]\n", + "PKC [2.0, 1.0, 3.0]\n", + "P38 [1.0, 2.0, 3.0]\n", + "Jnk [2.0, 1.0, 3.0]\n", + "INT [0.0, 7.0, 4.0, 9.0, 8.0, 2.0]\n", + "dtype: object\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RafMekPlcgPIP2PIP3ErkAktPKAPKCP38JnkINT
01.01.01.03.01.03.03.02.02.01.02.00.0
11.01.01.02.03.01.03.02.02.01.01.07.0
22.03.01.03.01.01.01.02.02.02.02.04.0
33.03.01.03.03.01.03.02.01.01.01.07.0
41.03.01.02.02.01.02.02.02.01.02.00.0
\n", + "
" + ], + "text/plain": [ + " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk INT\n", + "0 1.0 1.0 1.0 3.0 1.0 3.0 3.0 2.0 2.0 1.0 2.0 0.0\n", + "1 1.0 1.0 1.0 2.0 3.0 1.0 3.0 2.0 2.0 1.0 1.0 7.0\n", + "2 2.0 3.0 1.0 3.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 4.0\n", + "3 3.0 3.0 1.0 3.0 3.0 1.0 3.0 2.0 1.0 1.0 1.0 7.0\n", + "4 1.0 3.0 1.0 2.0 2.0 1.0 2.0 2.0 2.0 1.0 2.0 0.0" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(new_df.shape)\n", + "print(new_df.apply(lambda x: x.unique()))\n", + "display(new_df.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12 12 12\n" + ] + } + ], + "source": [ + "# %%\n", + "# Preprocess the dataset\n", + "# ----------------------\n", + "# Since the data is one dataframe, we need to process it into a form\n", + "# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We\n", + "# will form a list of separate dataframes.\n", + "unique_ints = df[\"INT\"].unique()\n", + "\n", + "# get the list of intervention targets and list of dataframe associated with each intervention\n", + "intervention_targets = []\n", + "data_cols = [col for col in df.columns if col != \"INT\"]\n", + "data = []\n", + "domain_ids = []\n", + "for interv_idx in unique_ints:\n", + " _data = df[df[\"INT\"] == interv_idx][data_cols]\n", + " data.append(_data)\n", + " intervention_targets.append(df.columns[interv_idx])\n", + " domain_ids.append(1)\n", + "\n", + " # append second domain\n", + " _data = new_df[new_df[\"INT\"] == interv_idx][data_cols]\n", + " data.append(_data)\n", + " intervention_targets.append(df.columns[interv_idx])\n", + " domain_ids.append(2)\n", + "\n", + "print(len(data), len(intervention_targets), len(domain_ids))" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [ + { + "ename": "Exception", + "evalue": "only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31m_RemoteTraceback\u001b[0m Traceback (most recent call last)", + "\u001b[0;31m_RemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 112, in _test_xy_edges\n test_stat, pvalue = parallel_fun(\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 692, in evaluate_edge\n test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z, **kwargs)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/ci/g_test.py\", line 459, in test\n stat, pvalue = g_square_discrete(df, x_var, y_var, z_covariates, levels=self.levels)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/ci/g_test.py\", line 362, in g_square_discrete\n contingency_tble = _calculate_contingency_tble(\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/ci/g_test.py\", line 80, in _calculate_contingency_tble\n contingency_tble[idx, jdx, kdx] += 1\nIndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 428, in _process_worker\n r = call_item()\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 275, in __call__\n return self.fn(*self.args, **self.kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\", line 620, in __call__\n return self.func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in __call__\n return [func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in \n return [func(*args, **kwargs)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 125, in _test_xy_edges\n raise Exception(e)\nException: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices\n\"\"\"", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_71125/2180799116.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;31m# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;31m# `fit` design. All fitted attributes contain an underscore at the end.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 35\u001b[0;31m learner = learner.fit(\n\u001b[0m\u001b[1;32m 36\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain_indices\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdomain_ids\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 37\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m )\n\u001b[0;32m---> 70\u001b[0;31m self.skeleton_learner_.fit(\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m )\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1784\u001b[0m \u001b[0;34mf\"{this_f_nodes} grouped with S-node: {s_node}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1785\u001b[0m )\n\u001b[0;32m-> 1786\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1787\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1788\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, s_node)\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 449\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 450\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 451\u001b[0m delayed(_test_xy_edges)(\n\u001b[1;32m 452\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 973\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 974\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 975\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 976\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 565\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 566\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 567\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 568\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mCfTimeoutError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 438\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 439\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 441\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 390\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 391\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 392\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0;31m# Break a reference cycle with the exception in self._exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mException\u001b[0m: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices" + ] + } + ], + "source": [ + "# Setup constraint-based learner\n", + "# ------------------------------\n", + "# Since we have access to interventional data, the causal discovery algorithm\n", + "# we will use that leverages CI and CD tests to estimate causal constraints\n", + "# is the Psi-FCI algorithm :footcite:`Jaber2020causal`.\n", + "\n", + "# Our dataset is comprised of discrete valued data, so we will utilize the\n", + "# G^2 (Chi-square) CI test.\n", + "ci_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "# Since our data is entirely discrete, we can also use the G^2 test as our\n", + "# CD test.\n", + "cd_estimator = GSquareCITest(data_type=\"discrete\")\n", + "\n", + "alpha = 0.05\n", + "learner = SFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=cd_estimator,\n", + " alpha=alpha,\n", + " max_combinations=10,\n", + " max_cond_set_size=4,\n", + " n_jobs=-1,\n", + ")\n", + "\n", + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = ctx_builder.variables(data=data[0]).num_distributions(len(data)).build()\n", + "\n", + "# %%\n", + "# Run the learning process\n", + "# ------------------------\n", + "# We have setup our causal context and causal discovery learner, so we will now\n", + "# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's\n", + "# `fit` design. All fitted attributes contain an underscore at the end.\n", + "learner = learner.fit(\n", + " data, ctx, domain_indices=domain_ids, intervention_targets=intervention_targets\n", + ")\n", + "\n", + "# %%\n", + "# Analyze the results\n", + "# ===================\n", + "# Now that we have learned the graph, we will show it here. Note differences and similarities\n", + "# to the ground-truth DAG that is \"assumed\". Moreover, note that this reproduces Supplementary\n", + "# Figure 8 in :footcite:`Jaber2020causal`.\n", + "est_pag = learner.graph_\n", + "\n", + "print(f\"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG\")\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "# dot_graph = draw(est_pag, direction=\"LR\")\n", + "# dot_graph.render(outfile=\"psi_pag_full.png\", view=True, cleanup=True)\n", + "\n", + "# %%\n", + "# Visualize the graph without the F-nodes\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "dot_graph = draw(est_pag_no_fnodes, direction=\"LR\")\n", + "dot_graph.render(outfile=\"psi_pag.png\", view=True, cleanup=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, "source": [ "# Linear SCM Simulation: Generate Ground-Truth Data\n", "\n", diff --git a/doc/tutorials/multi-domain/random-graph-analysis.ipynb b/doc/tutorials/multi-domain/random-graph-analysis.ipynb index 923042d2e..6b23b84f5 100644 --- a/doc/tutorials/multi-domain/random-graph-analysis.ipynb +++ b/doc/tutorials/multi-domain/random-graph-analysis.ipynb @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "5404ecd8-17bf-4fe6-93fd-dbc2fffb8df0", "metadata": {}, "outputs": [], @@ -62,6 +62,8 @@ "from dodiscover.constraint.utils import dummy_sample\n", "from dodiscover.datasets import sample_from_graph\n", "\n", + "from dodiscover.cd.residual import ResidualCDTest\n", + "\n", "from dodiscover import (\n", " SFCI,\n", " PsiFCI,\n", @@ -82,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "514e7715-203e-4362-8eda-6569a029a849", "metadata": {}, "outputs": [], @@ -92,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "3c9267d5-6845-404d-b2b1-8c991f0a516a", "metadata": {}, "outputs": [], @@ -102,7 +104,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "07d7b26f-a025-42da-989a-2a245a86a440", "metadata": {}, "outputs": [], @@ -141,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "03e8ed34-ef56-496f-923a-04ba4e10894c", "metadata": {}, "outputs": [], @@ -151,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "48a7f96a-d9e6-4503-8c68-b368466f0dee", "metadata": {}, "outputs": [], @@ -161,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 28, "id": "bc0b93f4-c7f4-49d9-8af9-4fece68c33f3", "metadata": {}, "outputs": [ @@ -169,20 +171,20 @@ "name": "stdout", "output_type": "stream", "text": [ - "[4]\n", + "[5 6 7 8 9]\n", "[0.3 0.35 0.4 0.45 0.5 ]\n" ] } ], "source": [ "node_mean_lims = [-1, 1]\n", - "node_std_lims = [0.5, 1.5]\n", + "node_std_lims = [2.0, 3.5]\n", "edge_functions = [\n", " lambda x: x,\n", - " lambda x: x**2,\n", + " # lambda x: x**2,\n", "]\n", "edge_weight_lims = [1, 5]\n", - "n_node_grid = np.arange(4, 5)\n", + "n_node_grid = np.arange(5, 10)\n", "p_grid = np.linspace(0.3, 0.5, 5)\n", "n_domains_grid = np.arange(2, 10)\n", "n_repeats = 1\n", @@ -190,7 +192,7 @@ "max_cond_set_size = 3\n", "\n", "n_samples = 2000\n", - "ratio_interventions = 0.9\n", + "ratio_interventions = 0.5\n", "n_jobs = -1\n", "print(n_node_grid)\n", "print(p_grid)" @@ -198,35 +200,24 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 29, "id": "bde56fd2-6adc-4181-8efb-acdc2945ead8", "metadata": { "tags": [] }, "outputs": [ { - "ename": "Exception", - "evalue": "unhashable type: 'set'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31m_RemoteTraceback\u001b[0m Traceback (most recent call last)", - "\u001b[0;31m_RemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 113, in _test_xy_edges\n test_stat, pvalue = parallel_fun(\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 689, in evaluate_edge\n test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z)\nTypeError: unhashable type: 'set'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 428, in _process_worker\n r = call_item()\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/externals/loky/process_executor.py\", line 275, in __call__\n return self.fn(*self.args, **self.kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\", line 620, in __call__\n return self.func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in __call__\n return [func(*args, **kwargs)\n File \"/Users/adam2392/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\", line 288, in \n return [func(*args, **kwargs)\n File \"/Users/adam2392/Documents/dodiscover/dodiscover/constraint/skeleton.py\", line 127, in _test_xy_edges\n raise Exception(e)\nException: unhashable type: 'set'\n\"\"\"", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/var/folders/6_/sl83qtkd68x3_mvfys07_6qm0000gn/T/ipykernel_59486/2593794972.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmax_cond_set_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 104\u001b[0m )\n\u001b[0;32m--> 105\u001b[0;31m learner.fit(\n\u001b[0m\u001b[1;32m 106\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mintervention_targets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 115\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/intervention.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 189\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 190\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 191\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_apply_rule11\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgraph\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mEquivalenceClass\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mContext\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/_classes.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;31m# learn skeleton graph and the separating sets per variable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m graph, self.separating_sets_ = self.learn_skeleton(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontext_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mseparating_sets_\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/sfcialg.py\u001b[0m in \u001b[0;36mlearn_skeleton\u001b[0;34m(self, data, context, sep_set)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_jobs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m )\n\u001b[0;32m---> 70\u001b[0;31m self.skeleton_learner_.fit(\n\u001b[0m\u001b[1;32m 71\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdomain_indices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mintervention_targets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m )\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, data, context, domain_indices, intervention_targets, check_input, debug)\u001b[0m\n\u001b[1;32m 1723\u001b[0m \u001b[0;34mf\"{this_f_nodes} grouped with S-node: {s_node}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1724\u001b[0m )\n\u001b[0;32m-> 1725\u001b[0;31m self._learn_skeleton(\n\u001b[0m\u001b[1;32m 1726\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1727\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/Documents/dodiscover/dodiscover/constraint/skeleton.py\u001b[0m in \u001b[0;36m_learn_skeleton\u001b[0;34m(self, data, context, condsel_method, conditional_test_func, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test, group_with_snode)\u001b[0m\n\u001b[1;32m 451\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 452\u001b[0m \u001b[0;31m# run parallelized loop\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 453\u001b[0;31m out = Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m 454\u001b[0m delayed(_test_xy_edges)(\n\u001b[1;32m 455\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mevaluate_edge\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieval_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretrieve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;31m# Make sure that we get a last message telling us we are done\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0melapsed_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_start_time\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mretrieve\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 973\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 974\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'supports_timeout'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 975\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 976\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_output\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mwrap_future_result\u001b[0;34m(future, timeout)\u001b[0m\n\u001b[1;32m 565\u001b[0m AsyncResults.get from multiprocessing.\"\"\"\n\u001b[1;32m 566\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 567\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 568\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mCfTimeoutError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 444\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 445\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 446\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 447\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/miniconda3/envs/pywhy-discover/lib/python3.9/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 389\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 390\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 391\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 392\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0;31m# Break a reference cycle with the exception in self._exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mException\u001b[0m: unhashable type: 'set'" + "name": "stdout", + "output_type": "stream", + "text": [ + "[[4 0]\n", + " [2 4]] [[4 0]\n", + " [2 4]]\n", + "2.0 2.0\n", + "[[4 0]\n", + " [2 4]]\n", + "[[4 0]\n", + " [2 4]]\n" ] } ], @@ -329,10 +320,11 @@ " # now learn the relationships\n", " learner = SFCI(\n", " ci_estimator=FisherZCITest(),\n", - " cd_estimator=KernelCDTest(null_reps=500),\n", + " # cd_estimator=KernelCDTest(null_reps=100),\n", + " cd_estimator=ResidualCDTest(),\n", " alpha=alpha,\n", " debug=False,\n", - " n_jobs=1,\n", + " n_jobs=n_jobs,\n", " max_cond_set_size=max_cond_set_size,\n", " )\n", " learner.fit(\n", @@ -358,7 +350,8 @@ " )\n", " learner = PsiFCI(\n", " ci_estimator=FisherZCITest(),\n", - " cd_estimator=KernelCDTest(null_reps=500),\n", + " # cd_estimator=KernelCDTest(null_reps=100),\n", + " cd_estimator=ResidualCDTest(),\n", " alpha=alpha,\n", " known_intervention_targets=True,\n", " n_jobs=n_jobs,\n", @@ -424,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 144, + "execution_count": 30, "id": "3c6cae59-7337-4d8b-bb8a-748e68a33d09", "metadata": {}, "outputs": [ @@ -432,10 +425,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "5\n", - "[{}, {}, {}, {}, {}, {2}, {3}, {0}]\n", - "8\n", - "0.3 4\n" + "2\n", + "[{}, {}, {4}, {1}]\n", + "4\n", + "0.3 5\n" ] } ], @@ -448,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": 31, "id": "13c6c922-0ba5-4a59-88ee-a8090f9eb5a2", "metadata": {}, "outputs": [ @@ -456,24 +449,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[2 1]\n", - " [0 3]]\n", - "[[2 1]\n", - " [1 2]]\n", - "2.0 2.0\n" + "[[4 0]\n", + " [2 4]]\n", + "[[4 0]\n", + " [2 4]]\n" ] } ], "source": [ "# analyze directionality orietnations\n", - "shd_ipag = structure_hamming_dist_ec(\n", - " aug_lin_graph,\n", - " ipag.subgraph(non_augmented_nodes),\n", - ")\n", - "shd_spag = structure_hamming_dist_ec(\n", - " aug_lin_graph,\n", - " spag.subgraph(non_augmented_nodes),\n", - ")\n", + "# shd_ipag = structure_hamming_dist_ec(\n", + "# aug_lin_graph,\n", + "# ipag.subgraph(non_augmented_nodes),\n", + "# )\n", + "# shd_spag = structure_hamming_dist_ec(\n", + "# aug_lin_graph,\n", + "# spag.subgraph(non_augmented_nodes),\n", + "# )\n", "\n", "# analyze skeleton\n", "cm_ipag = confusion_matrix_networks(\n", @@ -487,12 +479,12 @@ "\n", "print(cm_ipag)\n", "print(cm_spag)\n", - "print(shd_ipag, shd_spag)" + "# print(shd_ipag, shd_spag)" ] }, { "cell_type": "code", - "execution_count": 161, + "execution_count": 32, "id": "5d9d610c-4cce-4a5e-a1ba-ac9dedf68ad8", "metadata": {}, "outputs": [ @@ -505,10 +497,10 @@ "\n", "\n", - "\n", + "\n", "\n", - "\n", + "\n", "\n", "\n", "0\n", @@ -518,47 +510,71 @@ "\n", "\n", "2\n", - "\n", - "2\n", + "\n", + "2\n", "\n", "\n", "\n", "0->2\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "4\n", + "\n", + "\n", + "\n", + "0->4\n", + "\n", + "\n", "\n", "\n", "\n", "1\n", - "\n", - "1\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "1->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "1->4\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2->4\n", + "\n", + "\n", "\n", "\n", "\n", "3\n", - "\n", - "3\n", + "\n", + "3\n", "\n", - "\n", - "\n", - "1->3\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "2->3\n", - "\n", - "\n", + "\n", + "\n", + "3->4\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 161, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -569,7 +585,7 @@ }, { "cell_type": "code", - "execution_count": 162, + "execution_count": 33, "id": "5aef1b41-0c62-4d35-a10d-213fca31b9a0", "metadata": {}, "outputs": [ @@ -582,67 +598,76 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "3\n", - "\n", - "3\n", + "4\n", + "\n", + "4\n", "\n", - "\n", + "\n", "\n", - "2\n", - "\n", - "2\n", + "0\n", + "\n", + "0\n", "\n", - "\n", + "\n", "\n", - "3->2\n", - "\n", - "\n", - "\n", + "4->0\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "0\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "0->3\n", - "\n", - "\n", + "1\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "0->2\n", - "\n", - "\n", + "4->1\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "1\n", - "\n", - "1\n", + "2\n", + "\n", + "2\n", "\n", - "\n", + "\n", + "\n", + "4->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "3\n", + "\n", + "\n", "\n", - "1->3\n", - "\n", - "\n", + "4->3\n", + "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 162, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -653,7 +678,7 @@ }, { "cell_type": "code", - "execution_count": 163, + "execution_count": 34, "id": "2b48e391-59f0-42be-b21c-27382cde56c3", "metadata": {}, "outputs": [ @@ -666,70 +691,76 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "0\n", - "\n", - "0\n", + "4\n", + "\n", + "4\n", "\n", - "\n", + "\n", "\n", - "2\n", - "\n", - "2\n", + "0\n", + "\n", + "0\n", "\n", - "\n", + "\n", "\n", - "0->2\n", - "\n", - "\n", - "\n", + "4->0\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "3\n", - "\n", - "3\n", + "1\n", + "\n", + "1\n", "\n", - "\n", + "\n", "\n", - "3->0\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "3->2\n", - "\n", - "\n", - "\n", + "4->1\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "1\n", - "\n", - "1\n", + "2\n", + "\n", + "2\n", "\n", - "\n", + "\n", "\n", - "3->1\n", - "\n", - "\n", - "\n", + "4->2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "4->3\n", + "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 163, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index f447c9e51..aea69c524 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -63,8 +63,8 @@ def _check_test_input( def test( self, df: pd.DataFrame, - y_vars: Set[Column], group_col: Set[Column], + y_vars: Set[Column], x_vars: Set[Column], ) -> Tuple[float, float]: """Abstract method for all conditional discrepancy tests. @@ -99,6 +99,11 @@ def test( def _compute_propensity_scores(self, group_ind, **kwargs): if self.propensity_model is None: K = kwargs.get("K") + if K is None: + # use the empirical propensities + empirical_propensity = group_ind.sum() / len(group_ind) + self.propensity_est_ = np.ones(len(group_ind)) * empirical_propensity + return self.propensity_est_ # compute a default penalty term if using a kernel matrix if K.shape[0] == K.shape[1]: @@ -131,12 +136,12 @@ def _compute_propensity_scores(self, group_ind, **kwargs): return self.propensity_est_ @abstractmethod - def _statistic(self, X: ArrayLike, Y: ArrayLike, group_ind: ArrayLike) -> float: + def _statistic(self, Y: ArrayLike, group_ind: ArrayLike, X: ArrayLike=None) -> float: """Abstract method for computing the test statistic.""" pass def compute_null( - self, e_hat: ArrayLike, X: ArrayLike, Y: ArrayLike, null_reps: int = 1000, random_state=None + self, e_hat: ArrayLike,Y: ArrayLike, X: ArrayLike=None, null_reps: int = 1000, random_state=None ) -> ArrayLike: """Estimate null distribution using propensity weights. @@ -144,10 +149,10 @@ def compute_null( ---------- e_hat : Array-like of shape (n_samples,) The predicted propensity score for ``group_ind == 1``. - X : Array-Like of shape (n_samples, n_features_x) - The X (covariates) array. Y : Array-Like of shape (n_samples, n_features_y) The Y (outcomes) array. + X : Array-Like of shape (n_samples, n_features_x) + The X (covariates) array. null_reps : int, optional Number of times to sample null, by default 1000. random_state : int, optional @@ -160,14 +165,14 @@ def compute_null( """ rng = np.random.default_rng(random_state) - n_samps = X.shape[0] + n_samps = Y.shape[0] # compute the test statistic on the conditionally permuted # dataset, where each group label is resampled for each sample # according to its propensity score null_dist = Parallel(n_jobs=self.n_jobs)( [ - delayed(self._statistic)(X, Y, rng.binomial(1, e_hat, size=n_samps)) + delayed(self._statistic)(Y, rng.binomial(1, e_hat, size=n_samps), X) for _ in range(null_reps) ] ) diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index c708c2719..5ff4bf8d3 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -75,8 +75,8 @@ def __init__( def test( self, df: pd.DataFrame, - y_vars: Set[Column], group_col: Set[Column], + y_vars: Set[Column], x_vars: Set[Column], ) -> Tuple[float, float]: # check test input diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index a2d68e524..7877ea2aa 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -92,44 +92,10 @@ def __init__( def test( self, df: pd.DataFrame, - y_vars: Set[Column], group_col: Set[Column], + y_vars: Set[Column], x_vars: Set[Column], ) -> Tuple[float, float]: - """Compute k-sample test statistic and pvalue. - - Tests the null hypothesis:: - - H_0: P(Y|X) = P'(Y|X) - - where the different distributions arise from the different datasets - collected denoted by the ``group_col`` parameter. It can also be written - as:: - - H_0: P(Y|X,T) = P(Y|X) - - meaning that :math:`Y \\perp X | T`, where T is the group indicator. - - Parameters - ---------- - df : pd.DataFrame - The dataset containing the columns denoted by ``x_vars``, ``y_vars``, - and the ``group_col``. - y_vars : Set[Column] - Set of Y variables. - group_col : Column - The column denoting, which group (i.e. environment) each sample belongs to. - This is typically the F-node. Must be binary. - x_vars : Set[Column] - Set of X variables. Can be the empty set. - - Returns - ------- - stat : float - The computed test statistic. - pvalue : float - The computed p-value. - """ # check test input self._check_test_input(df, y_vars, group_col, x_vars) group_col_var: Column = list(group_col)[0] @@ -143,13 +109,6 @@ def test( # compute kernel for the X and Y data X = df[x_cols].to_numpy() Y = df[y_cols].to_numpy() - K, sigma_x = compute_kernel( - X, - distance_metric=self.distance_metric, - metric=self.metric, - kwidth=self.kwidth_x, - n_jobs=self.n_jobs, - ) L, sigma_y = compute_kernel( Y, distance_metric=self.distance_metric, @@ -157,20 +116,34 @@ def test( kwidth=self.kwidth_y, n_jobs=self.n_jobs, ) - # store fitted attributes - self.kwidth_x_ = sigma_x self.kwidth_y_ = sigma_y + if len(x_vars) != 0: + K, sigma_x = compute_kernel( + X, + distance_metric=self.distance_metric, + metric=self.metric, + kwidth=self.kwidth_x, + n_jobs=self.n_jobs, + ) + else: + K = None + sigma_x = None + self.kwidth_x_ = sigma_x + # compute the statistic - stat = self._statistic(K, L, group_ind) + stat = self._statistic(L, group_ind, K=K) # compute propensity scores - e_hat = self._compute_propensity_scores(group_ind, K=K) + if K is None: + e_hat = self._compute_propensity_scores(group_ind) + else: + e_hat = self._compute_propensity_scores(group_ind, K=K) # now compute null distribution null_dist = self.compute_null( - e_hat, K, L, null_reps=self.null_reps, random_state=self.random_state + e_hat, L, X=K, null_reps=self.null_reps, random_state=self.random_state ) self.null_dist_ = null_dist @@ -178,11 +151,8 @@ def test( pvalue = (1 + np.sum(null_dist >= stat)) / (1 + self.null_reps) return stat, pvalue - def _statistic(self, K: ArrayLike, L: ArrayLike, group_ind: ArrayLike) -> float: - n_samples = len(K) - - # compute W matrices from K and z - W0, W1 = self._compute_inverse_kernel(K, group_ind) + def _statistic(self, L: ArrayLike, group_ind: ArrayLike, K: ArrayLike=None) -> float: + n_samples = len(L) # compute L kernels first_mask = np.array(1 - group_ind, dtype=bool) @@ -191,17 +161,26 @@ def _statistic(self, K: ArrayLike, L: ArrayLike, group_ind: ArrayLike) -> float: L1 = L[np.ix_(second_mask, second_mask)] L01 = L[np.ix_(first_mask, second_mask)] - # compute the final test statistic - K0 = K[:, first_mask] - K1 = K[:, second_mask] - KW0 = K0 @ W0 - KW1 = K1 @ W1 - - # compute the three terms in Lemma 4.4 - first_term = np.trace(KW0.T @ KW0 @ L0) - second_term = np.trace(KW1.T @ KW0 @ L01) - third_term = np.trace(KW1.T @ KW1 @ L1) - + if K is not None: + # compute W matrices from K and z + W0, W1 = self._compute_inverse_kernel(K, group_ind) + + # compute the final test statistic + K0 = K[:, first_mask] + K1 = K[:, second_mask] + KW0 = K0 @ W0 + KW1 = K1 @ W1 + + # compute the three terms in Lemma 4.4 + first_term = np.trace(KW0.T @ KW0 @ L0) + second_term = np.trace(KW1.T @ KW0 @ L01) + third_term = np.trace(KW1.T @ KW1 @ L1) + else: + # compute the three terms in Lemma 4.4 + first_term = np.trace(L0) + second_term = np.trace(L01) + third_term = np.trace(L1) + # compute final statistic stat = (first_term - 2 * second_term + third_term) / n_samples return stat diff --git a/dodiscover/cd/residual.py b/dodiscover/cd/residual.py new file mode 100644 index 000000000..771d355d4 --- /dev/null +++ b/dodiscover/cd/residual.py @@ -0,0 +1,154 @@ +from typing import Set, Tuple +import numpy as np +from numpy.typing import ArrayLike +import pandas as pd +from sklearn.metrics import r2_score + +from dodiscover.typing import Column + +from .base import BaseConditionalDiscrepancyTest + + +def invariant_residual_test( + X, + Y, + z, + method="gam", + test="ks", + method_kwargs={}, + return_model=False, + combine_pvalues=True, +): + r""" + Calulates the 2-sample test statistic. + + Parameters + ---------- + X : ndarray, shape (n, p) + Features to condition on + Y : ndarray, shape (n,) + Target or outcome features + z : list or ndarray, shape (n,) + List of zeros and ones indicating which samples belong to + which groups. + method : {"forest", "gam", "linear"}, default="gam" + Method to predict the target given the covariates + test : {"whitney_levene", "ks"}, default="ks" + Test of the residuals between the groups + method_kwargs : dict + Named arguments to pass to the prediction method. + return_model : boolean, default=False + If true, returns the fitted model + combine_pvalues: bool, default=True + If True, returns hte minimum of the corrected pvalues. + + Returns + ------- + pvalue : float + The computed *k*-sample p-value. + r2 : float + r2 score of the regression fit + model : object + Fitted regresion model, if return_model is True + """ + + if method == "forest": + from sklearn.ensemble import RandomForestRegressor + + predictor = RandomForestRegressor(max_features="sqrt", **method_kwargs) + elif method == "gam": + from sklearn.linear_model import LinearRegression + from sklearn.preprocessing import SplineTransformer + from sklearn.pipeline import Pipeline + from sklearn.model_selection import GridSearchCV + + pipe = Pipeline( + steps=[ + ("spline", SplineTransformer(n_knots=4, degree=3)), + ("linear", LinearRegression(**method_kwargs)), + ] + ) + param_grid = { + "spline__n_knots": [3, 5, 7, 9], + } + predictor = GridSearchCV( + pipe, param_grid, n_jobs=-2, refit=True, + scoring="neg_mean_squared_error" + ) + elif method == "linear": + from sklearn.linear_model import LinearRegression + + predictor = LinearRegression(**method_kwargs) + else: + raise ValueError(f"Method {method} not a valid option.") + + predictor = predictor.fit(X, Y) + Y_pred = predictor.predict(X) + residuals = Y - Y_pred + r2 = r2_score(Y, Y_pred) + + if test == "whitney_levene": + from scipy.stats import mannwhitneyu + from scipy.stats import levene + + _, mean_pval = mannwhitneyu( + residuals[np.asarray(z, dtype=bool)], + residuals[np.asarray(1 - z, dtype=bool)], + ) + _, var_pval = levene( + residuals[np.asarray(z, dtype=bool)], + residuals[np.asarray(1 - z, dtype=bool)], + ) + # Correct for multiple tests + if combine_pvalues: + pval = min(mean_pval * 2, var_pval * 2, 1) + else: + pval = (min(mean_pval * 2, 1), min(var_pval * 2, 1)) + elif test == "ks": + from scipy.stats import kstest + + _, pval = kstest( + residuals[np.asarray(z, dtype=bool)], + residuals[np.asarray(1 - z, dtype=bool)], + ) + else: + raise ValueError(f"Test {test} not a valid option.") + + if return_model: + return pval, r2, predictor + else: + return pval, r2 + + +class ResidualCDTest(BaseConditionalDiscrepancyTest): + + def __init__(self, method='gam', test_method='ks'): + super().__init__() + self.method = method + self.test_method = test_method + + def _statistic(self, Y, group_ind, X = None) -> float: + return super()._statistic(Y, group_ind, X) + + def test(self, df, group_col: Set[Column], y_vars: Set[Column], x_vars: Set[Column]) -> Tuple[float, float]: + X = df[list(x_vars)].values + Y = df[list(y_vars)].values + z = df[list(group_col)].values + + if x_vars == set(): + from scipy.stats import kstest + + stat, pval = kstest(Y[z==1], Y[z==0]) + else: + pval, r2 = invariant_residual_test( + X, + Y, + z, + method=self.method, + test=self.test_method, + method_kwargs={}, + return_model=False, + combine_pvalues=True, + ) + stat = r2 + return stat, pval \ No newline at end of file diff --git a/dodiscover/ci/kernel_utils.py b/dodiscover/ci/kernel_utils.py index 88130102d..988b2081d 100644 --- a/dodiscover/ci/kernel_utils.py +++ b/dodiscover/ci/kernel_utils.py @@ -200,6 +200,12 @@ def compute_kernel( med : float The estimated kernel width. """ + def check_2d(X): + if X is not None and X.ndim == 1: + X = X.reshape(-1, 1) + return X + X = check_2d(X) + # if the width of the kernel is not set, then use the median trick to set the # kernel width based on the data X if kwidth is None: diff --git a/dodiscover/ci/oracle.py b/dodiscover/ci/oracle.py index 67c5984a9..7e1683873 100644 --- a/dodiscover/ci/oracle.py +++ b/dodiscover/ci/oracle.py @@ -23,9 +23,10 @@ class Oracle(BaseConditionalIndependenceTest): _allow_multivariate_input: bool = True - def __init__(self, graph: Graph, included_nodes: Optional[Set[Column]] = None) -> None: + def __init__(self, graph: Graph, included_nodes: Optional[Set[Column]] = None, multivariate_x_vars=None) -> None: self.graph = graph self.included_nodes = included_nodes + self.multivariate_xvars = multivariate_x_vars def test( self, @@ -33,6 +34,7 @@ def test( x_vars: Set[Column], y_vars: Set[Column], z_covariates: Optional[Set[Column]] = None, + s_node: Optional[Column] = None, ): """Conditional independence test given an oracle. @@ -80,6 +82,9 @@ def test( else: z_covariates_ = set(z_covariates).union(included_nodes) + if s_node is not None: + x_vars.add(s_node) + # just check for d-separation between x and y given sep_set if isinstance(self.graph, nx.DiGraph): is_sep = nx.d_separated(self.graph, x_vars, y_vars, z_covariates_) diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index d2f570e08..a8a4152e4 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -10,7 +10,7 @@ from joblib import Parallel, delayed from dodiscover.cd import BaseConditionalDiscrepancyTest -from dodiscover.ci import BaseConditionalIndependenceTest +from dodiscover.ci import BaseConditionalIndependenceTest, Oracle from dodiscover.constraint.config import ConditioningSetSelection from dodiscover.constraint.utils import is_in_sep_set from dodiscover.context import Context @@ -38,7 +38,7 @@ def _test_xy_edges( data: pd.DataFrame, context: Context, cross_distribution_test: bool = False, - group_with_snode =None, + s_node =None, ) -> Dict[str, Any]: """Private function used to test edge between X and Y in parallel for candidate separating sets. @@ -81,8 +81,6 @@ def _test_xy_edges( size_cond_set=size_cond_set, ) - # TODO: figure out more elegant way of doing this - new_x_var = None # now iterate through the possible parents for comb_idx, cond_set in enumerate(conditioning_sets): # check the number of combinations of possible parents we have tried @@ -97,6 +95,8 @@ def _test_xy_edges( # get the sigma-map for this F-node distribution_idx = context.sigma_map[x_var] + # print(f'Got distribution indices for {x_var} as {distribution_idx}') + # get the distributions across the two distributions data_i = data[distribution_idx[0]].copy() data_j = data[distribution_idx[1]].copy() @@ -107,23 +107,21 @@ def _test_xy_edges( this_data = pd.concat((data_i, data_j), axis=0) try: - if group_with_snode is not None: - new_x_var = set([x_var, group_with_snode]) - # compute conditional independence test - test_stat, pvalue = parallel_fun( - this_data, conditional_test_func, new_x_var, y_var, set(cond_set) - ) - else: - # compute conditional independence test - test_stat, pvalue = parallel_fun( - this_data, conditional_test_func, x_var, y_var, set(cond_set) - ) + # compute conditional independence test + # print(s_node, x_var, y_var, conditional_test_func, parallel_fun) + test_stat, pvalue = parallel_fun( + this_data, conditional_test_func, x_var, y_var, set(cond_set), s_node=s_node + ) except Exception as e: if "Not enough samples." in str(e): print(e) test_stat = np.inf pvalue = 0.0 else: + print(x_var, y_var, cond_set) + print(this_data.columns) + print(this_data.head()) + print(this_data[x_var]) raise Exception(e) # if any "independence" is found through inability to reject @@ -136,7 +134,6 @@ def _test_xy_edges( result: Dict[str, Any] = dict() result["x_var"] = x_var - result['old_xvar'] = new_x_var result["y_var"] = y_var result["cond_set"] = list(cond_set) result["test_stat"] = test_stat @@ -321,7 +318,7 @@ def _learn_skeleton( skipped_y_nodes=None, skipped_z_nodes=None, cross_distribution_test: bool = False, - group_with_snode=None, + s_node=None, ): """Core function for learning the skeleton of a causal graph. @@ -445,7 +442,7 @@ def _learn_skeleton( data, context, cross_distribution_test, - group_with_snode=group_with_snode + s_node=s_node ) out.append(result) else: @@ -463,7 +460,7 @@ def _learn_skeleton( data, context, cross_distribution_test, - group_with_snode=group_with_snode + s_node=s_node ) for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( possible_x_nodes, @@ -481,15 +478,9 @@ def _learn_skeleton( x_var = result["x_var"] y_var = result["y_var"] cond_set = result["cond_set"] - old_xvar = result["old_xvar"] - if group_with_snode is not None: - self._postprocess_ci_test(context, group_with_snode, y_var, test_stat, pvalue) - self._postprocess_ci_test(context, old_xvar, y_var, test_stat, pvalue) - else: - self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) # post-process the CI test results - # self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) + self._postprocess_ci_test(context, x_var, y_var, test_stat, pvalue) # two variables found to be independent given a separating set if pvalue > self.alpha: @@ -497,6 +488,12 @@ def _learn_skeleton( self.sep_set_[y_var][x_var].append(set(cond_set)) remove_edges.add((x_var, y_var, pvalue)) + if s_node is not None: + self.sep_set_[s_node][y_var].append(set(cond_set)) + self.sep_set_[s_node][y_var].append(set(cond_set)) + if context.init_graph.has_edge(s_node, y_var): + remove_edges.add((s_node, y_var, pvalue)) + # summarize the comparison of XY self._summarize_xy_comparison(x_var, y_var, pvalue > self.alpha, pvalue) @@ -663,6 +660,7 @@ def evaluate_edge( X: Column, Y: Column, Z: Optional[Set[Column]] = None, + **kwargs ) -> Tuple[float, float]: """Test any specific edge for X || Y | Z. @@ -676,6 +674,9 @@ def evaluate_edge( A column in ``data``. Z : set, optional A list of columns in ``data``, by default None. + **kwargs + Keyword arguments to be passed to the conditional independence test. + Allows S-nodes for example to be passed in. Returns ------- @@ -686,7 +687,9 @@ def evaluate_edge( """ if Z is None: Z = set() - test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z) + if not isinstance(conditional_test_func, Oracle): + kwargs = dict() + test_stat, pvalue = conditional_test_func.test(data, set({X}), set({Y}), Z, **kwargs) self.n_ci_tests += 1 return test_stat, pvalue @@ -1096,10 +1099,7 @@ def _initialize_params(self, context) -> Context: return super()._initialize_params(context) - def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): - if check_input: - context = self._initialize_params(context) - + def _fit_single_distribution(self, data, context: Context, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test): # initially learn the skeleton without using PDS information # apply algorithm to learn skeleton self._learn_skeleton( @@ -1107,14 +1107,21 @@ def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): context=context, condsel_method=self.condsel_method, conditional_test_func=self.ci_estimator, + possible_x_nodes=possible_x_nodes, + skipped_y_nodes=skipped_y_nodes, + skipped_z_nodes=skipped_z_nodes, + cross_distribution_test=cross_distribution_test, ) + # reset context and add observational skeleton + context.add_state_variable("obs_skel_graph", context.init_graph.copy()) + # if there is no second stage skeleton method to be run, then we # will stop with the skeleton here if self.second_stage_condsel_method is None: self.context_ = deepcopy(context.copy()) self.adj_graph_ = deepcopy(context.init_graph.copy()) - return self + return context # setup context for the second round-of learning context = self._prep_second_stage_skeleton(context) @@ -1126,7 +1133,19 @@ def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): context=context, condsel_method=self.second_stage_condsel_method, conditional_test_func=self.ci_estimator, + possible_x_nodes=possible_x_nodes, + skipped_y_nodes=skipped_y_nodes, + skipped_z_nodes=skipped_z_nodes, + cross_distribution_test=cross_distribution_test, ) + return context + + def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): + if check_input: + context = self._initialize_params(context) + + # fit the distribution + context = self._fit_single_distribution(data, context, possible_x_nodes=None, skipped_y_nodes=None, skipped_z_nodes=None, cross_distribution_test=False) self.context_ = deepcopy(context.copy()) self.adj_graph_ = deepcopy(context.init_graph.copy()) @@ -1275,17 +1294,14 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr self.context_ = context.copy() - # first learn the skeleton using only "observational data" - self._learn_skeleton( + # learn skeleton + context = self._fit_single_distribution( data=obs_data, context=context, - condsel_method=self.condsel_method, - conditional_test_func=self.ci_estimator, possible_x_nodes=list(context.get_non_augmented_nodes()), skipped_y_nodes=context.f_nodes, skipped_z_nodes=context.f_nodes, - cross_distribution_test=False, - ) + cross_distribution_test=False) context = self._prep_second_stage_skeleton(context) @@ -1503,37 +1519,44 @@ def _create_augmented_nodes( # for each domain, determine if there is observational data domain_obs = dict() for domain in unique_domains: - this_domain_idx = np.argwhere(np.array(domain_ids) == domain).squeeze() + this_domain_idx = np.atleast_1d(np.argwhere(np.array(domain_ids) == domain).squeeze()) # now check all intervention targets - this_targets = np.atleast_1d(np.array(intervention_targets)[this_domain_idx]) - if set() in this_targets: + this_targets = [intervention_targets[idx] for idx in this_domain_idx] + if {} in this_targets or set() in this_targets: domain_obs[domain] = True else: domain_obs[domain] = False - # create S-nodes + # create S-nodes as N-domains choose 2 for idx, (source, target) in enumerate(combinations(unique_domains, 2)): s_node = ("S", idx) - node_domain_map[s_node] = {source, target} + node_domain_map[s_node] = [source, target] s_nodes.append(s_node) - # create F-nodes + # create F-nodes, which is now all combinations of distributions choose 2 k = 0 seen_domain_pairs = dict() seen_distr_pairs = dict() for idx, source in enumerate(domain_ids): for jdx, target in enumerate(domain_ids): - if jdx <= idx: - continue domain_memo_key = frozenset([source, target]) distr_memo_key = frozenset([idx, jdx]) + + if jdx <= idx: + continue if domain_memo_key in seen_domain_pairs and distr_memo_key in seen_distr_pairs: continue + seen_domain_pairs[distr_memo_key] = None seen_distr_pairs[domain_memo_key] = None + # check if we are dealing with two observational distributions, since those + # are assigned to S-nodes + if intervention_targets[idx] == set() and intervention_targets[jdx] == set(): + continue + # map each augmented-node to a tuple of distribution indices, or to a set of nodes # representing the intervention targets if intervention_targets[idx] is None or intervention_targets[jdx] is None: @@ -1547,18 +1570,20 @@ def _create_augmented_nodes( # get the S-node mapped to the obs data if there is observational data if domain_obs[source] and domain_obs[target] and targets == frozenset(): s_node = [ - key for key, val in node_domain_map.items() if val == {source, target} + key for key, val in node_domain_map.items() if set(val) == {source, target} ][0] sigma_map[s_node] = [idx, jdx] continue + elif targets == frozenset(): + # there is not interventions to compare + continue # create the F-node f_node = ("F", k) f_nodes.append(f_node) # map each F-node to a set of domain(s) - node_domain_map[f_node] = {source, target} - + node_domain_map[f_node] = [source, target] sigma_map[f_node] = [idx, jdx] symmetric_diff_map[f_node] = targets @@ -1596,26 +1621,17 @@ def fit( if isinstance(data, pd.DataFrame): data = [data] - # error-check the datasets passed in match the intervention contexts - # if len(data) != context.num_distributions: - # raise RuntimeError( - # f"The number of datasets does not match the number of interventions. " - # f"You passed in {len(data)} different datasets, whereas " - # f"there are {len(context.intervention_targets)} different interventions " - # f"specified and {context.num_distributions} distributions assumed. " - # f"It is assumed that the first dataset is observational, " - # f"while the rest are interventional." - # ) - # pick a domain and distribution with the largest amount of data largest_data_idx = np.argmax([len(df) for df in data]) obs_data = data[largest_data_idx] + print('Using data from distribution ', largest_data_idx, ' for learning the skeleton.') self.context_ = context.copy() # initialize learning parameters if check_input: context = self._initialize_params(context) + # create augmented nodes ( augmented_nodes, symmetric_diff_map, @@ -1625,8 +1641,13 @@ def fit( domain_ids=domain_indices, intervention_targets=intervention_targets ) - # initialize the augmented graph - causal_nodes = context.observed_variables + # initialize the augmented graph to be fully connected to observed casual variables + causal_nodes = set(context.observed_variables) + + # XXX: contextbuilder creates an augmented graph, whereas we want to control that. + for node in set(context.init_graph.nodes): + if node not in causal_nodes: + context.init_graph.remove_node(node) for augmented_node in augmented_nodes: for node in causal_nodes: context.init_graph.add_edge(augmented_node, node) @@ -1640,6 +1661,7 @@ def fit( elif node[0] == "F": f_nodes.append(node) + # provide multi-domain context n_domains = len(np.unique(domain_indices)) context.augmented_nodes = augmented_nodes context.symmetric_diff_map = symmetric_diff_map @@ -1647,35 +1669,21 @@ def fit( context.node_domain_map = node_domain_map context.s_nodes = s_nodes context.f_nodes = f_nodes + + # skeleton discovery should not condition on augmented nodes skip_nodes = augmented_nodes # first learn the skeleton using only "observational data" # initially learn the skeleton without using PDS information # apply algorithm to learn skeleton # first learn the skeleton using only "observational data" - self._learn_skeleton( + self._fit_single_distribution( data=obs_data, context=context, - condsel_method=self.condsel_method, - conditional_test_func=self.ci_estimator, - possible_x_nodes=list(context.get_non_augmented_nodes()), - skipped_y_nodes=context.get_augmented_nodes(), - skipped_z_nodes=context.get_augmented_nodes(), - cross_distribution_test=False, - ) - - context = self._prep_second_stage_skeleton(context) - - # secibd learn the skeleton using only "PDS data" - self._learn_skeleton( - data=obs_data, - context=context, - condsel_method=self.second_stage_condsel_method, - conditional_test_func=self.ci_estimator, - possible_x_nodes=list(context.get_non_augmented_nodes()), - skipped_y_nodes=context.get_augmented_nodes(), - skipped_z_nodes=context.get_augmented_nodes(), - cross_distribution_test=False, + possible_x_nodes=causal_nodes, + skipped_y_nodes=skip_nodes, + skipped_z_nodes=skip_nodes, + cross_distribution_test=False ) # prepare the context object for the second stage of learning @@ -1692,12 +1700,31 @@ def fit( for idx in range(len(sep_sets)): self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) - # loop through each domain to learn the F-node skeleton + # loop through each domain pair to learn the F-node skeleton seen_domain_pairs = set() for idx, source in enumerate(range(1, n_domains + 1)): + # analyze F-nodes only within the 'source' domain + source_fnodes = [node for node in augmented_nodes if set(node_domain_map[node]) == {source}] + if debug: + print(f"Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}") + if source_fnodes: + # apply algorithm to learn skeleton among the F-node subgraph within a single domain + self._learn_skeleton( + data=data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.cd_estimator, + possible_x_nodes=source_fnodes, + skipped_y_nodes=skip_nodes, + skipped_z_nodes=skip_nodes, + cross_distribution_test=True, + ) + for jdx, target in enumerate(range(1, n_domains + 1)): + # skip if source and target are the same domain if idx == jdx: continue + # skip if we have already seen this domain pair if frozenset([source, target]) in seen_domain_pairs: continue seen_domain_pairs.add(frozenset([source, target])) @@ -1706,47 +1733,23 @@ def fit( # analyze F-nodes between source and target s_node = None for node in s_nodes: - if node_domain_map[node] == {source, target}: + if set(node_domain_map[node]) == {source, target}: s_node = node break if s_node is None: - continue raise RuntimeError("wtf") - this_f_nodes = [ - node - for node in f_nodes - if node_domain_map[node] == {source, target} and node in symmetric_diff_map - ] - if debug: - print( - f"Trying to learn skeleton for {source} and {target} to remove F-nodes: " - f"{this_f_nodes} grouped with S-node: {s_node}" - ) - self._learn_skeleton( - data=data, - context=context, - condsel_method=self.second_stage_condsel_method, - conditional_test_func=self.cd_estimator, - possible_x_nodes=this_f_nodes, - skipped_y_nodes=skip_nodes, - skipped_z_nodes=skip_nodes, - cross_distribution_test=True, - group_with_snode=s_node, - # debug=debug, - ) - + # this is only possible if there is explicitly observational data between # the two domains # analyze S-nodes between source and target this_s_nodes = [ node for node in augmented_nodes - if node_domain_map[node] == {source, target} + if set(node_domain_map[node]) == {source, target} and node not in symmetric_diff_map and node in sigma_map ] if debug: - print(this_f_nodes) print(this_s_nodes) print(symmetric_diff_map) print(sigma_map) @@ -1756,6 +1759,9 @@ def fit( f"Trying to learn skeleton for {source} and {target} to remove " f"S-nodes: {this_s_nodes}" ) + # print(this_s_nodes) + # print(symmetric_diff_map) + # print(sigma_map) self._learn_skeleton( data=data, context=context, @@ -1767,21 +1773,29 @@ def fit( cross_distribution_test=True, ) - # analyze F-nodes only within the 'source' domain - source_fnodes = [node for node in augmented_nodes if node_domain_map[node] == {source}] - if debug: - print(f"Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}") - # apply algorithm to learn skeleton among the F-node subgraph within a single domain - self._learn_skeleton( - data=data, - context=context, - condsel_method=self.second_stage_condsel_method, - conditional_test_func=self.cd_estimator, - possible_x_nodes=source_fnodes, - skipped_y_nodes=skip_nodes, - skipped_z_nodes=skip_nodes, - cross_distribution_test=True, - ) + # now learn across interventions + this_f_nodes = [ + node + for node in f_nodes + if set(node_domain_map[node]) == {source, target} and node in symmetric_diff_map + ] + if debug: + print( + f"Trying to learn skeleton for {source} and {target} to remove F-nodes: " + f"{this_f_nodes} grouped with S-node: {s_node}" + ) + self._learn_skeleton( + data=data, + context=context, + condsel_method=self.second_stage_condsel_method, + conditional_test_func=self.cd_estimator, + possible_x_nodes=this_f_nodes, + skipped_y_nodes=skip_nodes, + skipped_z_nodes=skip_nodes, + cross_distribution_test=True, + s_node=s_node + # debug=debug, + ) # prepare the context object for the second stage of learning # all separating sets are either: diff --git a/dodiscover/metrics.py b/dodiscover/metrics.py index f47b636e3..d33f9d3e6 100644 --- a/dodiscover/metrics.py +++ b/dodiscover/metrics.py @@ -146,3 +146,5 @@ def structure_hamming_dist( diff = diff + diff.T diff[diff > 1] = 1 # Ignoring the double edges. return np.sum(diff) / 2 + + diff --git a/examples/plot_sfci_alg.py b/examples/plot_sfci_alg.py index 663b56cc2..72f185ee1 100644 --- a/examples/plot_sfci_alg.py +++ b/examples/plot_sfci_alg.py @@ -74,7 +74,7 @@ intervention_targets = [df.columns[idx] for idx in unique_ints] data_cols = [col for col in df.columns if col != "INT"] data = [] -domain_ids = np.array([0, 0, 0, 0, 0, 1]) +domain_ids = np.array([1,1,1,1,1,1]) for interv_idx in unique_ints: _data = df[df["INT"] == interv_idx][data_cols] data.append(_data) diff --git a/examples/plot_sfci_with_artificial_sachs.py b/examples/plot_sfci_with_artificial_sachs.py new file mode 100644 index 000000000..6abf0fdfb --- /dev/null +++ b/examples/plot_sfci_with_artificial_sachs.py @@ -0,0 +1,207 @@ +from pprint import pprint +import numpy as np +import scipy +import pandas as pd +import collections +from itertools import combinations +import bnlearn +import pooch +from cdt.data import load_dataset + +from pywhy_graphs.functional import ( + make_graph_linear_gaussian, + make_graph_multidomain, + set_node_attributes_with_G, + apply_linear_soft_intervention, + sample_multidomain_lin_functions, +) +from pywhy_graphs.classes import AugmentedGraph +from pywhy_graphs.viz import draw + +from dodiscover.cd import KernelCDTest +from dodiscover.ci import KernelCITest, FisherZCITest, Oracle, GSquareCITest +from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton +from dodiscover.datasets import sample_from_graph + +from dodiscover import PsiFCI, SFCI, Context, make_context, InterventionalContextBuilder + +def resample_dataset( + G, + df, + prior_multi_dist, + nodes_to_resample, + outcome_values, + n_samples=1000, + seed=12345, +): + rng = np.random.default_rng(seed) + + new_df = np.zeros((n_samples, len(df.columns))) + for idx in range(n_samples): + row_idx = rng.integers(0, len(df)) + + new_df[idx, :] = df.iloc[row_idx, :] + + for jdx, node in enumerate(nodes_to_resample): + prior_dist = prior_multi_dist + col_idx = np.argwhere(df.columns == node).squeeze() + + # sample which index from 1, 2, or 3 it hit + new_sample_idx = rng.multinomial(1, pvals=prior_dist, size=1).squeeze() + new_sample = outcome_values[np.argwhere(new_sample_idx == 1).squeeze()] + new_df[idx, col_idx] = new_sample + + # print("new sample for ", node, new_sample) + # sample the children according to a re-weighted Dirichlet distribution + children = list(G.successors(node)) + for child in children: + child_prior = prior_multi_dist.copy() + child_prior[new_sample_idx] *= new_sample + child_prior = rng.dirichlet(child_prior, 1) + + child_idx = np.argwhere(df.columns == child).squeeze() + + # sample which index from 1, 2, or 3 it hit for children + child_sample_idx = rng.multinomial( + 1, pvals=child_prior, size=1 + ).squeeze() + child_sample = outcome_values[ + np.argwhere(child_sample_idx == 1).squeeze() + ] + new_df[idx, child_idx] = child_sample + # print("New sample for ", child, child_sample) + + new_df = pd.DataFrame(new_df) + new_df.columns = df.columns + return new_df + +seed = 1234 +n_jobs = -1 +rng = np.random.default_rng(seed) +alpha = 0.05 + +# use pooch to download robustly from a url +url = "https://www.bnlearn.com/book-crc/code/sachs.interventional.txt.gz" +file_path = pooch.retrieve( + url=url, + known_hash="md5:39ee257f7eeb94cb60e6177cf80c9544", +) + +df = pd.read_csv(file_path, delimiter=" ") + +perturbations = [df.columns[perturbed_col] for perturbed_col in df["INT"].unique()] +n_proteins = len(df.columns) - 1 + +print(perturbations) + +# the ground-truth dag is shown here: XXX: comment in when errors are fixed +ground_truth_dag = bnlearn.import_DAG("sachs", verbose=False) +ground_truth_G = ground_truth_dag["model"].to_directed() +G = draw(ground_truth_G, direction="TD", shape="circle") + +# generate now bernoulli probability exogenous per protein +prior_protein_exp = rng.dirichlet( + rng.standard_gamma(rng.integers(1, 4), size=3), 1 +).squeeze() + +outcome_values = np.array([1, 2, 3]) +nodes_to_resample = np.array(["Erk", "PKC", "PIP2"]) + +print(prior_protein_exp) +print(prior_protein_exp.sum(axis=0)) + +new_df = resample_dataset( + ground_truth_G, + df, + prior_multi_dist=prior_protein_exp, + nodes_to_resample=nodes_to_resample, + outcome_values=outcome_values, + n_samples=10000, + seed=12345, +) + +# %% +# Preprocess the dataset +# ---------------------- +# Since the data is one dataframe, we need to process it into a form +# that is acceptable by dodiscover's :class:`constraint.PsiFCI` algorithm. We +# will form a list of separate dataframes. +unique_ints = df["INT"].unique() + +# get the list of intervention targets and list of dataframe associated with each intervention +intervention_targets = [] +data_cols = [col for col in df.columns if col != "INT"] +data = [] +domain_ids = [] +for interv_idx in unique_ints: + _data = df[df["INT"] == interv_idx][data_cols].astype(int) + data.append(_data) + intervention_targets.append(df.columns[interv_idx]) + domain_ids.append(1) + + # append second domain + _data = new_df[new_df["INT"] == interv_idx][data_cols].astype(int) + data.append(_data) + intervention_targets.append(df.columns[interv_idx]) + domain_ids.append(2) + +print(len(data), len(intervention_targets), len(domain_ids)) + +# Setup constraint-based learner +# ------------------------------ +# Since we have access to interventional data, the causal discovery algorithm +# we will use that leverages CI and CD tests to estimate causal constraints +# is the Psi-FCI algorithm :footcite:`Jaber2020causal`. + +# Our dataset is comprised of discrete valued data, so we will utilize the +# G^2 (Chi-square) CI test. +ci_estimator = GSquareCITest(data_type="discrete") + +# Since our data is entirely discrete, we can also use the G^2 test as our +# CD test. +cd_estimator = GSquareCITest(data_type="discrete") + +alpha = 0.05 +learner = SFCI( + ci_estimator=ci_estimator, + cd_estimator=cd_estimator, + alpha=alpha, + max_combinations=10, + max_cond_set_size=4, + n_jobs=-1, +) + +# create context with information about the interventions +ctx_builder = make_context(create_using=InterventionalContextBuilder) +ctx: Context = ctx_builder.variables(data=data[0]).num_distributions(len(data)).build() + +# %% +# Run the learning process +# ------------------------ +# We have setup our causal context and causal discovery learner, so we will now +# run the algorithm using the :meth:`constraint.PsiFCI.fit` API, which is similar to scikit-learn's +# `fit` design. All fitted attributes contain an underscore at the end. +learner = learner.fit( + data, ctx, domain_indices=domain_ids, intervention_targets=intervention_targets +) + +# %% +# Analyze the results +# =================== +# Now that we have learned the graph, we will show it here. Note differences and similarities +# to the ground-truth DAG that is "assumed". Moreover, note that this reproduces Supplementary +# Figure 8 in :footcite:`Jaber2020causal`. +est_pag = learner.graph_ + +print(f"There are {len(est_pag.to_undirected().edges)} edges in the resulting PAG") + +# %% +# Visualize the full graph including the F-node +# dot_graph = draw(est_pag, direction="LR") +# dot_graph.render(outfile="psi_pag_full.png", view=True, cleanup=True) + +# %% +# Visualize the graph without the F-nodes +est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes()) +dot_graph = draw(est_pag_no_fnodes, direction="LR") +dot_graph.render(outfile="psi_pag.png", view=True, cleanup=True) \ No newline at end of file diff --git a/tests/unit_tests/conditional/cd/test_cd.py b/tests/unit_tests/conditional/cd/test_cd.py index 8cef4449f..f4fe6689c 100644 --- a/tests/unit_tests/conditional/cd/test_cd.py +++ b/tests/unit_tests/conditional/cd/test_cd.py @@ -4,7 +4,11 @@ from sklearn.ensemble import RandomForestClassifier from dodiscover.cd import BregmanCDTest, KernelCDTest +from pywhy_graphs import AugmentedGraph +from pywhy_graphs.functional import sample_multidomain_lin_functions, make_graph_linear_gaussian + +from dodiscover.datasets import sample_from_graph seed = 12345 # number of samples to use in generating test dataset; the lower the faster @@ -54,12 +58,12 @@ def test_cd_tests_error(cd_func): sample_df = single_env_scm(n_samples=10) cd_estimator = cd_func() with pytest.raises(ValueError, match="The group col"): - cd_estimator.test(sample_df, {y}, group_col={"blah"}, x_vars={x}) + cd_estimator.test(sample_df, y_vars={y}, group_col={"blah"}, x_vars={x}) with pytest.raises(ValueError, match="The x variables are not all"): cd_estimator.test(sample_df, y_vars={y}, group_col={"group"}, x_vars={"blah"}) - with pytest.raises(ValueError, match="The y variables are not all"): + with pytest.raises(ValueError, match="The y variables"): cd_estimator.test(sample_df, y_vars={"blah"}, group_col={"group"}, x_vars={x}) with pytest.raises(ValueError, match="Group column should be only one column"): @@ -68,7 +72,7 @@ def test_cd_tests_error(cd_func): # all the group indicators have different values now from 0/1 sample_df["group"] = sample_df["group"] + 3 with pytest.raises(RuntimeError, match="Group indications in"): - cd_estimator.test(sample_df, {y}, group_col={"group"}, x_vars={x}) + cd_estimator.test(sample_df, y_vars={y}, group_col={"group"}, x_vars={x}) # test pre-fit propensity scores, or custom propensity model with pytest.raises( @@ -117,19 +121,81 @@ def test_cd_simulation(cd_func, df, env_type, cd_kwargs): if env_type == "single": _, pvalue = cd_estimator.test( df, - {"x1"}, - {group_col}, - {"x"}, + y_vars={"x1"}, + group_col={group_col}, + x_vars={"x"}, ) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" - _, pvalue = cd_estimator.test(df, {"z"}, {group_col}, {"x"}) + _, pvalue = cd_estimator.test(df, y_vars={"z"}, group_col={group_col}, x_vars={"x"}) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" - _, pvalue = cd_estimator.test(df, {"y"}, {group_col}, {"x"}) + _, pvalue = cd_estimator.test(df, y_vars={"y"}, group_col={group_col}, x_vars={"x"}) assert pvalue > alpha, f"Fails with {pvalue} not greater than {alpha}" elif env_type == "multi": - _, pvalue = cd_estimator.test(df, {"z"}, {group_col}, {"x"}) + _, pvalue = cd_estimator.test(df, y_vars={"z"}, group_col={group_col}, x_vars={"x"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - _, pvalue = cd_estimator.test(df, {"y"}, {group_col}, {"x"}) + _, pvalue = cd_estimator.test(df, y_vars={"y"}, group_col={group_col}, x_vars={"x"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - _, pvalue = cd_estimator.test(df, {"z"}, {group_col}, {"x1"}) + _, pvalue = cd_estimator.test(df, y_vars={"z"}, group_col={group_col}, x_vars={"x1"}) assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" + + + + +@pytest.mark.parametrize( + ["cd_func", "cd_kwargs"], + [ + # [BregmanCDTest, dict()], + [KernelCDTest, dict()] + ]) +def test_cd_with_selection_diagram(cd_func, cd_kwargs): + alpha = 0.05 + + # create selection diagram S -> X -> Y + G = AugmentedGraph() + G.add_edge("x", "y", G.directed_edge_name) + G.add_s_node((1,2), {'x'}) + + # generate data from a selection diagram + # G = make_graph_linear_gaussian( + # G, + # # node_mean_lims=(-3, -1), + # # node_std_lims=(0.1, 0.2), + # random_state=seed + # ) + G = sample_multidomain_lin_functions( + G, + # node_mean_lims=[(3, 5), (100, 101)], + node_std_lims=[(0.1, 0.3), (2.0, 3.0)], + random_state=seed + ) + data = [] + for domain_id in G.domain_ids: + df = sample_from_graph(G, n_samples=50, sample_func='multidomain', random_state=seed, domain_id=domain_id) + df['domain_id'] = domain_id + data.append(df) + df = pd.concat(data, axis=0) + + # now test each conditional discrepancy test + cd_estimator = cd_func(random_state=seed, null_reps=15, n_jobs=-1, **cd_kwargs) + group_col = 'domain_id' + + # make domains all 0 or 1 + df[group_col] = df[group_col] - 1 + print(G.domains) + print(df[group_col].unique()) + + # P(X) != P'(X) + _, pvalue = cd_estimator.test(df, y_vars={"x"}, group_col={group_col}, x_vars=set()) + assert pvalue > alpha, f"Fails with {pvalue} not less than {alpha}" + + # P(X|Y) != P'(X|Y) + _, pvalue = cd_estimator.test(df, y_vars={"x"}, group_col={group_col}, x_vars={"y"}) + assert pvalue > alpha, f"Fails with {pvalue} not less than {alpha}" + + # P(Y) != P'(Y) + _, pvalue = cd_estimator.test(df, y_vars={"y"}, group_col={group_col}, x_vars=set()) + assert pvalue > alpha, f"Fails with {pvalue} not less than {alpha}" + + # P(Y|X) = P'(Y|X) + _, pvalue = cd_estimator.test(df, y_vars={"y"}, group_col={group_col}, x_vars={"x"}) + assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" \ No newline at end of file diff --git a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py index c8efab4d1..d4222ff4f 100644 --- a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py +++ b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py @@ -1,12 +1,14 @@ +import math +import numpy as np import networkx as nx import pywhy_graphs as pgraphs -from dodiscover import ContextBuilder, make_context +from dodiscover import ContextBuilder, make_context, InterventionalContextBuilder from dodiscover.cd import KernelCDTest from dodiscover.ci import FisherZCITest, Oracle from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton from dodiscover.constraint.utils import dummy_sample -from dodiscover.datasets import linear +from dodiscover.datasets import sample_from_graph def basic_multidomain_augmented_graph(): @@ -29,6 +31,204 @@ def basic_multidomain_augmented_graph(): return graph + +def test_fnode_multidomain_skeleton_known_targets(): + """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`.""" + # first create the oracle + directed_edges = [ + ("x", "w"), + ("w", "y"), + ("z", "y"), + ] + bidirected_edges = [("x", "z"), ("z", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = LearnMultiDomainSkeleton( + ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True + ) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .build() + ) + domain_indices = [1, 1] + intervention_targets = [{}, {'x'}] + learner.fit(data, context, domain_indices=domain_indices, intervention_targets=intervention_targets) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.get_non_augmented_nodes() + ) + for edge in skel_graph.edges(): + if not expected_skeleton.has_edge(*edge): + print('extra edge: ', edge) + for edge in expected_skeleton.edges(): + if not skel_graph.has_edge(*edge): + print('missing edge: ', edge) + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + +def test_number_augmented_nodes_created(): + """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`. + + However, this time, we have an S-node pointing to y. + """ + # first create the oracle + directed_edges = [ + ("x", "w"), + ("w", "y"), + ("z", "y"), + ] + bidirected_edges = [("x", "z"), ("z", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x"}, domain=1) + graph.add_s_node((1, 2), {"y"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + (('S', 0), "y"), + (('S', 0), "x"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_node(("F", 0)) + + # define the learner and the context + learner = LearnMultiDomainSkeleton( + ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True + ) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .build() + ) + domain_indices = [1, 2, 2] + intervention_targets = [{}, {}, {'x'}] + + # test augmented nodes + augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map = learner._create_augmented_nodes(domain_indices, intervention_targets) + assert len(augmented_nodes) == math.comb(len(domain_indices), 2) + assert symmetric_diff_map == {('F', 0): frozenset({'x'}), ('F', 1): frozenset({'x'})} + assert sigma_map == {('F', 0): [0, 2], ('F', 1): [1, 2], ('S', 0): [0, 1]} + assert node_domain_map == {('F', 0): [1, 2], ('F', 1): [2, 2], ('S', 0): [1, 2]} + + + domain_indices = [1, 2, 2, 2, 2] + intervention_targets = [{}, {}, {3}, {2}, {3}] + + # test augmented nodes + augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map = learner._create_augmented_nodes(domain_indices, intervention_targets) + assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - 1 + + +def test_fnode_multidomain_skeleton_known_targets_with_snode(): + """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`. + + However, this time, we have an S-node pointing to y. + """ + # first create the oracle + directed_edges = [ + ("x", "w"), + ("w", "y"), + ("z", "y"), + ] + bidirected_edges = [("x", "z"), ("z", "y")] + graph = pgraphs.AugmentedGraph( + incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges + ) + non_f_graph = graph.copy() + graph.add_f_node({"x"}, domain={1, 2}, require_unique=False) + graph.add_f_node({"x"}, domain={2}, require_unique=False) + graph.add_s_node((1, 2), {"y"}) + oracle = Oracle(graph) + + # define the expected graph we will learn + edges = [ + (("F", 0), "x"), + (("F", 0), "y"), + (("F", 1), "x"), + (("F", 1), "y"), + (('S', 0), "y"), + ("x", "w"), + ("x", "z"), + ("x", "y"), + ("z", "y"), + ("w", "y"), + ] + expected_skeleton = nx.Graph(edges) + obs_expected_skeleton = expected_skeleton.copy() + obs_expected_skeleton.remove_nodes_from(graph.augmented_nodes) + + # define the learner and the context + learner = LearnMultiDomainSkeleton( + ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True, n_jobs=1 + ) + data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph), dummy_sample(non_f_graph)] + context = ( + make_context(create_using=InterventionalContextBuilder) + .variables(data=data[0]) + .build() + ) + domain_indices = [1, 2, 2] + intervention_targets = [{}, {}, {'x'}] + + # test augmented nodes + augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map = learner._create_augmented_nodes(domain_indices, intervention_targets) + assert len(augmented_nodes) == math.comb(len(domain_indices), 2) + + learner.fit(data, context, domain_indices=domain_indices, intervention_targets=intervention_targets) + + # first check the observational skeleton + skel_graph = learner.adj_graph_ + obs_skel_graph = learner.context_.state_variable("obs_skel_graph").subgraph( + context.get_non_augmented_nodes() + ) + for edge in skel_graph.edges(): + if not expected_skeleton.has_edge(*edge): + print('extra edge: ', edge) + for edge in expected_skeleton.edges(): + if not skel_graph.has_edge(*edge): + print('missing edge: ', edge) + assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) + assert nx.is_isomorphic(expected_skeleton, skel_graph) + + + def test_basic_multidomain_fsnode_skeleton(): """Test basic skeleton learning with a multidomain f-node and s-node.""" graph = basic_multidomain_augmented_graph() @@ -112,35 +312,42 @@ def test_basic_multidomain_fsnode_skeleton_with_lindata(): intervention_sets = [] # now for each F-node, apply a linear additive intervention - for f_node, targets in aug_graph.graph["F-nodes"].items(): - new_graph = pgraphs.functional.apply_soft_intervention( + for f_node, fnode_data in aug_graph.graph["F-nodes"].items(): + targets = fnode_data["targets"] + domains = fnode_data["domains"] + new_graph = pgraphs.functional.apply_linear_soft_intervention( graph.copy(), targets, random_state=seed ) # generate dataset - data = linear.sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) + data = sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) datasets.append(data) intervention_sets.append(targets) domain_ids.append(1) + print('Targets are: ', targets) + # now for each S-node, apply a linear additive intervention - for s_node, targets in aug_graph.graph["S-nodes"].items(): - new_graph = pgraphs.functional.apply_soft_intervention( - graph.copy(), targets, random_state=seed - ) + # for s_node, domains in aug_graph.graph["S-nodes"].items(): + # s_node_targets = list(aug_graph.children(s_node)) + # print(list(s_node_targets)) + # print(domains) + # new_graph = pgraphs.functional.apply_linear_soft_intervention( + # graph.copy(), s_node_targets, random_state=seed + # ) - # generate dataset - data = linear.sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) + # # generate dataset + # data = sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) - datasets.append(data) - intervention_sets.append(targets) - domain_ids.append(2) + # datasets.append(data) + # intervention_sets.append(s_node_targets) + # domain_ids.append(domains) learner = LearnMultiDomainSkeleton(ci_estimator=FisherZCITest(), cd_estimator=KernelCDTest()) context = make_context(create_using=ContextBuilder).variables(data=datasets[0]).build() - learner.fit(data, context, domain_ids, intervention_sets) + learner.fit(datasets, context, domain_ids, intervention_sets) # first check the observational skeleton skel_graph = learner.adj_graph_ From 23ac97f23e67ceb36e345c30fe28a8028db72248 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 28 Jun 2023 13:15:47 -0400 Subject: [PATCH 56/61] WIP Signed-off-by: Adam Li --- dodiscover/cd/base.py | 13 ++- dodiscover/cd/bregman.py | 4 + dodiscover/cd/kernel_test.py | 6 +- dodiscover/cd/residual.py | 28 +++---- dodiscover/ci/kernel_utils.py | 2 + dodiscover/ci/oracle.py | 4 +- dodiscover/constraint/skeleton.py | 42 +++++++--- dodiscover/metrics.py | 2 - examples/plot_sfci_alg.py | 2 +- examples/plot_sfci_with_artificial_sachs.py | 16 ++-- tests/unit_tests/conditional/cd/test_cd.py | 30 +++---- .../skeleton/test_multidomain_skeleton.py | 83 +++++++++++-------- 12 files changed, 135 insertions(+), 97 deletions(-) diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index aea69c524..e0a3e5153 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -39,7 +39,9 @@ def _check_test_input( if x_vars is not None and any(col not in df.columns for col in x_vars): raise ValueError("The x variables are not all in the DataFrame.") if any(col not in df.columns for col in y_vars): - raise ValueError(f"The y variables, {y_vars} are not all in the DataFrame: {df.columns}") + raise ValueError( + f"The y variables, {y_vars} are not all in the DataFrame: {df.columns}" + ) if group_col_var not in df.columns: raise ValueError(f"The group column {group_col_var} is not in the DataFrame.") @@ -136,12 +138,17 @@ def _compute_propensity_scores(self, group_ind, **kwargs): return self.propensity_est_ @abstractmethod - def _statistic(self, Y: ArrayLike, group_ind: ArrayLike, X: ArrayLike=None) -> float: + def _statistic(self, Y: ArrayLike, group_ind: ArrayLike, X: ArrayLike = None) -> float: """Abstract method for computing the test statistic.""" pass def compute_null( - self, e_hat: ArrayLike,Y: ArrayLike, X: ArrayLike=None, null_reps: int = 1000, random_state=None + self, + e_hat: ArrayLike, + Y: ArrayLike, + X: ArrayLike = None, + null_reps: int = 1000, + random_state=None, ) -> ArrayLike: """Estimate null distribution using propensity weights. diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index 5ff4bf8d3..7779156b9 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -119,6 +119,10 @@ def _statistic(self, X: ArrayLike, Y: ArrayLike, group_ind: ArrayLike) -> float: Y1 = Y[first_group, :] Y2 = Y[second_group, :] + print('dodiscover') + print(X1.shape, X2.shape, Y1.shape, Y2.shape) + print(X1[:2], X2[:2], Y1[:2], Y2[:2]) + # first compute the centered correntropy matrices, C_xy^1 Cx1y1 = corrent_matrix(np.hstack((X1, Y1)), kwidth=self.kwidth) Cx2y2 = corrent_matrix(np.hstack((X2, Y2)), kwidth=self.kwidth) diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index 7877ea2aa..e4a5138a6 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -151,7 +151,7 @@ def test( pvalue = (1 + np.sum(null_dist >= stat)) / (1 + self.null_reps) return stat, pvalue - def _statistic(self, L: ArrayLike, group_ind: ArrayLike, K: ArrayLike=None) -> float: + def _statistic(self, L: ArrayLike, group_ind: ArrayLike, K: ArrayLike = None) -> float: n_samples = len(L) # compute L kernels @@ -170,7 +170,7 @@ def _statistic(self, L: ArrayLike, group_ind: ArrayLike, K: ArrayLike=None) -> f K1 = K[:, second_mask] KW0 = K0 @ W0 KW1 = K1 @ W1 - + # compute the three terms in Lemma 4.4 first_term = np.trace(KW0.T @ KW0 @ L0) second_term = np.trace(KW1.T @ KW0 @ L01) @@ -180,7 +180,7 @@ def _statistic(self, L: ArrayLike, group_ind: ArrayLike, K: ArrayLike=None) -> f first_term = np.trace(L0) second_term = np.trace(L01) third_term = np.trace(L1) - + # compute final statistic stat = (first_term - 2 * second_term + third_term) / n_samples return stat diff --git a/dodiscover/cd/residual.py b/dodiscover/cd/residual.py index 771d355d4..9dee51853 100644 --- a/dodiscover/cd/residual.py +++ b/dodiscover/cd/residual.py @@ -1,7 +1,8 @@ from typing import Set, Tuple + import numpy as np -from numpy.typing import ArrayLike import pandas as pd +from numpy.typing import ArrayLike from sklearn.metrics import r2_score from dodiscover.typing import Column @@ -58,9 +59,9 @@ def invariant_residual_test( predictor = RandomForestRegressor(max_features="sqrt", **method_kwargs) elif method == "gam": from sklearn.linear_model import LinearRegression - from sklearn.preprocessing import SplineTransformer - from sklearn.pipeline import Pipeline from sklearn.model_selection import GridSearchCV + from sklearn.pipeline import Pipeline + from sklearn.preprocessing import SplineTransformer pipe = Pipeline( steps=[ @@ -72,8 +73,7 @@ def invariant_residual_test( "spline__n_knots": [3, 5, 7, 9], } predictor = GridSearchCV( - pipe, param_grid, n_jobs=-2, refit=True, - scoring="neg_mean_squared_error" + pipe, param_grid, n_jobs=-2, refit=True, scoring="neg_mean_squared_error" ) elif method == "linear": from sklearn.linear_model import LinearRegression @@ -88,8 +88,7 @@ def invariant_residual_test( r2 = r2_score(Y, Y_pred) if test == "whitney_levene": - from scipy.stats import mannwhitneyu - from scipy.stats import levene + from scipy.stats import levene, mannwhitneyu _, mean_pval = mannwhitneyu( residuals[np.asarray(z, dtype=bool)], @@ -118,19 +117,20 @@ def invariant_residual_test( return pval, r2, predictor else: return pval, r2 - -class ResidualCDTest(BaseConditionalDiscrepancyTest): - def __init__(self, method='gam', test_method='ks'): +class ResidualCDTest(BaseConditionalDiscrepancyTest): + def __init__(self, method="gam", test_method="ks"): super().__init__() self.method = method self.test_method = test_method - def _statistic(self, Y, group_ind, X = None) -> float: + def _statistic(self, Y, group_ind, X=None) -> float: return super()._statistic(Y, group_ind, X) - def test(self, df, group_col: Set[Column], y_vars: Set[Column], x_vars: Set[Column]) -> Tuple[float, float]: + def test( + self, df, group_col: Set[Column], y_vars: Set[Column], x_vars: Set[Column] + ) -> Tuple[float, float]: X = df[list(x_vars)].values Y = df[list(y_vars)].values z = df[list(group_col)].values @@ -138,7 +138,7 @@ def test(self, df, group_col: Set[Column], y_vars: Set[Column], x_vars: Set[Colu if x_vars == set(): from scipy.stats import kstest - stat, pval = kstest(Y[z==1], Y[z==0]) + stat, pval = kstest(Y[z == 1], Y[z == 0]) else: pval, r2 = invariant_residual_test( X, @@ -151,4 +151,4 @@ def test(self, df, group_col: Set[Column], y_vars: Set[Column], x_vars: Set[Colu combine_pvalues=True, ) stat = r2 - return stat, pval \ No newline at end of file + return stat, pval diff --git a/dodiscover/ci/kernel_utils.py b/dodiscover/ci/kernel_utils.py index 988b2081d..fa8e78670 100644 --- a/dodiscover/ci/kernel_utils.py +++ b/dodiscover/ci/kernel_utils.py @@ -200,10 +200,12 @@ def compute_kernel( med : float The estimated kernel width. """ + def check_2d(X): if X is not None and X.ndim == 1: X = X.reshape(-1, 1) return X + X = check_2d(X) # if the width of the kernel is not set, then use the median trick to set the diff --git a/dodiscover/ci/oracle.py b/dodiscover/ci/oracle.py index 7e1683873..bdccb54ff 100644 --- a/dodiscover/ci/oracle.py +++ b/dodiscover/ci/oracle.py @@ -23,7 +23,9 @@ class Oracle(BaseConditionalIndependenceTest): _allow_multivariate_input: bool = True - def __init__(self, graph: Graph, included_nodes: Optional[Set[Column]] = None, multivariate_x_vars=None) -> None: + def __init__( + self, graph: Graph, included_nodes: Optional[Set[Column]] = None, multivariate_x_vars=None + ) -> None: self.graph = graph self.included_nodes = included_nodes self.multivariate_xvars = multivariate_x_vars diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index a8a4152e4..09185ec07 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -38,7 +38,7 @@ def _test_xy_edges( data: pd.DataFrame, context: Context, cross_distribution_test: bool = False, - s_node =None, + s_node=None, ) -> Dict[str, Any]: """Private function used to test edge between X and Y in parallel for candidate separating sets. @@ -442,7 +442,7 @@ def _learn_skeleton( data, context, cross_distribution_test, - s_node=s_node + s_node=s_node, ) out.append(result) else: @@ -460,7 +460,7 @@ def _learn_skeleton( data, context, cross_distribution_test, - s_node=s_node + s_node=s_node, ) for x_var, y_var, possible_variables in self._generate_pairs_with_sepset( possible_x_nodes, @@ -660,7 +660,7 @@ def evaluate_edge( X: Column, Y: Column, Z: Optional[Set[Column]] = None, - **kwargs + **kwargs, ) -> Tuple[float, float]: """Test any specific edge for X || Y | Z. @@ -1099,7 +1099,15 @@ def _initialize_params(self, context) -> Context: return super()._initialize_params(context) - def _fit_single_distribution(self, data, context: Context, possible_x_nodes, skipped_y_nodes, skipped_z_nodes, cross_distribution_test): + def _fit_single_distribution( + self, + data, + context: Context, + possible_x_nodes, + skipped_y_nodes, + skipped_z_nodes, + cross_distribution_test, + ): # initially learn the skeleton without using PDS information # apply algorithm to learn skeleton self._learn_skeleton( @@ -1145,7 +1153,14 @@ def fit(self, data: pd.DataFrame, context: Context, check_input: bool = True): context = self._initialize_params(context) # fit the distribution - context = self._fit_single_distribution(data, context, possible_x_nodes=None, skipped_y_nodes=None, skipped_z_nodes=None, cross_distribution_test=False) + context = self._fit_single_distribution( + data, + context, + possible_x_nodes=None, + skipped_y_nodes=None, + skipped_z_nodes=None, + cross_distribution_test=False, + ) self.context_ = deepcopy(context.copy()) self.adj_graph_ = deepcopy(context.init_graph.copy()) @@ -1301,7 +1316,8 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr possible_x_nodes=list(context.get_non_augmented_nodes()), skipped_y_nodes=context.f_nodes, skipped_z_nodes=context.f_nodes, - cross_distribution_test=False) + cross_distribution_test=False, + ) context = self._prep_second_stage_skeleton(context) @@ -1624,7 +1640,7 @@ def fit( # pick a domain and distribution with the largest amount of data largest_data_idx = np.argmax([len(df) for df in data]) obs_data = data[largest_data_idx] - print('Using data from distribution ', largest_data_idx, ' for learning the skeleton.') + print("Using data from distribution ", largest_data_idx, " for learning the skeleton.") self.context_ = context.copy() # initialize learning parameters @@ -1643,7 +1659,7 @@ def fit( # initialize the augmented graph to be fully connected to observed casual variables causal_nodes = set(context.observed_variables) - + # XXX: contextbuilder creates an augmented graph, whereas we want to control that. for node in set(context.init_graph.nodes): if node not in causal_nodes: @@ -1683,7 +1699,7 @@ def fit( possible_x_nodes=causal_nodes, skipped_y_nodes=skip_nodes, skipped_z_nodes=skip_nodes, - cross_distribution_test=False + cross_distribution_test=False, ) # prepare the context object for the second stage of learning @@ -1704,7 +1720,9 @@ def fit( seen_domain_pairs = set() for idx, source in enumerate(range(1, n_domains + 1)): # analyze F-nodes only within the 'source' domain - source_fnodes = [node for node in augmented_nodes if set(node_domain_map[node]) == {source}] + source_fnodes = [ + node for node in augmented_nodes if set(node_domain_map[node]) == {source} + ] if debug: print(f"Trying to learn skeleton for {source} to remove F-nodes: {source_fnodes}") if source_fnodes: @@ -1738,7 +1756,7 @@ def fit( break if s_node is None: raise RuntimeError("wtf") - + # this is only possible if there is explicitly observational data between # the two domains # analyze S-nodes between source and target diff --git a/dodiscover/metrics.py b/dodiscover/metrics.py index d33f9d3e6..f47b636e3 100644 --- a/dodiscover/metrics.py +++ b/dodiscover/metrics.py @@ -146,5 +146,3 @@ def structure_hamming_dist( diff = diff + diff.T diff[diff > 1] = 1 # Ignoring the double edges. return np.sum(diff) / 2 - - diff --git a/examples/plot_sfci_alg.py b/examples/plot_sfci_alg.py index 72f185ee1..a5cd5d6fc 100644 --- a/examples/plot_sfci_alg.py +++ b/examples/plot_sfci_alg.py @@ -74,7 +74,7 @@ intervention_targets = [df.columns[idx] for idx in unique_ints] data_cols = [col for col in df.columns if col != "INT"] data = [] -domain_ids = np.array([1,1,1,1,1,1]) +domain_ids = np.array([1, 1, 1, 1, 1, 1]) for interv_idx in unique_ints: _data = df[df["INT"] == interv_idx][data_cols] data.append(_data) diff --git a/examples/plot_sfci_with_artificial_sachs.py b/examples/plot_sfci_with_artificial_sachs.py index 6abf0fdfb..982c6c5ec 100644 --- a/examples/plot_sfci_with_artificial_sachs.py +++ b/examples/plot_sfci_with_artificial_sachs.py @@ -25,6 +25,7 @@ from dodiscover import PsiFCI, SFCI, Context, make_context, InterventionalContextBuilder + def resample_dataset( G, df, @@ -62,12 +63,8 @@ def resample_dataset( child_idx = np.argwhere(df.columns == child).squeeze() # sample which index from 1, 2, or 3 it hit for children - child_sample_idx = rng.multinomial( - 1, pvals=child_prior, size=1 - ).squeeze() - child_sample = outcome_values[ - np.argwhere(child_sample_idx == 1).squeeze() - ] + child_sample_idx = rng.multinomial(1, pvals=child_prior, size=1).squeeze() + child_sample = outcome_values[np.argwhere(child_sample_idx == 1).squeeze()] new_df[idx, child_idx] = child_sample # print("New sample for ", child, child_sample) @@ -75,6 +72,7 @@ def resample_dataset( new_df.columns = df.columns return new_df + seed = 1234 n_jobs = -1 rng = np.random.default_rng(seed) @@ -100,9 +98,7 @@ def resample_dataset( G = draw(ground_truth_G, direction="TD", shape="circle") # generate now bernoulli probability exogenous per protein -prior_protein_exp = rng.dirichlet( - rng.standard_gamma(rng.integers(1, 4), size=3), 1 -).squeeze() +prior_protein_exp = rng.dirichlet(rng.standard_gamma(rng.integers(1, 4), size=3), 1).squeeze() outcome_values = np.array([1, 2, 3]) nodes_to_resample = np.array(["Erk", "PKC", "PIP2"]) @@ -204,4 +200,4 @@ def resample_dataset( # Visualize the graph without the F-nodes est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes()) dot_graph = draw(est_pag_no_fnodes, direction="LR") -dot_graph.render(outfile="psi_pag.png", view=True, cleanup=True) \ No newline at end of file +dot_graph.render(outfile="psi_pag.png", view=True, cleanup=True) diff --git a/tests/unit_tests/conditional/cd/test_cd.py b/tests/unit_tests/conditional/cd/test_cd.py index f4fe6689c..cf2474cdb 100644 --- a/tests/unit_tests/conditional/cd/test_cd.py +++ b/tests/unit_tests/conditional/cd/test_cd.py @@ -1,14 +1,13 @@ import numpy as np import pandas as pd import pytest +from pywhy_graphs import AugmentedGraph +from pywhy_graphs.functional import make_graph_linear_gaussian, sample_multidomain_lin_functions from sklearn.ensemble import RandomForestClassifier from dodiscover.cd import BregmanCDTest, KernelCDTest -from pywhy_graphs import AugmentedGraph - -from pywhy_graphs.functional import sample_multidomain_lin_functions, make_graph_linear_gaussian - from dodiscover.datasets import sample_from_graph + seed = 12345 # number of samples to use in generating test dataset; the lower the faster @@ -139,21 +138,20 @@ def test_cd_simulation(cd_func, df, env_type, cd_kwargs): assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" - - @pytest.mark.parametrize( ["cd_func", "cd_kwargs"], [ # [BregmanCDTest, dict()], [KernelCDTest, dict()] - ]) + ], +) def test_cd_with_selection_diagram(cd_func, cd_kwargs): alpha = 0.05 # create selection diagram S -> X -> Y G = AugmentedGraph() G.add_edge("x", "y", G.directed_edge_name) - G.add_s_node((1,2), {'x'}) + G.add_s_node((1, 2), {"x"}) # generate data from a selection diagram # G = make_graph_linear_gaussian( @@ -163,27 +161,29 @@ def test_cd_with_selection_diagram(cd_func, cd_kwargs): # random_state=seed # ) G = sample_multidomain_lin_functions( - G, + G, # node_mean_lims=[(3, 5), (100, 101)], node_std_lims=[(0.1, 0.3), (2.0, 3.0)], - random_state=seed + random_state=seed, ) data = [] for domain_id in G.domain_ids: - df = sample_from_graph(G, n_samples=50, sample_func='multidomain', random_state=seed, domain_id=domain_id) - df['domain_id'] = domain_id + df = sample_from_graph( + G, n_samples=50, sample_func="multidomain", random_state=seed, domain_id=domain_id + ) + df["domain_id"] = domain_id data.append(df) df = pd.concat(data, axis=0) # now test each conditional discrepancy test cd_estimator = cd_func(random_state=seed, null_reps=15, n_jobs=-1, **cd_kwargs) - group_col = 'domain_id' + group_col = "domain_id" # make domains all 0 or 1 df[group_col] = df[group_col] - 1 print(G.domains) print(df[group_col].unique()) - + # P(X) != P'(X) _, pvalue = cd_estimator.test(df, y_vars={"x"}, group_col={group_col}, x_vars=set()) assert pvalue > alpha, f"Fails with {pvalue} not less than {alpha}" @@ -198,4 +198,4 @@ def test_cd_with_selection_diagram(cd_func, cd_kwargs): # P(Y|X) = P'(Y|X) _, pvalue = cd_estimator.test(df, y_vars={"y"}, group_col={group_col}, x_vars={"x"}) - assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" \ No newline at end of file + assert pvalue < alpha, f"Fails with {pvalue} not less than {alpha}" diff --git a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py index d4222ff4f..e79766213 100644 --- a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py +++ b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py @@ -1,9 +1,10 @@ import math -import numpy as np + import networkx as nx +import numpy as np import pywhy_graphs as pgraphs -from dodiscover import ContextBuilder, make_context, InterventionalContextBuilder +from dodiscover import ContextBuilder, InterventionalContextBuilder, make_context from dodiscover.cd import KernelCDTest from dodiscover.ci import FisherZCITest, Oracle from dodiscover.constraint.skeleton import LearnMultiDomainSkeleton @@ -31,7 +32,6 @@ def basic_multidomain_augmented_graph(): return graph - def test_fnode_multidomain_skeleton_known_targets(): """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`.""" # first create the oracle @@ -68,13 +68,13 @@ def test_fnode_multidomain_skeleton_known_targets(): ) data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph)] context = ( - make_context(create_using=InterventionalContextBuilder) - .variables(data=data[0]) - .build() + make_context(create_using=InterventionalContextBuilder).variables(data=data[0]).build() ) domain_indices = [1, 1] - intervention_targets = [{}, {'x'}] - learner.fit(data, context, domain_indices=domain_indices, intervention_targets=intervention_targets) + intervention_targets = [{}, {"x"}] + learner.fit( + data, context, domain_indices=domain_indices, intervention_targets=intervention_targets + ) # first check the observational skeleton skel_graph = learner.adj_graph_ @@ -83,17 +83,17 @@ def test_fnode_multidomain_skeleton_known_targets(): ) for edge in skel_graph.edges(): if not expected_skeleton.has_edge(*edge): - print('extra edge: ', edge) + print("extra edge: ", edge) for edge in expected_skeleton.edges(): if not skel_graph.has_edge(*edge): - print('missing edge: ', edge) + print("missing edge: ", edge) assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) assert nx.is_isomorphic(expected_skeleton, skel_graph) def test_number_augmented_nodes_created(): """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`. - + However, this time, we have an S-node pointing to y. """ # first create the oracle @@ -115,8 +115,8 @@ def test_number_augmented_nodes_created(): edges = [ (("F", 0), "x"), (("F", 0), "y"), - (('S', 0), "y"), - (('S', 0), "x"), + (("S", 0), "y"), + (("S", 0), "x"), ("x", "w"), ("x", "z"), ("x", "y"), @@ -133,32 +133,39 @@ def test_number_augmented_nodes_created(): ) data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph), dummy_sample(non_f_graph)] context = ( - make_context(create_using=InterventionalContextBuilder) - .variables(data=data[0]) - .build() + make_context(create_using=InterventionalContextBuilder).variables(data=data[0]).build() ) domain_indices = [1, 2, 2] - intervention_targets = [{}, {}, {'x'}] + intervention_targets = [{}, {}, {"x"}] # test augmented nodes - augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map = learner._create_augmented_nodes(domain_indices, intervention_targets) + ( + augmented_nodes, + symmetric_diff_map, + sigma_map, + node_domain_map, + ) = learner._create_augmented_nodes(domain_indices, intervention_targets) assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - assert symmetric_diff_map == {('F', 0): frozenset({'x'}), ('F', 1): frozenset({'x'})} - assert sigma_map == {('F', 0): [0, 2], ('F', 1): [1, 2], ('S', 0): [0, 1]} - assert node_domain_map == {('F', 0): [1, 2], ('F', 1): [2, 2], ('S', 0): [1, 2]} - + assert symmetric_diff_map == {("F", 0): frozenset({"x"}), ("F", 1): frozenset({"x"})} + assert sigma_map == {("F", 0): [0, 2], ("F", 1): [1, 2], ("S", 0): [0, 1]} + assert node_domain_map == {("F", 0): [1, 2], ("F", 1): [2, 2], ("S", 0): [1, 2]} - domain_indices = [1, 2, 2, 2, 2] + domain_indices = [1, 2, 2, 2, 2] intervention_targets = [{}, {}, {3}, {2}, {3}] # test augmented nodes - augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map = learner._create_augmented_nodes(domain_indices, intervention_targets) + ( + augmented_nodes, + symmetric_diff_map, + sigma_map, + node_domain_map, + ) = learner._create_augmented_nodes(domain_indices, intervention_targets) assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - 1 def test_fnode_multidomain_skeleton_known_targets_with_snode(): """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`. - + However, this time, we have an S-node pointing to y. """ # first create the oracle @@ -183,7 +190,7 @@ def test_fnode_multidomain_skeleton_known_targets_with_snode(): (("F", 0), "y"), (("F", 1), "x"), (("F", 1), "y"), - (('S', 0), "y"), + (("S", 0), "y"), ("x", "w"), ("x", "z"), ("x", "y"), @@ -200,18 +207,23 @@ def test_fnode_multidomain_skeleton_known_targets_with_snode(): ) data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph), dummy_sample(non_f_graph)] context = ( - make_context(create_using=InterventionalContextBuilder) - .variables(data=data[0]) - .build() + make_context(create_using=InterventionalContextBuilder).variables(data=data[0]).build() ) domain_indices = [1, 2, 2] - intervention_targets = [{}, {}, {'x'}] + intervention_targets = [{}, {}, {"x"}] # test augmented nodes - augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map = learner._create_augmented_nodes(domain_indices, intervention_targets) + ( + augmented_nodes, + symmetric_diff_map, + sigma_map, + node_domain_map, + ) = learner._create_augmented_nodes(domain_indices, intervention_targets) assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - learner.fit(data, context, domain_indices=domain_indices, intervention_targets=intervention_targets) + learner.fit( + data, context, domain_indices=domain_indices, intervention_targets=intervention_targets + ) # first check the observational skeleton skel_graph = learner.adj_graph_ @@ -220,15 +232,14 @@ def test_fnode_multidomain_skeleton_known_targets_with_snode(): ) for edge in skel_graph.edges(): if not expected_skeleton.has_edge(*edge): - print('extra edge: ', edge) + print("extra edge: ", edge) for edge in expected_skeleton.edges(): if not skel_graph.has_edge(*edge): - print('missing edge: ', edge) + print("missing edge: ", edge) assert nx.is_isomorphic(obs_expected_skeleton, obs_skel_graph, edge_match=None) assert nx.is_isomorphic(expected_skeleton, skel_graph) - def test_basic_multidomain_fsnode_skeleton(): """Test basic skeleton learning with a multidomain f-node and s-node.""" graph = basic_multidomain_augmented_graph() @@ -326,7 +337,7 @@ def test_basic_multidomain_fsnode_skeleton_with_lindata(): intervention_sets.append(targets) domain_ids.append(1) - print('Targets are: ', targets) + print("Targets are: ", targets) # now for each S-node, apply a linear additive intervention # for s_node, domains in aug_graph.graph["S-nodes"].items(): From bc236c8bf95fa00f0a69f5e1617223ee6b39e63a Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 28 Jun 2023 13:37:45 -0400 Subject: [PATCH 57/61] Finish merging Signed-off-by: Adam Li --- poetry.lock | 3769 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3769 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 000000000..2ff36fde4 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3769 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "bandit" +version = "1.7.5" +description = "Security oriented static analyser for python code." +optional = false +python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=1.0.1" +PyYAML = ">=5.3.1" +rich = "*" +stevedore = ">=1.20.0" + +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.7" +files = [ + {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, + {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, + {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, + {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, + {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, + {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, + {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, + {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, + {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, + {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, + {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, + {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, +] + +[package.dependencies] +click = ">=8.0.0" +ipython = {version = ">=7.8.0", optional = true, markers = "extra == \"jupyter\""} +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tokenize-rt = {version = ">=3.2.0", optional = true, markers = "extra == \"jupyter\""} +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "bleach" +version = "6.0.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] + +[[package]] +name = "bnlearn" +version = "0.7.16" +description = "Python package for learning the graphical structure of Bayesian networks, parameter learning, inference and sampling methods." +optional = false +python-versions = ">=3" +files = [ + {file = "bnlearn-0.7.16-py3-none-any.whl", hash = "sha256:b01b25615b99b03d417dff89b9dc6c513478ff483226fb6438904da52d912fe4"}, + {file = "bnlearn-0.7.16.tar.gz", hash = "sha256:c659d37b2b1f0fc1d7903f8c3dfc35e71e5491dca719b7728521b0ffda7f313b"}, +] + +[package.dependencies] +df2onehot = "*" +fsspec = "*" +funcsigs = "*" +ipywidgets = "*" +ismember = "*" +matplotlib = ">=3.3.4" +networkx = ">=2.7.1" +numpy = ">=1.24.1" +packaging = "*" +pandas = "1.5.3" +pgmpy = ">=0.1.18" +pypickle = "*" +python-louvain = "*" +pyvis = "*" +requests = "*" +scikit-learn = "*" +statsmodels = "*" +tabulate = "*" +tqdm = "*" + +[[package]] +name = "causal-learn" +version = "0.1.3.3" +description = "causal-learn Python Package" +optional = false +python-versions = ">=3.7" +files = [ + {file = "causal-learn-0.1.3.3.tar.gz", hash = "sha256:bef2f4a449fed723bf9025f64a7ae58fa812af28aff98ff5e4fb3cbf0d4bbbb3"}, + {file = "causal_learn-0.1.3.3-py3-none-any.whl", hash = "sha256:c3da164aca6d951ac131330c8b8d160d43a87cc087387ee4573c090dc6576175"}, +] + +[package.dependencies] +graphviz = "*" +matplotlib = "*" +networkx = "*" +numpy = "*" +pandas = "*" +pydot = "*" +scikit-learn = "*" +scipy = "*" +statsmodels = "*" +tqdm = "*" + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "codespell" +version = "2.2.5" +description = "Codespell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "codespell-2.2.5-py3-none-any.whl", hash = "sha256:efa037f54b73c84f7bd14ce8e853d5f822cdd6386ef0ff32e957a3919435b9ec"}, + {file = "codespell-2.2.5.tar.gz", hash = "sha256:6d9faddf6eedb692bf80c9a94ec13ab4f5fb585aabae5f3750727148d7b5be56"}, +] + +[package.extras] +dev = ["Pygments", "build", "chardet", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli"] +hard-encoding-detection = ["chardet"] +toml = ["tomli"] +types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.1.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.6" +files = [ + {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, + {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, +] + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] + +[[package]] +name = "coverage" +version = "7.2.7" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, + {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, + {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, + {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, + {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, + {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, + {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, + {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, + {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, + {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, + {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, + {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, + {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, + {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, + {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, + {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, + {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + +[[package]] +name = "datazets" +version = "0.1.6" +description = "Datazets is a python package to import well known example data sets." +optional = false +python-versions = ">=3" +files = [ + {file = "datazets-0.1.6-py3-none-any.whl", hash = "sha256:21378d59c670ab770d213416aebac74374de2f72f0354285eb5698e0abd4692f"}, + {file = "datazets-0.1.6.tar.gz", hash = "sha256:7672c8777d54bbab4c36179134a3177bdcff56b7ce64312c3c069716cec04f20"}, +] + +[package.dependencies] +numpy = "*" +pandas = "*" +requests = "*" + +[[package]] +name = "debugpy" +version = "1.6.7" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, + {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, + {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, + {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, + {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, + {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, + {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, + {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, + {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, + {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, + {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, + {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, + {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, + {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, + {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, + {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, + {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, + {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "df2onehot" +version = "1.0.6" +description = "Python package df2onehot is to convert a pandas dataframe into a stuctured dataframe." +optional = false +python-versions = ">=3" +files = [ + {file = "df2onehot-1.0.6-py3-none-any.whl", hash = "sha256:35bd62cb4e28ad8895163a536535ae6fc6f171e0ee7efe090b761c664aa5b87b"}, + {file = "df2onehot-1.0.6.tar.gz", hash = "sha256:fb531fa90ba4ae60e38e8b1bc00cc2fcafe304bc1e5b81ec56db2c8b680ebeb6"}, +] + +[package.dependencies] +datazets = "*" +numpy = "*" +pandas = "*" +scikit-learn = "*" +tqdm = "*" + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "docstring-parser" +version = "0.15" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "docstring_parser-0.15-py3-none-any.whl", hash = "sha256:d1679b86250d269d06a99670924d6bce45adc00b08069dae8c47d98e89b667a9"}, + {file = "docstring_parser-0.15.tar.gz", hash = "sha256:48ddc093e8b1865899956fcc03b03e66bb7240c310fac5af81814580c55bf682"}, +] + +[[package]] +name = "docutils" +version = "0.18.1" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, + {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, +] + +[[package]] +name = "dowhy" +version = "0.8" +description = "DoWhy is a Python library for causal inference that supports explicit modeling and testing of causal assumptions." +optional = false +python-versions = ">=3.6" +files = [ + {file = "dowhy-0.8-py3-none-any.whl", hash = "sha256:5b5ff9b0f6c4740073bba83b9a7c209b557b23639f34436c5b2cce706ca8e986"}, + {file = "dowhy-0.8.tar.gz", hash = "sha256:0711489d44de3891bbf853019f60a36a50ff37e33f4173b8e85e93392f37c5f7"}, +] + +[package.dependencies] +networkx = ">=2.0" +numpy = ">=1.15" +pandas = ">=0.24" +pydot = ">=1.4" +scikit-learn = "*" +scipy = "*" +statsmodels = "*" +sympy = ">=1.4" + +[package.extras] +plotting = ["matplotlib"] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "falcon" +version = "2.0.0" +description = "An unladen web framework for building APIs and app backends." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "falcon-2.0.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:733033ec80c896e30a43ab3e776856096836787197a44eb21022320a61311983"}, + {file = "falcon-2.0.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f93351459f110b4c1ee28556aef9a791832df6f910bea7b3f616109d534df06b"}, + {file = "falcon-2.0.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e9efa0791b5d9f9dd9689015ea6bce0a27fcd5ecbcd30e6d940bffa4f7f03389"}, + {file = "falcon-2.0.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59d1e8c993b9a37ea06df9d72cf907a46cc8063b30717cdac2f34d1658b6f936"}, + {file = "falcon-2.0.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:a5ebb22a04c9cc65081938ee7651b4e3b4d2a28522ea8ec04c7bdd2b3e9e8cd8"}, + {file = "falcon-2.0.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:95bf6ce986c1119aef12c9b348f4dee9c6dcc58391bdd0bc2b0bf353c2b15986"}, + {file = "falcon-2.0.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:aa184895d1ad4573fbfaaf803563d02f019ebdf4790e41cc568a330607eae439"}, + {file = "falcon-2.0.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:74cf1d18207381c665b9e6292d65100ce146d958707793174b03869dc6e614f4"}, + {file = "falcon-2.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24adcd2b29a8ffa9d552dc79638cd21736a3fb04eda7d102c6cebafdaadb88ad"}, + {file = "falcon-2.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:18157af2a4fc3feedf2b5dcc6196f448639acf01c68bc33d4d5a04c3ef87f494"}, + {file = "falcon-2.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e3782b7b92fefd46a6ad1fd8fe63fe6c6f1b7740a95ca56957f48d1aee34b357"}, + {file = "falcon-2.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:9712975adcf8c6e12876239085ad757b8fdeba223d46d23daef82b47658f83a9"}, + {file = "falcon-2.0.0-py2.py3-none-any.whl", hash = "sha256:54f2cb4b687035b2a03206dbfc538055cc48b59a953187b0458aa1b574d47b53"}, + {file = "falcon-2.0.0.tar.gz", hash = "sha256:eea593cf466b9c126ce667f6d30503624ef24459f118c75594a69353b6c3d5fc"}, +] + +[[package]] +name = "fastjsonschema" +version = "2.17.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, + {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.12.2" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "flaky" +version = "3.7.0" +description = "Plugin for nose or pytest that automatically reruns flaky tests." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "flaky-3.7.0-py2.py3-none-any.whl", hash = "sha256:d6eda73cab5ae7364504b7c44670f70abed9e75f77dd116352f662817592ec9c"}, + {file = "flaky-3.7.0.tar.gz", hash = "sha256:3ad100780721a1911f57a165809b7ea265a7863305acb66708220820caf8aa0d"}, +] + +[[package]] +name = "fsspec" +version = "2023.6.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, + {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "funcsigs" +version = "1.0.2" +description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" +optional = false +python-versions = "*" +files = [ + {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, + {file = "funcsigs-1.0.2.tar.gz", hash = "sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"}, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[[package]] +name = "graphviz" +version = "0.20.1" +description = "Simple Python interface for Graphviz" +optional = false +python-versions = ">=3.7" +files = [ + {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, + {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, +] + +[package.extras] +dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] +docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] + +[[package]] +name = "hug" +version = "2.6.1" +description = "A Python framework that makes developing APIs as simple as possible, but no simpler." +optional = false +python-versions = ">=3.5" +files = [ + {file = "hug-2.6.1-py2.py3-none-any.whl", hash = "sha256:31c8fc284f81377278629a4b94cbb619ae9ce829cdc2da9564ccc66a121046b4"}, + {file = "hug-2.6.1.tar.gz", hash = "sha256:b0edace2acb618873779c9ce6ecf9165db54fef95c22262f5700fcdd9febaec9"}, +] + +[package.dependencies] +falcon = "2.0.0" +requests = "*" + +[[package]] +name = "identify" +version = "2.5.24" +description = "File identification library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, + {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.23.3" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.23.3-py3-none-any.whl", hash = "sha256:bc00662dc44d4975b668cdb5fefb725e38e9d8d6e28441a519d043f38994922d"}, + {file = "ipykernel-6.23.3.tar.gz", hash = "sha256:dd4e18116357f36a1e459b3768412371bee764c51844cbf25c4ed1eb9cae4a54"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "7.34.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipython-7.34.0-py3-none-any.whl", hash = "sha256:c175d2440a1caff76116eb719d40538fbb316e214eda85c5515c303aacbfb23e"}, + {file = "ipython-7.34.0.tar.gz", hash = "sha256:af3bdb46aa292bce5615b1b2ebc76c2080c5f77f54bda2ec72461317273e7cd6"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +setuptools = ">=18.5" +traitlets = ">=4.2" + +[package.extras] +all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments", "requests", "testpath"] + +[[package]] +name = "ipywidgets" +version = "8.0.6" +description = "Jupyter interactive widgets" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.0.6-py3-none-any.whl", hash = "sha256:a60bf8d2528997e05ac83fd19ea2fbe65f2e79fbe1b2b35779bdfc46c2941dcc"}, + {file = "ipywidgets-8.0.6.tar.gz", hash = "sha256:de7d779f2045d60de9f6c25f653fdae2dba57898e6a1284494b3ba20b6893bb8"}, +] + +[package.dependencies] +ipykernel = ">=4.5.1" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0.7,<3.1.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0.7,<4.1.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "ismember" +version = "1.0.2" +description = "Python package ismember returns array elements that are members of set array." +optional = false +python-versions = ">=3" +files = [ + {file = "ismember-1.0.2-py3-none-any.whl", hash = "sha256:67319cd9f02d6f66124a22c16f42d174a4697aaaf23a931eff44fae4525ec493"}, + {file = "ismember-1.0.2.tar.gz", hash = "sha256:b1a784e45ba9d1fd18303fe3b829270a6922954cc5798f49fdf843758a8d0d10"}, +] + +[package.dependencies] +numpy = "*" + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.3.0" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.0-py3-none-any.whl", hash = "sha256:172d56d4c43dd6bcd953bea213018c4084cf754963bbf54b8dae40faea716b98"}, + {file = "joblib-1.3.0.tar.gz", hash = "sha256:0b12a65dc76c530dbd790dd92881f75c40932b4254a7c8e608a868df408ca0a3"}, +] + +[[package]] +name = "jsonpickle" +version = "3.0.1" +description = "Python library for serializing any arbitrary object graph into JSON" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpickle-3.0.1-py2.py3-none-any.whl", hash = "sha256:130d8b293ea0add3845de311aaba55e6d706d0bb17bc123bd2c8baf8a39ac77c"}, + {file = "jsonpickle-3.0.1.tar.gz", hash = "sha256:032538804795e73b94ead410800ac387fdb6de98f8882ac957fcd247e3a85200"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=3.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=3.5,!=3.7.3)", "pytest-black-multipy", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-flake8 (>=1.1.1)", "scikit-learn", "sqlalchemy"] +testing-libs = ["simplejson", "ujson"] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter-client" +version = "8.3.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, + {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.3.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, + {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.7" +description = "Jupyter interactive widgets for JupyterLab" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.7-py3-none-any.whl", hash = "sha256:c73f8370338ec19f1bec47254752d6505b03601cbd5a67e6a0b184532f73a459"}, + {file = "jupyterlab_widgets-3.0.7.tar.gz", hash = "sha256:c3a50ed5bf528a0c7a869096503af54702f86dda1db469aee1c92dc0c01b43ca"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] + +[[package]] +name = "latexcodec" +version = "2.0.1" +description = "A lexer and codec to work with LaTeX code in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "latexcodec-2.0.1-py2.py3-none-any.whl", hash = "sha256:c277a193638dc7683c4c30f6684e3db728a06efb0dc9cf346db8bd0aa6c5d271"}, + {file = "latexcodec-2.0.1.tar.gz", hash = "sha256:2aa2551c373261cefe2ad3a8953a6d6533e68238d180eb4bb91d7964adb3fe9a"}, +] + +[package.dependencies] +six = ">=1.4.1" + +[[package]] +name = "livereload" +version = "2.6.3" +description = "Python LiveReload is an awesome tool for web developers" +optional = false +python-versions = "*" +files = [ + {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, + {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, +] + +[package.dependencies] +six = "*" +tornado = {version = "*", markers = "python_version > \"2.7\""} + +[[package]] +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markdown" +version = "3.3.7" +description = "Python implementation of Markdown." +optional = false +python-versions = ">=3.6" +files = [ + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "matplotlib" +version = "3.7.1" +description = "Python plotting package" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "memory-profiler" +version = "0.60.0" +description = "A module for monitoring memory usage of a python program" +optional = false +python-versions = ">=3.4" +files = [ + {file = "memory_profiler-0.60.0.tar.gz", hash = "sha256:6a12869511d6cebcb29b71ba26985675a58e16e06b3c523b49f67c5497a33d1c"}, +] + +[package.dependencies] +psutil = "*" + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mistune" +version = "3.0.1" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, + {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, +] + +[[package]] +name = "mkdocs" +version = "1.3.1" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-1.3.1-py3-none-any.whl", hash = "sha256:fda92466393127d2da830bc6edc3a625a14b436316d1caf347690648e774c4f0"}, + {file = "mkdocs-1.3.1.tar.gz", hash = "sha256:a41a2ff25ce3bbacc953f9844ba07d106233cd76c88bac1f59cb1564ac0d87ed"}, +] + +[package.dependencies] +click = ">=3.3" +ghp-import = ">=1.0" +importlib-metadata = ">=4.3" +Jinja2 = ">=2.10.2" +Markdown = ">=3.2.1,<3.4" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +PyYAML = ">=3.10" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] + +[[package]] +name = "mkdocs-material" +version = "8.5.4" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material-8.5.4-py3-none-any.whl", hash = "sha256:aec2f0f2143109f8388aadf76e6fff749a2b74ebe730d0f674c65b53da89d19d"}, + {file = "mkdocs_material-8.5.4.tar.gz", hash = "sha256:70dc47820d4765b77968b9119f2957d09b4d8d328d950bee4544ff224d5c7b36"}, +] + +[package.dependencies] +jinja2 = ">=3.0.2" +markdown = ">=3.2" +mkdocs = ">=1.3.0" +mkdocs-material-extensions = ">=1.0.3" +pygments = ">=2.12" +pymdown-extensions = ">=9.4" +requests = ">=2.26" + +[[package]] +name = "mkdocs-material-extensions" +version = "1.1.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"}, + {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"}, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "mypy" +version = "0.971" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, + {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, + {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, + {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, + {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, + {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, + {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, + {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, + {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, + {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, + {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, + {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, + {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, + {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, + {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, + {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, + {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, + {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, + {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, + {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, + {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, +] + +[package.dependencies] +mypy-extensions = ">=0.4.3" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nbclient" +version = "0.8.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, + {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.6.0" +description = "Converting Jupyter Notebooks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nbconvert-7.6.0-py3-none-any.whl", hash = "sha256:5a445c6794b0791984bc5436608fe2c066cb43c83920c7bc91bde3b765e9a264"}, + {file = "nbconvert-7.6.0.tar.gz", hash = "sha256:24fcf27efdef2b51d7f090cc5ce5a9b178766a55be513c4ebab08c91899ab550"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +webpdf = ["pyppeteer (>=1,<1.1)"] + +[[package]] +name = "nbformat" +version = "5.9.0" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.0-py3-none-any.whl", hash = "sha256:8c8fa16d6d05062c26177754bfbfac22de644888e2ef69d27ad2a334cf2576e5"}, + {file = "nbformat-5.9.0.tar.gz", hash = "sha256:e98ebb6120c3efbafdee2a40af2a140cadee90bb06dd69a2a63d9551fcc7f976"}, +] + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nbsphinx" +version = "0.8.12" +description = "Jupyter Notebook Tools for Sphinx" +optional = false +python-versions = ">=3.6" +files = [ + {file = "nbsphinx-0.8.12-py3-none-any.whl", hash = "sha256:c15b681c7fce287000856f91fe1edac50d29f7b0c15bbc746fbe55c8eb84750b"}, + {file = "nbsphinx-0.8.12.tar.gz", hash = "sha256:76570416cdecbeb21dbf5c3d6aa204ced6c1dd7ebef4077b5c21b8c6ece9533f"}, +] + +[package.dependencies] +docutils = "*" +jinja2 = "*" +nbconvert = "!=5.4" +nbformat = "*" +sphinx = ">=1.8" +traitlets = ">=5" + +[[package]] +name = "nest-asyncio" +version = "1.5.6" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] + +[[package]] +name = "networkx" +version = "3.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36"}, + {file = "networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=1.1)", "pre-commit (>=3.2)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.13)", "sphinx (>=6.1)", "sphinx-gallery (>=0.12)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.24.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +] + +[[package]] +name = "numpydoc" +version = "1.5.0" +description = "Sphinx extension to support docstrings in Numpy format" +optional = false +python-versions = ">=3.7" +files = [ + {file = "numpydoc-1.5.0-py3-none-any.whl", hash = "sha256:c997759fb6fc32662801cece76491eedbc0ec619b514932ffd2b270ae89c07f9"}, + {file = "numpydoc-1.5.0.tar.gz", hash = "sha256:b0db7b75a32367a0e25c23b397842c65e344a1206524d16c8069f0a1c91b5f4c"}, +] + +[package.dependencies] +Jinja2 = ">=2.10" +sphinx = ">=4.2" + +[package.extras] +testing = ["matplotlib", "pytest", "pytest-cov"] + +[[package]] +name = "opt-einsum" +version = "3.3.0" +description = "Optimizing numpys einsum function" +optional = false +python-versions = ">=3.5" +files = [ + {file = "opt_einsum-3.3.0-py3-none-any.whl", hash = "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147"}, + {file = "opt_einsum-3.3.0.tar.gz", hash = "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549"}, +] + +[package.dependencies] +numpy = ">=1.7" + +[package.extras] +docs = ["numpydoc", "sphinx (==1.2.3)", "sphinx-rtd-theme", "sphinxcontrib-napoleon"] +tests = ["pytest", "pytest-cov", "pytest-pep8"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pandas" +version = "1.5.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "patsy" +version = "0.5.3" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = "*" +files = [ + {file = "patsy-0.5.3-py2.py3-none-any.whl", hash = "sha256:7eb5349754ed6aa982af81f636479b1b8db9d5b1a6e957a6016ec0534b5c86b7"}, + {file = "patsy-0.5.3.tar.gz", hash = "sha256:bdc18001875e319bc91c812c1eb6a10be4bb13cb81eb763f466179dca3b67277"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + +[[package]] +name = "pbr" +version = "5.11.1" +description = "Python Build Reasonableness" +optional = false +python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] + +[[package]] +name = "pdocs" +version = "1.2.0" +description = "A simple program and library to auto generate API documentation for Python modules." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pdocs-1.2.0-py3-none-any.whl", hash = "sha256:caca2829415e62d31eaab46c53cd77a2a14f132c73e48e25187331c3a9fc2459"}, + {file = "pdocs-1.2.0.tar.gz", hash = "sha256:996ad4d5039b59a9a112d29abfb3995ec4ed8d8415ddce6947c3a5248adb428b"}, +] + +[package.dependencies] +docstring_parser = ">=0.7.2" +hug = ">=2.6" +Mako = ">1.2.2" +Markdown = ">=3.0.0" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pgmpy" +version = "0.1.22" +description = "A library for Probabilistic Graphical Models" +optional = false +python-versions = "*" +files = [ + {file = "pgmpy-0.1.22-py3-none-any.whl", hash = "sha256:c5385498869364a36782601b78555669ae4c02f4850932918084bde47674a2ca"}, + {file = "pgmpy-0.1.22.tar.gz", hash = "sha256:b2deb8126ee4763ba3dcd35c5f0b9424750ddb1b7a9db090d57a8378f9e91e04"}, +] + +[package.dependencies] +joblib = "*" +networkx = "*" +numpy = "*" +opt-einsum = "*" +pandas = "*" +pyparsing = "*" +scikit-learn = "*" +scipy = "*" +statsmodels = "*" +torch = "*" +tqdm = "*" + +[package.extras] +all = ["black", "codecov", "coverage", "daft", "joblib", "mock", "networkx", "numpy", "opt-einsum", "pandas", "pyparsing", "pytest", "pytest-cov", "scikit-learn", "scipy", "statsmodels", "torch", "tqdm", "xdoctest"] +tests = ["black", "codecov", "coverage", "mock", "pytest", "pytest-cov", "xdoctest"] + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "3.8.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.8.0-py3-none-any.whl", hash = "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e"}, + {file = "platformdirs-3.8.0.tar.gz", hash = "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.16.5" +description = "A task runner that works well with poetry." +optional = false +python-versions = ">=3.7" +files = [ + {file = "poethepoet-0.16.5-py3-none-any.whl", hash = "sha256:493d5d47b4cb0894dde6a69d14129ba39ef3f124fabda1f83ebb39bbf737a40e"}, + {file = "poethepoet-0.16.5.tar.gz", hash = "sha256:3c958792ce488661ba09df67ba832a1b3141aa640236505ee60c23f4b1db4dbc"}, +] + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry-plugin = ["poetry (>=1.0,<2.0)"] + +[[package]] +name = "pooch" +version = "1.7.0" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, + {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + +[[package]] +name = "portray" +version = "1.8.0" +description = "Your Project with Great Documentation" +optional = false +python-versions = ">3.7" +files = [ + {file = "portray-1.8.0-py3-none-any.whl", hash = "sha256:c7ee981b51f9b41b60b04c1351e1b61edd291049d10c45f7c8f05897caa6a931"}, + {file = "portray-1.8.0.tar.gz", hash = "sha256:a9dd2973a0235051c5b68a29390c3eeee192dc248cc2d944452ee9c02423b47d"}, +] + +[package.dependencies] +GitPython = ">=3.0" +hug = ">=2.6" +livereload = ">=2.6.3" +mkdocs = ">=1.3.0,<1.4.0" +mkdocs-material = ">=7.0" +pdocs = ">=1.2.0" +pymdown-extensions = ">=7.0" +toml = ">=0.10.0" +yaspin = ">=0.15.0,<3" + +[[package]] +name = "pre-commit" +version = "3.3.3" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, + {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "progressbar2" +version = "4.2.0" +description = "A Python Progressbar library to provide visual (yet text based) progress to long running operations." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "progressbar2-4.2.0-py2.py3-none-any.whl", hash = "sha256:1a8e201211f99a85df55f720b3b6da7fb5c8cdef56792c4547205be2de5ea606"}, + {file = "progressbar2-4.2.0.tar.gz", hash = "sha256:1393922fcb64598944ad457569fbeb4b3ac189ef50b5adb9cef3284e87e394ce"}, +] + +[package.dependencies] +python-utils = ">=3.0.0" + +[package.extras] +docs = ["sphinx (>=1.8.5)"] +tests = ["flake8 (>=3.7.7)", "freezegun (>=0.3.11)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "pytest-mypy", "sphinx (>=1.8.5)"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.38" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.5" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pybtex" +version = "0.24.0" +description = "A BibTeX-compatible bibliography processor in Python" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "pybtex-0.24.0-py2.py3-none-any.whl", hash = "sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f"}, + {file = "pybtex-0.24.0.tar.gz", hash = "sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755"}, +] + +[package.dependencies] +latexcodec = ">=1.0.4" +PyYAML = ">=3.01" +six = "*" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "pybtex-docutils" +version = "1.0.2" +description = "A docutils backend for pybtex." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybtex-docutils-1.0.2.tar.gz", hash = "sha256:43aa353b6d498fd5ac30f0073a98e332d061d34fe619d3d50d1761f8fd4aa016"}, + {file = "pybtex_docutils-1.0.2-py3-none-any.whl", hash = "sha256:6f9e3c25a37bcaac8c4f69513272706ec6253bb708a93d8b4b173f43915ba239"}, +] + +[package.dependencies] +docutils = ">=0.8" +pybtex = ">=0.16" + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydata-sphinx-theme" +version = "0.9.0" +description = "Bootstrap-based Sphinx theme from the PyData community" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydata_sphinx_theme-0.9.0-py3-none-any.whl", hash = "sha256:b22b442a6d6437e5eaf0a1f057169ffcb31eaa9f10be7d5481a125e735c71c12"}, + {file = "pydata_sphinx_theme-0.9.0.tar.gz", hash = "sha256:03598a86915b596f4bf80bef79a4d33276a83e670bf360def699dbb9f99dc57a"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +docutils = "!=0.17.0" +packaging = "*" +sphinx = ">=4.0.2" + +[package.extras] +coverage = ["codecov", "pydata-sphinx-theme[test]", "pytest-cov"] +dev = ["nox", "pre-commit", "pydata-sphinx-theme[coverage]", "pyyaml"] +doc = ["jupyter_sphinx", "myst-parser", "numpy", "numpydoc", "pandas", "plotly", "pytest", "pytest-regressions", "sphinx-design", "sphinx-sitemap", "sphinxext-rediraffe", "xarray"] +test = ["pydata-sphinx-theme[doc]", "pytest"] + +[[package]] +name = "pydocstyle" +version = "6.3.0" +description = "Python docstring style checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] + +[package.dependencies] +snowballstemmer = ">=2.2.0" + +[package.extras] +toml = ["tomli (>=1.2.3)"] + +[[package]] +name = "pydot" +version = "1.4.2" +description = "Python interface to Graphviz's Dot" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pydot-1.4.2-py2.py3-none-any.whl", hash = "sha256:66c98190c65b8d2e2382a441b4c0edfdb4f4c025ef9cb9874de478fb0793a451"}, + {file = "pydot-1.4.2.tar.gz", hash = "sha256:248081a39bcb56784deb018977e428605c1c758f10897a339fce1dd728ff007d"}, +] + +[package.dependencies] +pyparsing = ">=2.1.4" + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pygam" +version = "0.9.0" +description = "" +optional = false +python-versions = ">=3.8.1,<3.12" +files = [ + {file = "pygam-0.9.0-py3-none-any.whl", hash = "sha256:3537bbcdbc49d93010c12fb3fdb2f53e1dd062d21eb721a328817aefd91945f4"}, + {file = "pygam-0.9.0.tar.gz", hash = "sha256:dba62285a275cdd15a6adf764f6717b3cd077502f01cf1bcee5ce7cbda221956"}, +] + +[package.dependencies] +numpy = ">=1.24.2,<2.0.0" +progressbar2 = ">=4.2.0,<5.0.0" +scipy = ">=1.10.1,<2.0.0" + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pygraphviz" +version = "1.11" +description = "Python interface to Graphviz" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygraphviz-1.11.zip", hash = "sha256:a97eb5ced266f45053ebb1f2c6c6d29091690503e3a5c14be7f908b37b06f2d4"}, +] + +[[package]] +name = "pymdown-extensions" +version = "10.0.1" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, +] + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[[package]] +name = "pyparsing" +version = "3.1.0" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.0-py3-none-any.whl", hash = "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1"}, + {file = "pyparsing-3.1.0.tar.gz", hash = "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pypickle" +version = "1.1.0" +description = "pypickle is to save and load variables in/from pickle files" +optional = false +python-versions = ">=3" +files = [ + {file = "pypickle-1.1.0-py3-none-any.whl", hash = "sha256:3f0454b36e7d833aa76c4b8495802a2369da488de585f97071dc99733982a273"}, + {file = "pypickle-1.1.0.tar.gz", hash = "sha256:431739b9e22cc7fd093f9f605660cdbb7a5582182ca44de1616c32b651f969ef"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-louvain" +version = "0.16" +description = "Louvain algorithm for community detection" +optional = false +python-versions = "*" +files = [ + {file = "python-louvain-0.16.tar.gz", hash = "sha256:b7ba2df5002fd28d3ee789a49532baad11fe648e4f2117cf0798e7520a1da56b"}, +] + +[package.dependencies] +networkx = "*" +numpy = "*" + +[[package]] +name = "python-utils" +version = "3.7.0" +description = "Python Utils is a module with some convenient utilities not included with the standard Python install" +optional = false +python-versions = ">3.8.0" +files = [ + {file = "python-utils-3.7.0.tar.gz", hash = "sha256:1970468fff1c0adbd60b9a751e6a786223a9f0373c954571912d9cf4be49b552"}, + {file = "python_utils-3.7.0-py2.py3-none-any.whl", hash = "sha256:e31c1187168c314c984932e99c2d3f973465443493869ae041dd9e2e18e998aa"}, +] + +[package.dependencies] +typing-extensions = ">3.10.0.2" + +[package.extras] +docs = ["mock", "python-utils", "sphinx"] +loguru = ["loguru"] +tests = ["flake8", "loguru", "pytest", "pytest-asyncio", "pytest-cov", "pytest-mypy", "sphinx", "types-setuptools"] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[package]] +name = "pyvis" +version = "0.3.2" +description = "A Python network graph visualization library" +optional = false +python-versions = ">3.6" +files = [ + {file = "pyvis-0.3.2-py3-none-any.whl", hash = "sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555"}, +] + +[package.dependencies] +ipython = ">=5.3.0" +jinja2 = ">=2.9.6" +jsonpickle = ">=1.4.1" +networkx = ">=1.11" + +[[package]] +name = "pywhy-graphs" +version = "0.0.0" +description = "Causal Graphs for Python" +optional = true +python-versions = ">=3.8,<3.12" +files = [] +develop = false + +[package.dependencies] +networkx = "^3.1" +numpy = "^1.21.0" +scipy = "^1.8.0" + +[package.extras] +viz = ["pygraphviz"] + +[package.source] +type = "git" +url = "https://github.com/py-why/pywhy-graphs.git" +reference = "main" +resolved_reference = "b71f7eeb95480c0a735063e63a2d529a243326d3" + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "pyzmq" +version = "25.1.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, + {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, + {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, + {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, + {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, + {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, + {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, + {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, + {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, + {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, + {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, + {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, + {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, + {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, + {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, + {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, + {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, + {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, + {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, + {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, + {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, + {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, + {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, + {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, + {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, + {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, + {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, + {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, + {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, + {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, + {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, + {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, + {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, + {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, + {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, + {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, + {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, + {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, + {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, + {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, + {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, + {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, + {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, + {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, + {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, + {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, + {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, + {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, + {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, + {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, + {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, + {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, + {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, + {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, + {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, + {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, + {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, + {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, + {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, + {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, + {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, + {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, + {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, + {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, + {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, + {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, + {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, + {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, + {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, + {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, + {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, + {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, + {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, + {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, + {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, + {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, + {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rich" +version = "13.4.2" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.4.2-py3-none-any.whl", hash = "sha256:8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec"}, + {file = "rich-13.4.2.tar.gz", hash = "sha256:d653d6bccede5844304c605d5aac802c7cf9621efd700b46c7ec2b51ea914898"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "scikit-learn" +version = "1.2.2" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, + {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, + {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, + {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.3.2" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scipy" +version = "1.11.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "scipy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2e4f14c11fbf825319dbd7f467639a241e7c956c34edb1e036ec7bb6271e4f7b"}, + {file = "scipy-1.11.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b269ed44e2e2e43611f2ae95ba551fd98abbdc1a7ea8268f72f75876982368c4"}, + {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c29bae479b17d85208dfdfc67e50d5944ee23211f236728aadde9b0b7c1c33e"}, + {file = "scipy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a53f9cebcfda6158c241c35a559407a4ef6b8cb0863eb4144958fe0a0b7c3dae"}, + {file = "scipy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ebf4b2ea26d50312731ddba2406389c5ddcbff9d777cf3277ea11decc81e5dfb"}, + {file = "scipy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:894ced9a2cdb050ff5e392f274617af46dca896d5c9112fa4a2019929554d321"}, + {file = "scipy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a92bd3cd4acad2e0e0b360176d5ec68b100983c8145add8a8233acddf4e5fcc"}, + {file = "scipy-1.11.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:586608ea35206257d4e0ce6f154a6cfef71723b2c1f6d40de5e0b0e8a81cd2ff"}, + {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e631c3c49c24f30828580b8126fe3be5cca5409dad5b797418a5b8965eeafa"}, + {file = "scipy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc70892ea674f93183c5c4139557b611e42f644dd755da4b19ca974ab770672"}, + {file = "scipy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80015b8928f91bd40377b2b1010ba2e09b03680cbfc291208740494aeb8debf2"}, + {file = "scipy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:6302c7cba5bf99c901653ff158746625526cc438f058bce41514d7469b79b2c3"}, + {file = "scipy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c61ea63124da6a3cff38126426912cc86420898b4902a9bc5e5b6524547a6dcb"}, + {file = "scipy-1.11.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:684d44607eacd5dd367c7a9e76e922523fa9c0a7f2379a4d0fc4d70d751464cc"}, + {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0c9c160d117fe71cd2a12ef21cce8e0475ade2fd97c761ef327b9839089bd16"}, + {file = "scipy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83867a63515c4e3fce3272d81200dda614d70f4c3a22f047d84021bfe83d7929"}, + {file = "scipy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6666a1e31b2123a077f0dc7ab1053e36479cfd457fb9f5c367e7198505c6607a"}, + {file = "scipy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:fad4006248513528e0c496de295a9f4d2b65086cc0e388f748e7dbf49fa12760"}, + {file = "scipy-1.11.0.tar.gz", hash = "sha256:f9b0248cb9d08eead44cde47cbf6339f1e9aa0dfde28f5fb27950743e317bd5d"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "sphinx" +version = "5.3.0" +description = "Python documentation generator" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, + {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.12" +requests = ">=2.5.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +description = "Add a copy button to each of your code cells." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[package.dependencies] +sphinx = ">=1.8" + +[package.extras] +code-style = ["pre-commit (==2.12.1)"] +rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] + +[[package]] +name = "sphinx-gallery" +version = "0.11.1" +description = "A Sphinx extension that builds an HTML version of any Python script and puts it into an examples gallery." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-gallery-0.11.1.tar.gz", hash = "sha256:56ccb29a0c2c4767d2a66617ba6ea7893e3a3885b6d972c62783a3b45b583ea5"}, + {file = "sphinx_gallery-0.11.1-py3-none-any.whl", hash = "sha256:b165cb366a5768a0f36e60e5bc6828fbf55fd1831e71645310167375223aa25c"}, +] + +[package.dependencies] +sphinx = ">=3" + +[[package]] +name = "sphinx-issues" +version = "3.0.1" +description = "A Sphinx extension for linking to your project's issue tracker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinx-issues-3.0.1.tar.gz", hash = "sha256:b7c1dc1f4808563c454d11c1112796f8c176cdecfee95f0fd2302ef98e21e3d6"}, + {file = "sphinx_issues-3.0.1-py3-none-any.whl", hash = "sha256:8b25dc0301159375468f563b3699af7a63720fd84caf81c1442036fcd418b20c"}, +] + +[package.dependencies] +sphinx = "*" + +[package.extras] +dev = ["flake8 (==3.9.2)", "flake8-bugbear (==20.11.1)", "pre-commit (>=2.7,<3.0)", "pytest (>=6.2.0)", "tox"] +lint = ["flake8 (==3.9.2)", "flake8-bugbear (==20.11.1)", "pre-commit (>=2.7,<3.0)"] +tests = ["pytest (>=6.2.0)"] + +[[package]] +name = "sphinx-rtd-theme" +version = "1.2.2" +description = "Read the Docs theme for Sphinx" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "sphinx_rtd_theme-1.2.2-py2.py3-none-any.whl", hash = "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689"}, + {file = "sphinx_rtd_theme-1.2.2.tar.gz", hash = "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7"}, +] + +[package.dependencies] +docutils = "<0.19" +sphinx = ">=1.6,<7" +sphinxcontrib-jquery = ">=4,<5" + +[package.extras] +dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-bibtex" +version = "2.5.0" +description = "Sphinx extension for BibTeX style citations." +optional = false +python-versions = ">=3.6" +files = [ + {file = "sphinxcontrib-bibtex-2.5.0.tar.gz", hash = "sha256:71b42e5db0e2e284f243875326bf9936aa9a763282277d75048826fef5b00eaa"}, + {file = "sphinxcontrib_bibtex-2.5.0-py3-none-any.whl", hash = "sha256:748f726eaca6efff7731012103417ef130ecdcc09501b4d0c54283bf5f059f76"}, +] + +[package.dependencies] +docutils = ">=0.8" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +pybtex = ">=0.24" +pybtex-docutils = ">=1.0.0" +Sphinx = ">=2.1" + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jquery" +version = "4.1" +description = "Extension to include jQuery on newer Sphinx releases" +optional = false +python-versions = ">=2.7" +files = [ + {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, + {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"}, +] + +[package.dependencies] +Sphinx = ">=1.8" + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "statsmodels" +version = "0.14.0" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "statsmodels-0.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:16bfe0c96a53b20fa19067e3b6bd2f1d39e30d4891ea0d7bc20734a0ae95942d"}, + {file = "statsmodels-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a6a0a1a06ff79be8aa89c8494b33903442859add133f0dda1daf37c3c71682e"}, + {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77b3cd3a5268ef966a0a08582c591bd29c09c88b4566c892a7c087935234f285"}, + {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c64ebe9cf376cba0c31aed138e15ed179a1d128612dd241cdf299d159e5e882"}, + {file = "statsmodels-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb471f757fc45102a87e5d86e87dc2c8c78b34ad4f203679a46520f1d863b9da"}, + {file = "statsmodels-0.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:582f9e41092e342aaa04920d17cc3f97240e3ee198672f194719b5a3d08657d6"}, + {file = "statsmodels-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ebe885ccaa64b4bc5ad49ac781c246e7a594b491f08ab4cfd5aa456c363a6f6"}, + {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b587ee5d23369a0e881da6e37f78371dce4238cf7638a455db4b633a1a1c62d6"}, + {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef7fa4813c7a73b0d8a0c830250f021c102c71c95e9fe0d6877bcfb56d38b8c"}, + {file = "statsmodels-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:a6ad7b8aadccd4e4dd7f315a07bef1bca41d194eeaf4ec600d20dea02d242fce"}, + {file = "statsmodels-0.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3757542c95247e4ab025291a740efa5da91dc11a05990c033d40fce31c450dc9"}, + {file = "statsmodels-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:de489e3ed315bdba55c9d1554a2e89faa65d212e365ab81bc323fa52681fc60e"}, + {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e290f4718177bffa8823a780f3b882d56dd64ad1c18cfb4bc8b5558f3f5757"}, + {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71054f9dbcead56def14e3c9db6f66f943110fdfb19713caf0eb0f08c1ec03fd"}, + {file = "statsmodels-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:d7fda067837df94e0a614d93d3a38fb6868958d37f7f50afe2a534524f2660cb"}, + {file = "statsmodels-0.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c7724ad573af26139a98393ae64bc318d1b19762b13442d96c7a3e793f495c3"}, + {file = "statsmodels-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b0a135f3bfdeec987e36e3b3b4c53e0bb87a8d91464d2fcc4d169d176f46fdb"}, + {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce28eb1c397dba437ec39b9ab18f2101806f388c7a0cf9cdfd8f09294ad1c799"}, + {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b1c768dd94cc5ba8398121a632b673c625491aa7ed627b82cb4c880a25563f"}, + {file = "statsmodels-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d1e3e10dfbfcd58119ba5a4d3c7d519182b970a2aebaf0b6f539f55ae16058d"}, + {file = "statsmodels-0.14.0.tar.gz", hash = "sha256:6875c7d689e966d948f15eb816ab5616f4928706b180cf470fd5907ab6f647a4"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.18", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, + {version = ">=1.22.3", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, +] +packaging = ">=21.3" +pandas = ">=1.0" +patsy = ">=0.5.2" +scipy = ">=1.4,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.26)"] +develop = ["colorama", "cython (>=0.29.26)", "cython (>=0.29.28,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + +[[package]] +name = "stevedore" +version = "5.1.0" +description = "Manage dynamic plugins for Python applications" +optional = false +python-versions = ">=3.8" +files = [ + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, +] + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "termcolor" +version = "2.3.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.6" +files = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "tokenize-rt" +version = "5.1.0" +description = "A wrapper around the stdlib `tokenize` which roundtrips." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tokenize_rt-5.1.0-py2.py3-none-any.whl", hash = "sha256:9b7bb843e77dd6ed0be5564bfaaba200083911e0497841cd3e9235a6a9794d74"}, + {file = "tokenize_rt-5.1.0.tar.gz", hash = "sha256:08f0c2daa94c4052e53c2fcaa8e32585e6ae9bdfc800974092d031401694e002"}, +] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "torch" +version = "2.0.1" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.0.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ced00b3ba471856b993822508f77c98f48a458623596a4c43136158781e306a"}, + {file = "torch-2.0.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:359bfaad94d1cda02ab775dc1cc386d585712329bb47b8741607ef6ef4950747"}, + {file = "torch-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:7c84e44d9002182edd859f3400deaa7410f5ec948a519cc7ef512c2f9b34d2c4"}, + {file = "torch-2.0.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:567f84d657edc5582d716900543e6e62353dbe275e61cdc36eda4929e46df9e7"}, + {file = "torch-2.0.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:787b5a78aa7917465e9b96399b883920c88a08f4eb63b5a5d2d1a16e27d2f89b"}, + {file = "torch-2.0.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e617b1d0abaf6ced02dbb9486803abfef0d581609b09641b34fa315c9c40766d"}, + {file = "torch-2.0.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6019b1de4978e96daa21d6a3ebb41e88a0b474898fe251fd96189587408873e"}, + {file = "torch-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:dbd68cbd1cd9da32fe5d294dd3411509b3d841baecb780b38b3b7b06c7754434"}, + {file = "torch-2.0.1-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:ef654427d91600129864644e35deea761fb1fe131710180b952a6f2e2207075e"}, + {file = "torch-2.0.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:25aa43ca80dcdf32f13da04c503ec7afdf8e77e3a0183dd85cd3e53b2842e527"}, + {file = "torch-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5ef3ea3d25441d3957348f7e99c7824d33798258a2bf5f0f0277cbcadad2e20d"}, + {file = "torch-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0882243755ff28895e8e6dc6bc26ebcf5aa0911ed81b2a12f241fc4b09075b13"}, + {file = "torch-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:f66aa6b9580a22b04d0af54fcd042f52406a8479e2b6a550e3d9f95963e168c8"}, + {file = "torch-2.0.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:1adb60d369f2650cac8e9a95b1d5758e25d526a34808f7448d0bd599e4ae9072"}, + {file = "torch-2.0.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:1bcffc16b89e296826b33b98db5166f990e3b72654a2b90673e817b16c50e32b"}, + {file = "torch-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:e10e1597f2175365285db1b24019eb6f04d53dcd626c735fc502f1e8b6be9875"}, + {file = "torch-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:423e0ae257b756bb45a4b49072046772d1ad0c592265c5080070e0767da4e490"}, + {file = "torch-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8742bdc62946c93f75ff92da00e3803216c6cce9b132fbca69664ca38cfb3e18"}, + {file = "torch-2.0.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:c62df99352bd6ee5a5a8d1832452110435d178b5164de450831a3a8cc14dc680"}, + {file = "torch-2.0.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:671a2565e3f63b8fe8e42ae3e36ad249fe5e567435ea27b94edaa672a7d0c416"}, +] + +[package.dependencies] +filelock = "*" +jinja2 = "*" +networkx = "*" +sympy = "*" +typing-extensions = "*" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] + +[[package]] +name = "tornado" +version = "6.3.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, + {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, + {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, + {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, + {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, + {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, + {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, +] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "typing-extensions" +version = "4.6.3" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.23.1" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, + {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.12,<4" +platformdirs = ">=3.5.1,<4" + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.7" +description = "Jupyter interactive widgets for Jupyter Notebook" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.7-py3-none-any.whl", hash = "sha256:be3228a73bbab189a16be2d4a3cd89ecbd4e31948bfdc64edac17dcdee3cd99c"}, + {file = "widgetsnbextension-4.0.7.tar.gz", hash = "sha256:ea67c17a7cd4ae358f8f46c3b304c40698bc0423732e3f273321ee141232c8be"}, +] + +[[package]] +name = "yaspin" +version = "2.3.0" +description = "Yet Another Terminal Spinner" +optional = false +python-versions = ">=3.7.2,<4.0.0" +files = [ + {file = "yaspin-2.3.0-py3-none-any.whl", hash = "sha256:17b5548479b3d5b30adec7a87ffcdcddb403d14a2bb86fbcee97f37951e13427"}, + {file = "yaspin-2.3.0.tar.gz", hash = "sha256:547afd1a9700ac3a29a9f5591c70343bef186ed5dfb5e545a9bb0c77e561a1c9"}, +] + +[package.dependencies] +termcolor = ">=2.2,<3.0" + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[extras] +graph-func = ["pywhy-graphs"] +viz = ["pygraphviz"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9,<3.12" +content-hash = "01f55f382d992d1d0552c5e7a836162afdaca6524c63f52da30744ad0df33cb0" From 2e94cd88a5349eaca11caf68707c5cb4c05a3f3c Mon Sep 17 00:00:00 2001 From: Adam Li Date: Wed, 28 Jun 2023 14:09:58 -0400 Subject: [PATCH 58/61] Try to fix Signed-off-by: Adam Li --- .circleci/config.yml | 4 ++++ tests/unit_tests/constraint/test_psifcialg.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 92849e6b0..6c3b2afdf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,6 +65,10 @@ jobs: name: Setup pandoc command: sudo apt update && sudo apt install -y pandoc optipng + - run: + name: Setup torch + command: sudo apt-get install nvidia-cuda-toolkit nvidia-cuda-toolkit-gcc + - run: name: Install Poetry command: | diff --git a/tests/unit_tests/constraint/test_psifcialg.py b/tests/unit_tests/constraint/test_psifcialg.py index 8884ec754..4966843a1 100644 --- a/tests/unit_tests/constraint/test_psifcialg.py +++ b/tests/unit_tests/constraint/test_psifcialg.py @@ -1,6 +1,5 @@ from itertools import permutations -import bnlearn import networkx as nx import numpy as np import pandas as pd @@ -258,6 +257,7 @@ def test_figure2_skeleton(self): @pytest.mark.skip() def test_psifci_withsachs(): + import bnlearn bnlearn.import_DAG() From 5afbd4bc5b57037e3a9881bc39df34e9144ec077 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Mon, 17 Jul 2023 14:20:06 -0400 Subject: [PATCH 59/61] Merging? Signed-off-by: Adam Li --- dodiscover/__init__.py | 1 - dodiscover/ci/categorical_test.py | 20 +- dodiscover/constraint/_classes.py | 3 + dodiscover/constraint/fcialg.py | 40 + dodiscover/constraint/intervention.py | 9 + dodiscover/constraint/pcalg.py | 17 + dodiscover/constraint/sfcialg.py | 22 +- dodiscover/constraint/skeleton.py | 90 +- dodiscover/context.py | 6 +- dodiscover/datasets/__init__.py | 1 - dodiscover/datasets/base.py | 92 - dodiscover/datasets/linear.py | 45 - dodiscover/datasets/multidomain.py | 54 - examples/{ => constraint}/plot_pc_alg.py | 0 examples/{ => constraint}/plot_psifci_alg.py | 1 + examples/{ => constraint}/plot_sfci_alg.py | 0 .../constraint/plot_simulation_sfci.ipynb | 2829 +++++++++++++++++ examples/{ => topological}/plot_score_alg.py | 0 .../{ => topological}/prior_know_score.py | 0 pyproject.toml | 4 +- 20 files changed, 2979 insertions(+), 255 deletions(-) delete mode 100644 dodiscover/datasets/__init__.py delete mode 100644 dodiscover/datasets/base.py delete mode 100644 dodiscover/datasets/linear.py delete mode 100644 dodiscover/datasets/multidomain.py rename examples/{ => constraint}/plot_pc_alg.py (100%) rename examples/{ => constraint}/plot_psifci_alg.py (99%) rename examples/{ => constraint}/plot_sfci_alg.py (100%) create mode 100644 examples/constraint/plot_simulation_sfci.ipynb rename examples/{ => topological}/plot_score_alg.py (100%) rename examples/{ => topological}/prior_know_score.py (100%) diff --git a/dodiscover/__init__.py b/dodiscover/__init__.py index da5a7b65c..c8e7d51e3 100644 --- a/dodiscover/__init__.py +++ b/dodiscover/__init__.py @@ -1,6 +1,5 @@ from . import cd # noqa: F401 from . import ci # noqa: F401 -from . import datasets # noqa: F401 from . import metrics # noqa: F401 from . import toporder from ._protocol import EquivalenceClass, Graph diff --git a/dodiscover/ci/categorical_test.py b/dodiscover/ci/categorical_test.py index 733f62c38..cf574085d 100644 --- a/dodiscover/ci/categorical_test.py +++ b/dodiscover/ci/categorical_test.py @@ -15,14 +15,15 @@ from dodiscover.typing import Column +# This is a modified function taken from pgmpy: License MIT def power_divergence( - X: ArrayLike, Y: ArrayLike, Z: ArrayLike, data: pd.DataFrame, lambda_: str = "cressie-read" + X, Y, Z, data: pd.DataFrame, lambda_: str = "cressie-read" ) -> Tuple[float, float, int]: - """ - Computes the Cressie-Read power divergence statistic [1]. The null hypothesis - for the test is X is independent of Y given Z. A lot of the frequency comparison - based statistics (eg. chi-square, G-test etc) belong to power divergence family, - and are special cases of this test. + """Computes the Cressie-Read power divergence statistic [1]. + + The null hypothesis for the test is X is independent of Y given Z. A lot of the + frequency comparison based statistics (eg. chi-square, G-test etc) belong to + power divergence family, and are special cases of this test. Parameters ---------- @@ -100,7 +101,7 @@ def power_divergence( else: chi = 0 dof = 0 - for z_state, df in data.groupby(Z): + for idx, (z_state, df) in enumerate(data.groupby(Z[0] if len(Z) == 1 else Z)): try: # Note: The fill value is set to 1e-7 to avoid the following error: # where there are not enough samples in the data, which results in a nan pvalue @@ -112,7 +113,7 @@ def power_divergence( # If one of the values is 0 in the 2x2 table. if isinstance(z_state, str): logging.info( - f"Skipping the test {X} \u27C2 {Y} | {Z[0]}={z_state}. Not enough samples" + f"Skipping the test {X} \u27C2 {Y} | {Z[idx]}={z_state}. Not enough samples" ) else: z_str = ", ".join([f"{var}={state}" for var, state in zip(Z, z_state)]) @@ -170,6 +171,9 @@ def test( ) -> Tuple[float, float]: x_vars = reduce(lambda x: x, x_vars) # type: ignore y_vars = reduce(lambda x: x, y_vars) # type: ignore + + if z_covariates is not None and len(z_covariates) > 0: + z_covariates = list(z_covariates) stat, pvalue, dof = power_divergence( x_vars, y_vars, z_covariates, data=df, lambda_=self.lambda_ ) diff --git a/dodiscover/constraint/_classes.py b/dodiscover/constraint/_classes.py index 091a17c8d..dcdcb97d0 100644 --- a/dodiscover/constraint/_classes.py +++ b/dodiscover/constraint/_classes.py @@ -100,6 +100,7 @@ def __init__( apply_orientations: bool = True, keep_sorted: bool = False, n_jobs: Optional[int] = None, + debug: bool = False, ): self.alpha = alpha self.ci_estimator = ci_estimator @@ -126,6 +127,8 @@ def __init__( # debugging mode self.n_ci_tests = 0 + self.debug = debug + self.debug_map = dict() def _initialize_sep_sets(self, init_graph: nx.Graph) -> SeparatingSet: # keep track of separating sets diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index d6083b0a6..1de654007 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -105,6 +105,7 @@ def __init__( selection_bias: bool = True, pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, n_jobs: Optional[int] = None, + debug: bool = False, ): super().__init__( ci_estimator, @@ -116,6 +117,7 @@ def __init__( keep_sorted=keep_sorted, apply_orientations=apply_orientations, n_jobs=n_jobs, + debug=debug, ) self.max_iter = max_iter self.max_path_length = max_path_length @@ -144,6 +146,7 @@ def orient_unshielded_triples(self, graph: EquivalenceClass, sep_set: Separating ): self._orient_collider(graph, v_i, u, v_j) + def _orient_collider( self, graph: EquivalenceClass, v_i: Column, u: Column, v_j: Column ) -> None: @@ -152,8 +155,12 @@ def _orient_collider( ) if graph.has_edge(v_i, u, graph.circle_edge_name): graph.orient_uncertain_edge(v_i, u) + if self.debug: + self.debug_map[(v_i, u)] = "collider" if graph.has_edge(v_j, u, graph.circle_edge_name): graph.orient_uncertain_edge(v_j, u) + if self.debug: + self.debug_map[(v_j, u)] = "collider" def _apply_rule1(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: """Apply rule 1 of the FCI algorithm. @@ -197,6 +204,10 @@ def _apply_rule1(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) graph.remove_edge(c, u, graph.circle_edge_name) added_arrows = True + if added_arrows and self.debug: + self.debug_map[(u, c)] = f"rule 1: {a} *-> {u} o-* {c}" + self.debug_map[(c, u)] = f"rule 1: {a} *-> {u} o-* {c}" + return added_arrows def _apply_rule2(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: @@ -257,6 +268,10 @@ def _apply_rule2(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) # orient a *-> c graph.orient_uncertain_edge(a, c) added_arrows = True + + if added_arrows and self.debug: + self.debug_map[(a, c)] = "rule2" + return added_arrows def _apply_rule3(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: @@ -316,6 +331,9 @@ def _apply_rule3(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) logger.info(f"Rule 3: Orienting {v} -> {u}.") graph.orient_uncertain_edge(v, u) added_arrows = True + + if added_arrows and self.debug: + self.debug_map[(v, u)] = "rule3" return added_arrows def _apply_rule4( @@ -404,6 +422,12 @@ def _apply_rule4( logger.info(disc_path_str) added_arrows = True + if added_arrows and self.debug: + if last_node not in sep_set: + self.debug_map[(u, c)] = "rule4" + self.debug_map[(c, u)] = "rule4" + else: + self.debug_map[(u, c)] = "rule4" return added_arrows, explored_nodes def _apply_rule5(self, graph: EquivalenceClass, u: Column, a: Column) -> bool: @@ -451,6 +475,9 @@ def _apply_rule5(self, graph: EquivalenceClass, u: Column, a: Column) -> bool: graph.remove_edge(y, x, graph.circle_edge_name) graph.add_edge(x, y, graph.undirected_edge_name) + if added_tails and self.debug: + self.debug_map[(a, u)] = "rule5" + self.debug_map[(u, a)] = "rule5" return added_tails def _apply_rule6(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: @@ -489,6 +516,8 @@ def _apply_rule6(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) ): graph.add_edge(c, u, graph.undirected_edge_name) + if added_tails and self.debug: + self.debug_map[(u, c)] = "rule6" return added_tails def _apply_rule7(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: @@ -528,6 +557,8 @@ def _apply_rule7(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) ): graph.add_edge(c, u, graph.undirected_edge_name) + if added_tails and self.debug: + self.debug_map[(u, c)] = "rule7" return added_tails def _apply_rule8(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) -> bool: @@ -589,6 +620,10 @@ def _apply_rule8(self, graph: EquivalenceClass, u: Column, a: Column, c: Column) if graph.has_edge(c, a, graph.circle_edge_name): graph.remove_edge(c, a, graph.circle_edge_name) added_arrows = True + + if added_arrows and self.debug: + self.debug_map[(u, c)] = "rule8" + return added_arrows def _apply_rule9( @@ -640,6 +675,8 @@ def _apply_rule9( graph.remove_edge(c, a, graph.circle_edge_name) added_arrows = True + if added_arrows and self.debug: + self.debug_map[(u, c)] = "rule9" return added_arrows, uncov_path def _apply_rule10( @@ -753,6 +790,9 @@ def _apply_rule10( graph.remove_edge(c, a, graph.circle_edge_name) added_arrows = True + if added_arrows and self.debug: + self.debug_map[(u, c)] = "rule10" + return added_arrows, a_to_u_path, a_to_v_path def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingSet): diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index 59abb766f..7c8aec163 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -108,6 +108,7 @@ def __init__( pds_condsel_method: ConditioningSetSelection = ConditioningSetSelection.PDS, known_intervention_targets: bool = False, n_jobs: Optional[int] = None, + debug: bool = False, ): super().__init__( ci_estimator, @@ -123,6 +124,7 @@ def __init__( selection_bias=False, pds_condsel_method=pds_condsel_method, n_jobs=n_jobs, + debug=debug ) self.cd_estimator = cd_estimator self.known_intervention_targets = known_intervention_targets @@ -229,6 +231,10 @@ def _apply_rule11(self, graph: EquivalenceClass, context: Context) -> Tuple[bool graph.remove_edge(nbr, node) graph.add_edge(node, nbr, graph.directed_edge_name) oriented_edges.append((node, nbr)) + + if added_arrows and self.debug: + self.debug_map[(node, nbr)] = "Rule 11" + return added_arrows, oriented_edges def _apply_rule12( @@ -288,6 +294,9 @@ def _apply_rule12( graph.add_edge(a, c, graph.directed_edge_name) added_arrows = True + + if added_arrows and self.debug: + self.debug_map[(a, c)] = "Rule 12" return added_arrows def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingSet): diff --git a/dodiscover/constraint/pcalg.py b/dodiscover/constraint/pcalg.py index 74e51cb53..0e5d3d0da 100644 --- a/dodiscover/constraint/pcalg.py +++ b/dodiscover/constraint/pcalg.py @@ -100,6 +100,7 @@ def __init__( keep_sorted: bool = False, max_iter: int = 1000, n_jobs: Optional[int] = None, + debug: bool = False, ): super().__init__( ci_estimator, @@ -111,6 +112,7 @@ def __init__( apply_orientations=apply_orientations, keep_sorted=keep_sorted, n_jobs=n_jobs, + debug = debug, ) self.max_iter = max_iter @@ -263,10 +265,16 @@ def _orient_collider( f"orienting collider: {v_i} -> {u} and {v_j} -> {u} to make {v_i} -> {u} <- {v_j}." ) + # XXX: this should be a base method that is common to all constraint-based causal discovery + # We can integrate this with FCI probably if graph.has_edge(v_i, u, graph.undirected_edge_name): graph.orient_uncertain_edge(v_i, u) + if self.debug: + self.debug_map[(v_i, u)] = "collider" if graph.has_edge(v_j, u, graph.undirected_edge_name): graph.orient_uncertain_edge(v_j, u) + if self.debug: + self.debug_map[(v_j, u)] = "collider" def _apply_meek_rule1(self, graph: EquivalenceClass, i: Column, j: Column) -> bool: """Apply rule 1 of Meek's rules. @@ -294,6 +302,9 @@ def _apply_meek_rule1(self, graph: EquivalenceClass, i: Column, j: Column) -> bo added_arrows = True break + + if added_arrows and self.debug: + self.debug_map[(i, j)] = "rule1" return added_arrows def _apply_meek_rule2(self, graph: EquivalenceClass, i: Column, j: Column) -> bool: @@ -333,6 +344,9 @@ def _apply_meek_rule2(self, graph: EquivalenceClass, i: Column, j: Column) -> bo logger.info(f"R2: Removing edge {i}-{j} to form {i}->{j}.") graph.orient_uncertain_edge(i, j) added_arrows = True + + if added_arrows and self.debug: + self.debug_map[(i, j)] = "rule2" return added_arrows def _apply_meek_rule3(self, graph: EquivalenceClass, i: Column, j: Column) -> bool: @@ -375,4 +389,7 @@ def _apply_meek_rule3(self, graph: EquivalenceClass, i: Column, j: Column) -> bo graph.orient_uncertain_edge(i, j) added_arrows = True break + + if added_arrows and self.debug: + self.debug_map[(i, j)] = "rule3" return added_arrows diff --git a/dodiscover/constraint/sfcialg.py b/dodiscover/constraint/sfcialg.py index 23f16a3f5..54a347667 100644 --- a/dodiscover/constraint/sfcialg.py +++ b/dodiscover/constraint/sfcialg.py @@ -46,8 +46,8 @@ def __init__( max_path_length, pds_condsel_method, n_jobs=n_jobs, + debug=debug ) - self.debug = debug def learn_skeleton( self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None @@ -114,23 +114,6 @@ def fit(self, data: List[pd.DataFrame], context: Context, domain_indices, interv return super().fit(data, context) - def _apply_rule11(self, graph: EquivalenceClass, context: Context) -> Tuple[bool, List]: - augmented_nodes = context.f_nodes + context.s_nodes - - oriented_edges = [] - added_arrows = True - for node in augmented_nodes: - for nbr in graph.neighbors(node): - if nbr in augmented_nodes: - continue - - # remove all edges between node and nbr and orient this out - graph.remove_edge(node, nbr) - graph.remove_edge(nbr, node) - graph.add_edge(node, nbr, graph.directed_edge_name) - oriented_edges.append((node, nbr)) - return added_arrows, oriented_edges - def _apply_rule12( self, graph: EquivalenceClass, @@ -210,6 +193,9 @@ def _apply_rule12( graph.add_edge(a, c, graph.directed_edge_name) added_arrows = True + + if added_arrows and self.debug: + self.debug_map[(a, c)] = 'rule 12' return added_arrows def convert_skeleton_graph(self, graph: nx.Graph) -> EquivalenceClass: diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 09185ec07..4994306af 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1347,6 +1347,14 @@ def fit(self, data: List[pd.DataFrame], context: Context, check_input: bool = Tr for idx in range(len(sep_sets)): self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) + # remove all edges between F-nodes + for x_var in context.get_augmented_nodes(): + for y_var in context.get_augmented_nodes(): + if x_var == y_var: + continue + if context.init_graph.has_edge(x_var, y_var): + context.init_graph.remove_edge(x_var, y_var) + # now, we'll fit the data using interventional data by looping over all # combinations of F-nodes and their neighbors # apply algorithm to learn skeleton @@ -1527,6 +1535,7 @@ def _create_augmented_nodes( # map augmented nodes to domains node_domain_map = dict() + reverse_domain_node_map = dict() symmetric_diff_map = dict() sigma_map = dict() s_nodes = [] @@ -1547,7 +1556,8 @@ def _create_augmented_nodes( # create S-nodes as N-domains choose 2 for idx, (source, target) in enumerate(combinations(unique_domains, 2)): s_node = ("S", idx) - node_domain_map[s_node] = [source, target] + node_domain_map[s_node] = frozenset([source, target]) + reverse_domain_node_map[frozenset([source, target])] = s_node s_nodes.append(s_node) # create F-nodes, which is now all combinations of distributions choose 2 @@ -1555,43 +1565,41 @@ def _create_augmented_nodes( seen_domain_pairs = dict() seen_distr_pairs = dict() - for idx, source in enumerate(domain_ids): - for jdx, target in enumerate(domain_ids): + # compare every pair of distributions to now add interventions if necessary + for dataset_idx, source in enumerate(domain_ids): + for dataset_jdx, target in enumerate(domain_ids): + # perform memoization to avoid duplicate augmented nodes domain_memo_key = frozenset([source, target]) - distr_memo_key = frozenset([idx, jdx]) - - if jdx <= idx: + distr_memo_key = frozenset([dataset_idx, dataset_jdx]) + if dataset_jdx <= dataset_idx: continue if domain_memo_key in seen_domain_pairs and distr_memo_key in seen_distr_pairs: continue - - seen_domain_pairs[distr_memo_key] = None - seen_distr_pairs[domain_memo_key] = None - - # check if we are dealing with two observational distributions, since those - # are assigned to S-nodes - if intervention_targets[idx] == set() and intervention_targets[jdx] == set(): + seen_domain_pairs[domain_memo_key] = None + seen_distr_pairs[distr_memo_key] = None + + # check if we are dealing with two observational distributions + # if so, compute the sigma mapping to map the S-node to the two distribution indices + if (intervention_targets[dataset_idx] == set()) and (intervention_targets[dataset_jdx] == set()): + s_node = reverse_domain_node_map[frozenset([source, target])] + sigma_map[s_node] = [dataset_idx, dataset_jdx] continue # map each augmented-node to a tuple of distribution indices, or to a set of nodes # representing the intervention targets - if intervention_targets[idx] is None or intervention_targets[jdx] is None: - targets = frozenset([idx, jdx]) + if intervention_targets[dataset_idx] is None or intervention_targets[dataset_jdx] is None: + targets = frozenset([dataset_idx, dataset_jdx]) else: - symm_diff = set(intervention_targets[idx]).symmetric_difference( - set(intervention_targets[jdx]) + symm_diff = set(intervention_targets[dataset_idx]).symmetric_difference( + set(intervention_targets[dataset_jdx]) ) targets = frozenset(symm_diff) - # get the S-node mapped to the obs data if there is observational data - if domain_obs[source] and domain_obs[target] and targets == frozenset(): - s_node = [ - key for key, val in node_domain_map.items() if set(val) == {source, target} - ][0] - sigma_map[s_node] = [idx, jdx] - continue - elif targets == frozenset(): - # there is not interventions to compare + if targets == frozenset() and source == target: + # the two interventional distributions are exactly the same + logger.warn( + f'Interventional distributions {dataset_idx} and {dataset_jdx} have the same interventions ' + f'within the same domain {source}.') continue # create the F-node @@ -1600,13 +1608,13 @@ def _create_augmented_nodes( # map each F-node to a set of domain(s) node_domain_map[f_node] = [source, target] - sigma_map[f_node] = [idx, jdx] + sigma_map[f_node] = [dataset_idx, dataset_jdx] symmetric_diff_map[f_node] = targets k += 1 augmented_nodes = set(s_nodes).union(set(f_nodes)) return augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map - + def fit( self, data: List[pd.DataFrame], @@ -1678,11 +1686,12 @@ def fit( f_nodes.append(node) # provide multi-domain context - n_domains = len(np.unique(domain_indices)) context.augmented_nodes = augmented_nodes + context.node_domain_map = node_domain_map + context.add_state_variable('node_domain_map', node_domain_map) + context.add_state_variable('augmented_nodes', augmented_nodes) context.symmetric_diff_map = symmetric_diff_map context.sigma_map = sigma_map - context.node_domain_map = node_domain_map context.s_nodes = s_nodes context.f_nodes = f_nodes @@ -1718,7 +1727,7 @@ def fit( # loop through each domain pair to learn the F-node skeleton seen_domain_pairs = set() - for idx, source in enumerate(range(1, n_domains + 1)): + for idx, source in enumerate(domain_indices): # analyze F-nodes only within the 'source' domain source_fnodes = [ node for node in augmented_nodes if set(node_domain_map[node]) == {source} @@ -1738,9 +1747,10 @@ def fit( cross_distribution_test=True, ) - for jdx, target in enumerate(range(1, n_domains + 1)): - # skip if source and target are the same domain - if idx == jdx: + for jdx, target in enumerate(domain_indices): + # skip if source and target are the same domain because we have + # already learned from these pairs of datasets + if source == target: continue # skip if we have already seen this domain pair if frozenset([source, target]) in seen_domain_pairs: @@ -1755,6 +1765,13 @@ def fit( s_node = node break if s_node is None: + print(s_nodes) + # print(context.state_variables) + print(node_domain_map) + print(source, target) + # print(context) + print('OKAY... \n\n') + print(source, target) raise RuntimeError("wtf") # this is only possible if there is explicitly observational data between @@ -1771,6 +1788,11 @@ def fit( print(this_s_nodes) print(symmetric_diff_map) print(sigma_map) + print('here... \n\n') + print(augmented_nodes) + print(source, target) + print(sigma_map) + print(symmetric_diff_map) if this_s_nodes: if debug: print( diff --git a/dodiscover/context.py b/dodiscover/context.py index 4a5187740..f491b41c4 100644 --- a/dodiscover/context.py +++ b/dodiscover/context.py @@ -45,7 +45,11 @@ class Context(BasePyWhy): intervention_targets : list of tuple List of intervention targets (known, or unknown), which correspond to the nodes in the graph (known), or indices of datasets that contain - interventions (unknown). + interventions (unknown). If the value of an element is `None`, then + it means the distribution corresponding to the element's index has + an unknown intervention target. If the value is an empty set, then it + implies this is an observational distribution. If the value is a non-empty + set, then it informs us of the intervention targets. Raises ------ diff --git a/dodiscover/datasets/__init__.py b/dodiscover/datasets/__init__.py deleted file mode 100644 index d2077077c..000000000 --- a/dodiscover/datasets/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .base import sample_from_graph diff --git a/dodiscover/datasets/base.py b/dodiscover/datasets/base.py deleted file mode 100644 index bb1062294..000000000 --- a/dodiscover/datasets/base.py +++ /dev/null @@ -1,92 +0,0 @@ -from typing import Optional - -import networkx as nx -import numpy as np -import pandas as pd -import pywhy_graphs as pgraphs -from joblib import Parallel, delayed - -from . import linear, multidomain - - -def sample_from_graph( - G: nx.DiGraph, - n_samples: int = 1000, - n_jobs: Optional[int] = None, - random_state=None, - sample_func="linear", - **sample_kwargs, -): - """Sample a dataset from a linear Gaussian graph. - - Assumes the graph only consists of directed edges. It is on the roadmap to - implement support for bidirected edges. - - Parameters - ---------- - G : Graph - A linear DAG from which to sample. Must have been set up with - :func:`pywhy_graphs.functional.make_graph_linear_gaussian`. - n_samples : int, optional - Number of samples to generate, by default 1000. - n_jobs : Optional[int], optional - Number of jobs to run in parallel, by default None. - random_state : int, optional - Random seed, by default None. - sample_func : str, optional - The sampling function to use. Can be one of 'linear' or 'multidomain'. - Defaults to 'linear'. - **sample_kwargs - Keyword arguments to pass to the sampling function. - - Returns - ------- - data : pd.DataFrame of shape (n_samples, n_nodes) - A pandas DataFrame with the iid samples. - """ - if hasattr(G, "get_graphs"): - directed_G = G.get_graphs("directed") - else: - directed_G = G - - if isinstance(G, nx.DiGraph): - G = pgraphs.AugmentedGraph(incoming_directed_edges=G) - - if not nx.is_directed_acyclic_graph(directed_G): - raise ValueError("The input graph must be a DAG.") - if not G.graph.get("linear_gaussian", True): - raise ValueError("The input graph must be a linear Gaussian graph.") - - rng = np.random.default_rng(random_state) - - # Create list of topologically sorted nodes - top_sort_idx = list(nx.topological_sort(directed_G)) - - if hasattr(G, "augmented_nodes"): - top_sort_idx = [node for node in top_sort_idx if node not in G.augmented_nodes] - ignored_nodes = G.augmented_nodes - else: - ignored_nodes = None - - if sample_func == "linear": - sample_func = linear._sample_from_graph - elif sample_func == "multidomain": - sample_func = multidomain._sample_from_graph - - # Sample from graph - if n_jobs == 1: - data = [] - for _ in range(n_samples): - node_samples = sample_func( - G, top_sort_idx, rng, ignored_nodes=ignored_nodes, **sample_kwargs - ) - data.append(node_samples) - data = pd.DataFrame.from_records(data) - else: - out = Parallel(n_jobs=n_jobs, verbose=0)( - delayed(sample_func)(G, top_sort_idx, rng, ignored_nodes=ignored_nodes, **sample_kwargs) - for _ in range(n_samples) - ) - data = pd.DataFrame.from_records(out) - - return data diff --git a/dodiscover/datasets/linear.py b/dodiscover/datasets/linear.py deleted file mode 100644 index a72499b79..000000000 --- a/dodiscover/datasets/linear.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import Dict - -import numpy as np - - -def _sample_from_graph( - G, - top_sort_idx, - rng: np.random.Generator, - ignored_nodes=None, -) -> Dict: - """Private function to sample a single iid sample from a graph for all nodes. - - Returns - ------- - nodes_sample : dict - The sample per node. - """ - nodes_sample = dict() - - for node_idx in top_sort_idx: - # get all parents - parents = G.parents(node_idx) - - # sample noise - mean = G.nodes[node_idx]["gaussian_noise_function"]["mean"] - std = G.nodes[node_idx]["gaussian_noise_function"]["std"] - node_noise = rng.normal(loc=mean, scale=std) - node_sample = 0 - - # sample weight and edge function for each parent - for parent in parents: - if parent in ignored_nodes or parent == node_idx: - continue - if len(G.nodes[node_idx]["parent_functions"]) == 0: - continue - - weight = G.nodes[node_idx]["parent_functions"][parent]["weight"] - func = G.nodes[node_idx]["parent_functions"][parent]["func"] - node_sample += weight * func(nodes_sample[parent]) - - # set the node attribute "functions" to hold the weight and function wrt each parent - node_sample += node_noise - nodes_sample[node_idx] = node_sample - return nodes_sample diff --git a/dodiscover/datasets/multidomain.py b/dodiscover/datasets/multidomain.py deleted file mode 100644 index dc8e9369a..000000000 --- a/dodiscover/datasets/multidomain.py +++ /dev/null @@ -1,54 +0,0 @@ -from typing import Dict - -import numpy as np - - -def _sample_from_graph( - G, - top_sort_idx, - rng: np.random.Generator, - domain_id: int, - ignored_nodes=None, -) -> Dict: - """Private function to sample a single iid sample from a graph for all nodes. - - Returns - ------- - nodes_sample : dict - The sample per node. - """ - nodes_sample = dict() - - for node_idx in top_sort_idx: - # get all parents - parents = G.parents(node_idx) - - # sample noise - if "domain_gaussian_noise_function" in G.nodes[node_idx]: - mean = G.nodes[node_idx]["domain_gaussian_noise_function"][domain_id]["mean"] - std = G.nodes[node_idx]["domain_gaussian_noise_function"][domain_id]["std"] - else: - mean = G.nodes[node_idx]["gaussian_noise_function"]["mean"] - std = G.nodes[node_idx]["gaussian_noise_function"]["std"] - node_noise = rng.normal(loc=mean, scale=std) - node_sample = 0 - - # sample weight and edge function for each parent - for parent in parents: - if parent in ignored_nodes or parent == node_idx: - continue - if len(G.nodes[node_idx]["parent_functions"]) == 0: - continue - - weight = G.nodes[node_idx]["parent_functions"][parent]["weight"] - func = G.nodes[node_idx]["parent_functions"][parent]["func"] - try: - node_sample += weight * func(nodes_sample[parent]) - except Exception as e: - print(node_idx, list(parents)) - raise e - - # set the node attribute "functions" to hold the weight and function wrt each parent - node_sample += node_noise - nodes_sample[node_idx] = node_sample - return nodes_sample diff --git a/examples/plot_pc_alg.py b/examples/constraint/plot_pc_alg.py similarity index 100% rename from examples/plot_pc_alg.py rename to examples/constraint/plot_pc_alg.py diff --git a/examples/plot_psifci_alg.py b/examples/constraint/plot_psifci_alg.py similarity index 99% rename from examples/plot_psifci_alg.py rename to examples/constraint/plot_psifci_alg.py index 875e96d6b..05158fd2e 100644 --- a/examples/plot_psifci_alg.py +++ b/examples/constraint/plot_psifci_alg.py @@ -146,6 +146,7 @@ # Looking at the supplemental figure 8b in :footcite:`Jaber2020causal`, we see that the # learned PAG matches quite well. +# %% # References # ---------- # .. footbibliography:: diff --git a/examples/plot_sfci_alg.py b/examples/constraint/plot_sfci_alg.py similarity index 100% rename from examples/plot_sfci_alg.py rename to examples/constraint/plot_sfci_alg.py diff --git a/examples/constraint/plot_simulation_sfci.ipynb b/examples/constraint/plot_simulation_sfci.ipynb new file mode 100644 index 000000000..5e0dbeee8 --- /dev/null +++ b/examples/constraint/plot_simulation_sfci.ipynb @@ -0,0 +1,2829 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "3c6609d2-4b85-456c-8430-db2061788cda", + "metadata": {}, + "source": [ + "S-FCI Algorithm for Structure Learning on Simulated Data\n", + "========================================================\n", + "\n", + "The SFCI algorithm is shown to be a generalization of the FCI, I-FCI and $\\Psi$-FCI algorithms, which is\n", + "capable of structure learning over observational and/or interventional data collected across multiple\n", + "environments.\n", + "\n", + "In this example, we will leverage [pywhy_graphs](simulation_example) to simulate a discrete causal Bayesian\n", + "network, which acts as our causal selection diagram. We will also simulate different interventions and environments\n", + "to demonstrate how additional data that arises from different domains are useful." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "d37c74db-b424-4297-9303-cd718cca0112", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "id": "290503ef-96a6-433a-b01c-e10ea04ba6f7", + "metadata": {}, + "outputs": [], + "source": [ + "from pprint import pprint\n", + "\n", + "import bnlearn\n", + "import networkx as nx\n", + "import numpy as np\n", + "import pandas as pd\n", + "import scipy.stats\n", + "from pywhy_graphs.functional import sample_from_graph\n", + "from pywhy_graphs.functional.discrete import (\n", + " apply_discrete_soft_intervention,\n", + " make_random_discrete_graph,\n", + ")\n", + "from pywhy_graphs.viz import draw\n", + "\n", + "from dodiscover import (\n", + " FCI,\n", + " PC,\n", + " SFCI,\n", + " Context,\n", + " InterventionalContextBuilder,\n", + " PsiFCI,\n", + " make_context,\n", + ")\n", + "from dodiscover.ci import CategoricalCITest, GSquareCITest, Oracle" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3ec27151-eee2-49a3-bf74-0cc671ecac7c", + "metadata": {}, + "outputs": [], + "source": [ + "from pgmpy.factors.discrete import JointProbabilityDistribution\n", + "from pgmpy.factors.discrete.CPD import TabularCPD\n", + "\n", + "\n", + "def print_full(cpd):\n", + " backup = TabularCPD._truncate_strtable\n", + " TabularCPD._truncate_strtable = lambda self, x: x\n", + " print(cpd)\n", + " TabularCPD._truncate_strtable = backup" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7ebd007f-de4a-41d0-951a-057c7d4aa627", + "metadata": {}, + "outputs": [], + "source": [ + "n_jobs = -1" + ] + }, + { + "cell_type": "markdown", + "id": "7c1369c7-fb43-4ca8-8189-4f82dfe2e2ea", + "metadata": {}, + "source": [ + "Draw a graph\n", + "------------\n" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "8de9d34b-cc5f-4acb-8c49-a7a05fbb7b43", + "metadata": {}, + "outputs": [], + "source": [ + "edge_list = [\n", + " (\"A\", \"B\"),\n", + " (\"B\", \"C\"),\n", + " (\"C\", \"D\"),\n", + " (\"B\", \"D\"),\n", + " (\"X\", \"A\"),\n", + " (\"X\", \"C\"),\n", + " (\"C\", \"W\"),\n", + "]\n", + "G = nx.DiGraph()\n", + "\n", + "G.add_edges_from(edge_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "id": "84b152fd-0a9b-410e-af5f-4bbe7b041744", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dot_graph = draw(G)\n", + "dot_graph.render(outfile=\"true_graph.png\", view=False, cleanup=True)\n", + "\n", + "dot_graph" + ] + }, + { + "cell_type": "markdown", + "id": "391415ef-d4ed-4f1b-a868-15b856561bf7", + "metadata": {}, + "source": [ + "Define the distributions for nodes and functions for edges\n", + "----------------------------------------------------------\n", + "\n", + "Now, we can parametrize the graph fully, so that sampling from it is possible." + ] + }, + { + "cell_type": "code", + "execution_count": 340, + "id": "f1306805-a77f-4515-be77-de6ae630f8e9", + "metadata": {}, + "outputs": [], + "source": [ + "cardinality_lims = {node: [2, 4] for node in G.nodes}\n", + "weight_lims = {node: [1, 100] for node in G.nodes}\n", + "noise_ratio_lims = {node: [0.1, 0.1] for node in G.nodes}\n", + "seed = 1234" + ] + }, + { + "cell_type": "code", + "execution_count": 341, + "id": "8e116785-4421-4657-89f2-15cd163bfa99", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DiGraph with 6 nodes and 7 edges\n" + ] + } + ], + "source": [ + "G = make_random_discrete_graph(\n", + " G,\n", + " cardinality_lims=cardinality_lims,\n", + " weight_lims=weight_lims,\n", + " noise_ratio_lims=noise_ratio_lims,\n", + " random_state=seed,\n", + " overwrite=True,\n", + ")\n", + "\n", + "obs_G = G.copy()\n", + "print(G)" + ] + }, + { + "cell_type": "code", + "execution_count": 342, + "id": "60e9cb9a-d941-4cc0-bca0-decd7830756a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3 3 3]\n" + ] + } + ], + "source": [ + "# we can extract the conditional probability table for each node, which is a function of its parents\n", + "node_dict = G.nodes[\"C\"]\n", + "\n", + "print_full(node_dict[\"cpd\"].cardinality)" + ] + }, + { + "cell_type": "code", + "execution_count": 343, + "id": "30f2e2a4-667b-45e5-b9f3-c87d0d209854", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9ef5303132fb47f9b77424de0b0946d3", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/6 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCDWX
0210021
1112122
2122201
3112212
4122112
\n", + "" + ], + "text/plain": [ + " A B C D W X\n", + "0 2 1 0 0 2 1\n", + "1 1 1 2 1 2 2\n", + "2 1 2 2 2 0 1\n", + "3 1 1 2 2 1 2\n", + "4 1 2 2 1 1 2" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(40000, 6)\n" + ] + } + ], + "source": [ + "display(df.head())\n", + "print(df.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "49daab35-2f8b-417f-9a2b-0710f42954f4", + "metadata": {}, + "source": [ + "Causal discovery: Observational data in a single domain\n", + "-------------------------------------------------------\n", + "\n", + "First, we demonstrate how SFCI is exactly the same as the FCI algorithm in the context of single-domain observational data." + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "9d50b505-2181-44d7-a62b-0d4890d169e6", + "metadata": {}, + "outputs": [], + "source": [ + "ci_estimator = CategoricalCITest(lambda_=\"cressie-read\")" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "be1b9ec1-59ce-4134-bfc8-c7429936698e", + "metadata": {}, + "outputs": [], + "source": [ + "context = make_context().variables(data=df).build()\n", + "\n", + "learner = SFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=ci_estimator,\n", + " n_jobs=n_jobs,\n", + " max_cond_set_size=2,\n", + " max_combinations=None,\n", + " # alpha=0.5,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "id": "e7d3fccc-6b82-4b0d-b772-d360b3d83b9a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using data from distribution 0 for learning the skeleton.\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "learner.fit([df], context, domain_indices=[1], intervention_targets=[None])" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "edefd463-f795-4ef4-a17a-dc762452b5aa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now let's run FCI\n", + "fci_learner = FCI(\n", + " ci_estimator=ci_estimator,\n", + " n_jobs=n_jobs,\n", + " max_cond_set_size=2,\n", + " max_combinations=None,\n", + " # alpha=0.5,\n", + ")\n", + "fci_learner.fit(df, context)" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "id": "70754e13-0ce0-48db-a7e6-f26d3704ab68", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SFCI graph\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "B->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "A->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graph = learner.graph_\n", + "draw(graph, name=\"SFCI graph\")" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "id": "4807951b-197d-4137-88bb-c5b49be48255", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "FCI graph\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "B->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "A->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "graph = fci_learner.graph_\n", + "draw(graph, name=\"FCI graph\")" + ] + }, + { + "cell_type": "markdown", + "id": "75c46ae3-e676-4e0f-b0e7-02320e46734d", + "metadata": {}, + "source": [ + "We see that both graphs are exactly the same, as we have shown theoretically, the SFCI algorithm is a generalization\n", + "of the FCI algorithm. Moreover, the S-PAG is a valid generalization of the PAG, and in this case, both graphs align perfectly." + ] + }, + { + "cell_type": "markdown", + "id": "38d8d65e-daed-44c5-8d76-946b6cff18e7", + "metadata": {}, + "source": [ + "Causal Discovery: Interventional data in a single domain\n", + "--------------------------------------------------------\n", + "\n", + "Now, when we add interventional distributions, we expect that there will be additional\n", + "edges that we can orient due to the extra information when comparing different distributions." + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "id": "262ca3c7-2971-45c9-98e7-18c7ca18a715", + "metadata": {}, + "outputs": [], + "source": [ + "rng = np.random.default_rng(seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "1b327575-69b0-42c8-a7d9-5dcd1bb77998", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3e3ebc16cf004cb0b9355d383636df98", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/6 [00:00\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = int_learner.graph_.subgraph(ctx.get_non_augmented_nodes())\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "draw(est_pag, direction=\"LR\")" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "0c9c5d55-534c-4aaf-b4ca-71132878bbbc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)\n", + "\n", + "('F', 2)\n", + "\n", + "\n", + "\n", + "('F', 2)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)\n", + "\n", + "('F', 3)\n", + "\n", + "\n", + "\n", + "('F', 3)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", + "\n", + "\n", + "\n", + "('F', 1)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)\n", + "\n", + "('F', 5)\n", + "\n", + "\n", + "\n", + "('F', 5)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)\n", + "\n", + "('F', 4)\n", + "\n", + "\n", + "\n", + "('F', 4)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = int_learner.graph_\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "draw(est_pag, direction=\"LR\")" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "id": "51fcfcf0-46ec-41ec-9eba-ae1a1b1ee231", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[None, ['X'], ['C'], ['D']]\n" + ] + } + ], + "source": [ + "intervention_targets = targets.copy()\n", + "intervention_targets.insert(0, None)\n", + "print(intervention_targets)" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "a8bfb31a-dbfa-4106-8d3f-fc09af3e9f07", + "metadata": {}, + "outputs": [], + "source": [ + "learner = SFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=ci_estimator,\n", + " max_cond_set_size=2,\n", + " n_jobs=-1,\n", + ")\n", + "\n", + "learner.fit(\n", + " data,\n", + " ctx,\n", + " domain_indices=[1, 1, 1, 1],\n", + " intervention_targets=intervention_targets,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "id": "fe520613-c5ce-4714-bce1-101077345ea9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = learner.graph_\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "draw(est_pag_no_fnodes, direction=\"LR\")" + ] + }, + { + "cell_type": "markdown", + "id": "0a3dc765-a4cd-46bf-aa7c-3847041419a7", + "metadata": {}, + "source": [ + "We see that additional edges can be oriented with the presence of interventional data. Moreover, the SFCI algorithm perfectly \n", + "replicates and builds on top of the interventional data." + ] + }, + { + "cell_type": "markdown", + "id": "1a15289e-32ee-45ab-a5ff-a6f3aeedf4b3", + "metadata": {}, + "source": [ + "Causal Discovery: Observational data across multiple domains\n", + "------------------------------------------------------------\n", + "\n", + "In the SFCI paper, it is shown that the $\\Psi$-FCI algorithm is equivalent to the SFCI algorithm when there is\n", + "observational data across multiple domains, where the F-nodes can be seen as equivalent to S-nodes.\n", + "\n", + "We can leverage the same distributions that were intervened on because the change in domain can be seen\n", + "as an unknown-target intervention that occurs over those variables. That is, nature changes the distribution (CPD)\n", + "of the intervened variables, but we do not know where nature intervened. Thus conceptually, we see observational\n", + "data across multiple domains is similar to the setting with unknown-target interventional data within\n", + "a single domain. \n", + "\n", + "We will see later that when we have interventional data across multiple domains, the story becomes more complex\n", + "(and as a result, more interesting)." + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "id": "f3478f02-7401-478c-b2bc-86058af4efc6", + "metadata": {}, + "outputs": [], + "source": [ + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = (\n", + " ctx_builder.variables(data=data[0])\n", + " .num_distributions(len(data))\n", + " .obs_distribution(True)\n", + " .build()\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "id": "deceeeac-3866-4ecd-9ca7-b1206a11b4cd", + "metadata": {}, + "outputs": [], + "source": [ + "int_learner = PsiFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=ci_estimator,\n", + " max_cond_set_size=2,\n", + " n_jobs=-1,\n", + " debug=True,\n", + ")\n", + "\n", + "int_learner = int_learner.fit(data, ctx)" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "id": "4116afe8-8dff-4487-930f-277bbd382301", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)\n", + "\n", + "('F', 2)\n", + "\n", + "\n", + "\n", + "('F', 2)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)\n", + "\n", + "('F', 3)\n", + "\n", + "\n", + "\n", + "('F', 3)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", + "\n", + "\n", + "\n", + "('F', 1)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)\n", + "\n", + "('F', 5)\n", + "\n", + "\n", + "\n", + "('F', 5)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)\n", + "\n", + "('F', 4)\n", + "\n", + "\n", + "\n", + "('F', 4)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 240, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = int_learner.graph_\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "draw(est_pag, direction=\"LR\")" + ] + }, + { + "cell_type": "code", + "execution_count": 242, + "id": "007ac3d5-c259-4442-9bdc-1bfe36901c7f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 242, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = int_learner.graph_.subgraph(ctx.get_non_augmented_nodes())\n", + "\n", + "# %%\n", + "# Visualize the full graph including the F-node\n", + "draw(est_pag, direction=\"LR\")" + ] + }, + { + "cell_type": "code", + "execution_count": 256, + "id": "f7c949df-f235-4bb7-a6fd-2738c7213d30", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[set(), set(), set(), set()]\n" + ] + } + ], + "source": [ + "intervention_targets = [set()] * len(data)\n", + "print(intervention_targets)" + ] + }, + { + "cell_type": "code", + "execution_count": 268, + "id": "2f52b02d-d0ce-408a-91ff-c976c46394c1", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using data from distribution 0 for learning the skeleton.\n", + "Trying to learn skeleton for 0 to remove F-nodes: []\n", + "[('S', 0)]\n", + "{}\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "here... \n", + "\n", + "\n", + "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", + "0 1\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "{}\n", + "Trying to learn skeleton for 0 and 1 to remove S-nodes: [('S', 0)]\n", + "Trying to learn skeleton for 0 and 1 to remove F-nodes: [] grouped with S-node: ('S', 0)\n", + "[('S', 1)]\n", + "{}\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "here... \n", + "\n", + "\n", + "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", + "0 2\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "{}\n", + "Trying to learn skeleton for 0 and 2 to remove S-nodes: [('S', 1)]\n", + "Trying to learn skeleton for 0 and 2 to remove F-nodes: [] grouped with S-node: ('S', 1)\n", + "[('S', 2)]\n", + "{}\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "here... \n", + "\n", + "\n", + "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", + "0 3\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "{}\n", + "Trying to learn skeleton for 0 and 3 to remove S-nodes: [('S', 2)]\n", + "Trying to learn skeleton for 0 and 3 to remove F-nodes: [] grouped with S-node: ('S', 2)\n", + "Trying to learn skeleton for 1 to remove F-nodes: []\n", + "[('S', 3)]\n", + "{}\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "here... \n", + "\n", + "\n", + "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", + "1 2\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "{}\n", + "Trying to learn skeleton for 1 and 2 to remove S-nodes: [('S', 3)]\n", + "Trying to learn skeleton for 1 and 2 to remove F-nodes: [] grouped with S-node: ('S', 3)\n", + "[('S', 4)]\n", + "{}\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "here... \n", + "\n", + "\n", + "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", + "1 3\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "{}\n", + "Trying to learn skeleton for 1 and 3 to remove S-nodes: [('S', 4)]\n", + "Trying to learn skeleton for 1 and 3 to remove F-nodes: [] grouped with S-node: ('S', 4)\n", + "Trying to learn skeleton for 2 to remove F-nodes: []\n", + "[('S', 5)]\n", + "{}\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "here... \n", + "\n", + "\n", + "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", + "2 3\n", + "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", + "{}\n", + "Trying to learn skeleton for 2 and 3 to remove S-nodes: [('S', 5)]\n", + "Trying to learn skeleton for 2 and 3 to remove F-nodes: [] grouped with S-node: ('S', 5)\n", + "Trying to learn skeleton for 3 to remove F-nodes: []\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 268, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "learner = SFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=ci_estimator,\n", + " max_cond_set_size=2,\n", + " n_jobs=-1,\n", + " debug=True,\n", + ")\n", + "\n", + "learner.fit(\n", + " data,\n", + " ctx,\n", + " domain_indices=[0, 1, 2, 3],\n", + " intervention_targets=intervention_targets,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 272, + "id": "02ebb37d-f01a-4173-bc33-5dc5ef7071d7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SFCI\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 272, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = learner.graph_\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "draw(est_pag_no_fnodes, direction=\"LR\", name=\"SFCI\")" + ] + }, + { + "cell_type": "code", + "execution_count": 273, + "id": "49034875-c60c-46ca-9b85-0e56b992f15d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "SFCI\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 3)\n", + "\n", + "('S', 3)\n", + "\n", + "\n", + "\n", + "('S', 3)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 3)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 1)\n", + "\n", + "('S', 1)\n", + "\n", + "\n", + "\n", + "('S', 1)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 5)\n", + "\n", + "('S', 5)\n", + "\n", + "\n", + "\n", + "('S', 5)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 5)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 2)\n", + "\n", + "('S', 2)\n", + "\n", + "\n", + "\n", + "('S', 2)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 4)\n", + "\n", + "('S', 4)\n", + "\n", + "\n", + "\n", + "('S', 4)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 4)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('S', 0)\n", + "\n", + "('S', 0)\n", + "\n", + "\n", + "\n", + "('S', 0)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 273, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = learner.graph_\n", + "est_pag_no_fnodes = est_pag\n", + "dot_graph = draw(\n", + " est_pag_no_fnodes,\n", + " direction=\"LR\",\n", + " # name=\"SFCI\"\n", + ")\n", + "\n", + "dot_graph.render(outfile=\"./sfci_multidomain_obs.png\", view=False, cleanup=True)\n", + "dot_graph" + ] + }, + { + "cell_type": "code", + "execution_count": 274, + "id": "96f28add-3517-4947-a0d2-aa5bcdd7a25d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{('S', 0): frozenset({0, 1}), ('S', 1): frozenset({0, 2}), ('S', 2): frozenset({0, 3}), ('S', 3): frozenset({1, 2}), ('S', 4): frozenset({1, 3}), ('S', 5): frozenset({2, 3})}\n" + ] + } + ], + "source": [ + "print(learner.context_.state_variable(\"node_domain_map\"))" + ] + }, + { + "cell_type": "markdown", + "id": "8cbea675-a3ad-4796-95ad-6c7a58ce648b", + "metadata": {}, + "source": [ + "Now, we see that SFCI is equivalent to $\\Psi$-FCI in the presence of observational data that spans different domains as shown in the theoretical results of the SFCI paper.\n", + "The benefit of explicitly noting the fact that the observational data come from different domains is that we now have knowledge of the S-nodes that underlie the causal\n", + "selection diagram. Of course, the S-node edges are simply estimates and moreover it is only part of the Markov equivalence class, since inducing paths may cause extra edges.\n", + "However, the information of the S-nodes now provide the user how they should expect distributions and causal knowledge to change when going between different domains.\n", + "\n", + "For example, if we take a look at S-node (S, 2), representing domains 0 and 3, then this induces a potential change in the function, or exogenous variable distribution for variable D. However, because\n", + "of the colliders, we see that we could translate causal knowledge between domains 0 and 3 as long as we do not open up a path from (S, 2) node to the rest of the variables." + ] + }, + { + "cell_type": "markdown", + "id": "c002dcec-9fae-414d-9c81-ac94c337a995", + "metadata": {}, + "source": [ + "Causal Discovery: Observational data and interventional data across multiple domains\n", + "------------------------------------------------------------------------------------\n", + "\n", + "As we saw in the previous sections, SFCI is capable of exactly producing the same results as the FCI, and I/$\\Psi$-FCI algorithms given datasets in a single domain. In addition, when analyzing purely observational data coming from multiple domains, we see an equivalence in the results between SFCI and $\\Psi$FCI.\n", + "\n", + "Next, we will show how having both observational and interventional data from different domains can allow us to learn more." + ] + }, + { + "cell_type": "markdown", + "id": "105e9828-be6d-4c37-8b85-fc8d62954631", + "metadata": {}, + "source": [ + "First we will simulate data that comes from multipl domains using a similar procedure." + ] + }, + { + "cell_type": "code", + "execution_count": 370, + "id": "8115bfcd-209e-4c71-b1bd-87639955d134", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[set(), ['X'], ['C'], ['D']]\n", + "[set(), 'W', 'X']\n" + ] + } + ], + "source": [ + "intervention_targets = targets.copy()\n", + "intervention_targets.insert(0, set())\n", + "print(intervention_targets)\n", + "\n", + "domain_one_targets = intervention_targets.copy()\n", + "domain_two_targets = [set(), \"W\", \"X\"]\n", + "\n", + "print(domain_two_targets)" + ] + }, + { + "cell_type": "code", + "execution_count": 371, + "id": "56b79f04-c6ac-4d42-a7a2-b165ff212abb", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ab6f5b712c54b3cbb2528544f3f984b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/6 [00:00" + ] + }, + "execution_count": 382, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "learner = SFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=ci_estimator,\n", + " max_cond_set_size=2,\n", + " n_jobs=-1,\n", + " debug=True,\n", + ")\n", + "\n", + "learner.fit(\n", + " data,\n", + " ctx,\n", + " domain_indices=domain_ids,\n", + " intervention_targets=intervention_targets,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 395, + "id": "09ba3ceb-5b6b-47c7-9eac-c4c73372a169", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['W', 'C', 'B', 'A', 'X', 'D']\n", + "['W', 'X', 'C', 'B', 'D', 'A', ('F', 2), ('F', 5), ('F', 11), ('F', 8), ('F', 14), ('F', 17), ('F', 0), ('F', 3), ('F', 9), ('F', 6), ('F', 12), ('F', 15), ('F', 18), ('F', 4), ('F', 1), ('F', 7), ('F', 10), ('F', 16), ('F', 13), ('F', 19), ('S', 0)]\n", + "{'C', 'B', 'D', 'W', 'X', 'A'}\n" + ] + } + ], + "source": [ + "print(context.init_graph.nodes)\n", + "print(est_pag.nodes)\n", + "print(ctx.get_non_augmented_nodes())" + ] + }, + { + "cell_type": "code", + "execution_count": 400, + "id": "968fb5ed-d8e9-4a6a-a471-baea43d635ed", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "C->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 400, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = learner.graph_\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "\n", + "dot_graph = draw(\n", + " est_pag_no_fnodes,\n", + " direction=\"LR\",\n", + " # name=\"SFCI\"\n", + ")\n", + "\n", + "dot_graph.render(outfile=\"./sfci_multidomain_obsandint.png\", view=False, cleanup=True)\n", + "dot_graph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0f2d0db-a6f7-4d47-b999-21dc1d876f24", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pywhy-discover", + "language": "python", + "name": "pywhy-discover" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/plot_score_alg.py b/examples/topological/plot_score_alg.py similarity index 100% rename from examples/plot_score_alg.py rename to examples/topological/plot_score_alg.py diff --git a/examples/prior_know_score.py b/examples/topological/prior_know_score.py similarity index 100% rename from examples/prior_know_score.py rename to examples/topological/prior_know_score.py diff --git a/pyproject.toml b/pyproject.toml index 5e0e110da..93e2dc1d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ networkx = "^3.1" importlib-resources = { version = "*", python = "<3.10" } pywhy-graphs = { git = "https://github.com/py-why/pywhy-graphs.git", branch = 'main', optional = true } pygraphviz = { version = "^1.11", optional = true } -pygam = "^0.9.0" +pygam = { version = "^0.9.0", optional = true } [tool.poetry.group.style] optional = true @@ -79,6 +79,7 @@ joblib = { version = "^1.1.0" } # needed in dowhy's package tqdm = { version = "^4.64.0" } # needed in dowhy's package pre-commit = "^3.0.4" pooch = "^1.7.0" +pygam = "^0.9.0" [tool.poetry.group.docs] optional = true @@ -110,6 +111,7 @@ kiwisolver = "^1.4.4" [tool.poetry.extras] graph_func = ['pywhy-graphs'] +topological = ['pygam'] viz = ['pygraphviz'] [tool.portray] From fd965f09eaf1132b6c0d27576b7275ceb8a6cb6c Mon Sep 17 00:00:00 2001 From: Adam Li Date: Fri, 29 Sep 2023 16:34:59 -0400 Subject: [PATCH 60/61] Multidomain wip Signed-off-by: Adam Li --- dodiscover/ci/oracle.py | 3 +- dodiscover/constraint/fcialg.py | 68 + dodiscover/constraint/intervention.py | 4 +- dodiscover/constraint/skeleton.py | 238 +- .../constraint/plot_simulation_sfci.ipynb | 3215 +++++++++-------- .../skeleton/test_multidomain_skeleton.py | 104 +- 6 files changed, 1855 insertions(+), 1777 deletions(-) diff --git a/dodiscover/ci/oracle.py b/dodiscover/ci/oracle.py index d3a7e139d..be9b77b55 100644 --- a/dodiscover/ci/oracle.py +++ b/dodiscover/ci/oracle.py @@ -23,8 +23,7 @@ class Oracle(BaseConditionalIndependenceTest): _allow_multivariate_input: bool = True - def __init__( - self, graph: Graph, included_nodes: Optional[Set[Column]] = None) -> None: + def __init__(self, graph: Graph, included_nodes: Optional[Set[Column]] = None) -> None: self.graph = graph self.included_nodes = included_nodes diff --git a/dodiscover/constraint/fcialg.py b/dodiscover/constraint/fcialg.py index 6fef8d60f..bd6369492 100644 --- a/dodiscover/constraint/fcialg.py +++ b/dodiscover/constraint/fcialg.py @@ -859,6 +859,74 @@ def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingS break idx += 1 + def _apply_orientation_rules(self, graph: EquivalenceClass, sep_set: SeparatingSet): + idx = 0 + finished = False + while idx < self.max_iter and not finished: + change_flag = False + logger.info(f"Running R1-10 for iteration {idx}") + + # if self.stable: + # pass + # else: + for u in graph.nodes: + for (a, c) in permutations(graph.neighbors(u), 2): + logger.debug(f"Check {u} {a} {c}") + + # apply R1-3 to orient triples and arrowheads + r1_add = self._apply_rule1(graph, u, a, c) + r2_add = self._apply_rule2(graph, u, a, c) + r3_add = self._apply_rule3(graph, u, a, c) + + # apply R4, orienting discriminating paths + r4_add, _ = self._apply_rule4(graph, u, a, c, sep_set) + + # apply R5-7 to handle cases where selection bias is present + if self.selection_bias: + r5_add = self._apply_rule5(graph, u, a) + r6_add = self._apply_rule6(graph, u, a, c) + r7_add = self._apply_rule7(graph, u, a, c) + else: + r5_add = False + r6_add = False + r7_add = False + + # apply R8 to orient more tails + r8_add = self._apply_rule8(graph, u, a, c) + + # apply R9-10 to orient uncovered potentially directed paths + r9_add, _ = self._apply_rule9(graph, a, u, c) + + # a and c are neighbors of u, so u is the endpoint desired + r10_add, _, _ = self._apply_rule10(graph, a, c, u) + + # see if there was a change flag + all_flags = [ + r1_add, + r2_add, + r3_add, + r4_add, + r5_add, + r6_add, + r7_add, + r8_add, + r9_add, + r10_add, + ] + if any(all_flags) and not change_flag: + logger.info(f"{change_flag} with " f"{all_flags}") + change_flag = True + + # check if we should continue or not + if not change_flag: + finished = True + if not self.selection_bias: + logger.info(f"Finished applying R1-4, and R8-10 with {idx} iterations") + if self.selection_bias: + logger.info(f"Finished applying R1-10 with {idx} iterations") + break + idx += 1 + def learn_skeleton( self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None ) -> Tuple[nx.Graph, SeparatingSet]: diff --git a/dodiscover/constraint/intervention.py b/dodiscover/constraint/intervention.py index c3dbeb71b..cd10501a0 100644 --- a/dodiscover/constraint/intervention.py +++ b/dodiscover/constraint/intervention.py @@ -223,7 +223,7 @@ def _apply_rule11(self, graph: EquivalenceClass, context: Context) -> Tuple[bool augmented_nodes = context.get_augmented_nodes() oriented_edges = [] - added_arrows = True + added_arrows = False for node in augmented_nodes: for nbr in graph.neighbors(node): if nbr in augmented_nodes: @@ -235,6 +235,8 @@ def _apply_rule11(self, graph: EquivalenceClass, context: Context) -> Tuple[bool graph.add_edge(node, nbr, graph.directed_edge_name) oriented_edges.append((node, nbr)) + added_arrows = True + if added_arrows and self.debug: self.debug_map[(node, nbr)] = "Rule 11" diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index c27eac721..79c564637 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -7,6 +7,7 @@ import networkx as nx import numpy as np import pandas as pd +import pywhy_graphs as pg from joblib import Parallel, delayed from dodiscover.ci import BaseConditionalIndependenceTest, Oracle @@ -67,7 +68,7 @@ def _test_xy_edges( Whether to perform cross-distribution tests. If True, then the ``context`` object must contain a ``sigma_map`` attribute that maps each X-node to the corresponding distribution indices of interest. - + Returns ------- test_stat : float @@ -122,10 +123,15 @@ def _test_xy_edges( test_stat = np.inf pvalue = 0.0 else: + import traceback + + print("\n\ninside error message...") print(x_var, y_var, cond_set) print(this_data.columns) print(this_data.head()) print(this_data[x_var]) + print(context.init_graph.nodes) + traceback.print_exc() raise Exception(e) # if any "independence" is found through inability to reject @@ -1121,8 +1127,6 @@ def _fit_single_distribution( # if there is no second stage skeleton method to be run, then we # will stop with the skeleton here - print(self.second_stage_condsel_method) - print(context) if self.second_stage_condsel_method is None: self.context_ = deepcopy(context.copy()) self.adj_graph_ = deepcopy(context.init_graph.copy()) @@ -1269,12 +1273,12 @@ def _prep_second_stage_skeleton(self, context: Context) -> Context: # R9 allows us to leverage F-nodes being not in separating sets to # augment all separating sets that have non-empty sets with all # F-nodes to keep consistency with the algorithm - for x_var, y_vars in self.sep_set_.items(): - for y_var in y_vars: - sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore - if len(sep_sets) > 0: - for idx in range(len(sep_sets)): - self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) + # for x_var, y_vars in self.sep_set_.items(): + # for y_var in y_vars: + # sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + # if len(sep_sets) > 0: + # for idx in range(len(sep_sets)): + # self.sep_set_[x_var][y_var][idx].update(context.get_augmented_nodes()) return super()._prep_second_stage_skeleton(context) @@ -1488,97 +1492,97 @@ def __init__( self.known_intervention_targets = known_intervention_targets - def _create_augmented_nodes( - self, domain_ids: List[int], intervention_targets: List[Optional[Set]] - ) -> Tuple[List, Dict, Dict, Dict]: - """Create augmented nodes, sigma map and optionally a symmetric difference map. - - Given a number of distributions attributed to interventions, one constructs - F-nodes to add to the causal graph by: - - - For all pairs of incoming distributions, form a new F-node for every - pair of distributions. Update ``node_domain_map`` to map the F-node to - a specific domain. - - If the pairs are from two known target-interventions (i.e. not `None` - value), then also add the symmetric difference mapping to - ``symmetric_diff_map``, which maps the F-node to the intervention target. - - where ``targets`` is a set of either nodes, or set of indices corresponding - to the input data distributions and ``domains`` is a set of domains, either - a single domain for F-nodes within domain, or a set of two domains for - F-nodes across domains. - - Parameters - ---------- - domain_ids : List[int] - A list of domain ids for each input distribution. - intervention_targets : List[Set] - A list of known intervention targets for each input distribution with ``None`` - representing unknown targets. If the distribution is observational, then - the empty set is used. - - Returns - ------- - augmented_nodes : List - Set of augmented nodes (i.e. F and S nodes). - symmetric_diff_map : Dict[Any, FrozenSet] - Mapping of augmented nodes to intervention targets, or distribution indices represented - by the node. - sigma_map : Dict[Any, FrozenSet] - Mapping of augmented nodes to distribution indices represented by the node. - node_domain_map : Dict[Any, FrozenSet] - Mapping of augmented nodes to domains. - """ - # map augmented nodes to domains - node_domain_map = dict() - symmetric_diff_map = dict() - sigma_map = dict() - f_nodes = [] - - # create F-nodes, which is now all combinations of distributions choose 2 - k = 0 - seen_domain_pairs = dict() - seen_distr_pairs = dict() - - # compare every pair of distributions to now add interventions if necessary - for dataset_idx, source in enumerate(domain_ids): - for dataset_jdx, target in enumerate(domain_ids): - # perform memoization to avoid duplicate augmented nodes - domain_memo_key = frozenset([source, target]) - distr_memo_key = frozenset([dataset_idx, dataset_jdx]) - if dataset_jdx <= dataset_idx: - continue - if domain_memo_key in seen_domain_pairs and distr_memo_key in seen_distr_pairs: - continue - seen_domain_pairs[domain_memo_key] = None - seen_distr_pairs[distr_memo_key] = None - - # map each augmented-node to a tuple of distribution indices, or to a set of nodes - # representing the intervention targets - if ( - intervention_targets[dataset_idx] is not None - and intervention_targets[dataset_jdx] is not None - and source == target - ): - symm_diff = set(intervention_targets[dataset_idx]).symmetric_difference( - set(intervention_targets[dataset_jdx]) - ) - targets = frozenset(symm_diff) - else: - targets = None - - # create the F-node - f_node = ("F", k) - f_nodes.append(f_node) - - # map each F-node to a set of domain(s) - node_domain_map[f_node] = [source, target] - sigma_map[f_node] = [dataset_idx, dataset_jdx] - symmetric_diff_map[f_node] = targets - - k += 1 - augmented_nodes = set(f_nodes) - return augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map + # def _create_augmented_nodes( + # self, domain_ids: List[int], intervention_targets: List[Optional[Set]] + # ) -> Tuple[List, Dict, Dict, Dict]: + # """Create augmented nodes, sigma map and optionally a symmetric difference map. + + # Given a number of distributions attributed to interventions, one constructs + # F-nodes to add to the causal graph by: + + # - For all pairs of incoming distributions, form a new F-node for every + # pair of distributions. Update ``node_domain_map`` to map the F-node to + # a specific domain. + # - If the pairs are from two known target-interventions (i.e. not `None` + # value), then also add the symmetric difference mapping to + # ``symmetric_diff_map``, which maps the F-node to the intervention target. + + # where ``targets`` is a set of either nodes, or set of indices corresponding + # to the input data distributions and ``domains`` is a set of domains, either + # a single domain for F-nodes within domain, or a set of two domains for + # F-nodes across domains. + + # Parameters + # ---------- + # domain_ids : List[int] + # A list of domain ids for each input distribution. + # intervention_targets : List[Set] + # A list of known intervention targets for each input distribution with ``None`` + # representing unknown targets. If the distribution is observational, then + # the empty set is used. + + # Returns + # ------- + # augmented_nodes : List + # Set of augmented nodes (i.e. F and S nodes). + # symmetric_diff_map : Dict[Any, FrozenSet] + # Mapping of augmented nodes to intervention targets, or distribution indices represented + # by the node. + # sigma_map : Dict[Any, FrozenSet] + # Mapping of augmented nodes to distribution indices represented by the node. + # node_domain_map : Dict[Any, FrozenSet] + # Mapping of augmented nodes to domains. + # """ + # # map augmented nodes to domains + # node_domain_map = dict() + # symmetric_diff_map = dict() + # sigma_map = dict() + # f_nodes = [] + + # # create F-nodes, which is now all combinations of distributions choose 2 + # k = 0 + # seen_domain_pairs = dict() + # seen_distr_pairs = dict() + + # # compare every pair of distributions to now add interventions if necessary + # for dataset_idx, source in enumerate(domain_ids): + # for dataset_jdx, target in enumerate(domain_ids): + # # perform memoization to avoid duplicate augmented nodes + # domain_memo_key = frozenset([source, target]) + # distr_memo_key = frozenset([dataset_idx, dataset_jdx]) + # if dataset_jdx <= dataset_idx: + # continue + # if domain_memo_key in seen_domain_pairs and distr_memo_key in seen_distr_pairs: + # continue + # seen_domain_pairs[domain_memo_key] = None + # seen_distr_pairs[distr_memo_key] = None + + # # map each augmented-node to a tuple of distribution indices, or to a set of nodes + # # representing the intervention targets + # if ( + # intervention_targets[dataset_idx] is not None + # and intervention_targets[dataset_jdx] is not None + # and source == target + # ): + # symm_diff = set(intervention_targets[dataset_idx]).symmetric_difference( + # set(intervention_targets[dataset_jdx]) + # ) + # targets = frozenset(symm_diff) + # else: + # targets = None + + # # create the F-node + # f_node = ("F", k) + # f_nodes.append(f_node) + + # # map each F-node to a set of domain(s) + # node_domain_map[f_node] = [source, target] + # sigma_map[f_node] = [dataset_idx, dataset_jdx] + # symmetric_diff_map[f_node] = targets + + # k += 1 + # augmented_nodes = set(f_nodes) + # return augmented_nodes, symmetric_diff_map, sigma_map, node_domain_map def learn_graph( self, @@ -1626,9 +1630,8 @@ def learn_graph( symmetric_diff_map, sigma_map, node_domain_map, - ) = self._create_augmented_nodes( - domain_ids=domain_indices, - intervention_targets=intervention_targets + ) = pg.classes.compute_augmented_nodes( + intervention_targets=intervention_targets, domain_ids=domain_indices ) # initialize the augmented graph to be fully connected to observed casual variables @@ -1644,7 +1647,7 @@ def learn_graph( # extract F and S-nodes f_nodes = augmented_nodes - + # skeleton discovery should not condition on augmented nodes skip_nodes = augmented_nodes @@ -1677,17 +1680,17 @@ def learn_graph( # R9 allows us to leverage F-nodes being not in separating sets to # augment all separating sets that have non-empty sets with all # F-nodes to keep consistency with the algorithm - for x_var, y_vars in self.sep_set_.items(): - for y_var in y_vars: - sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore - if len(sep_sets) > 0: - for idx in range(len(sep_sets)): - self.sep_set_[x_var][y_var][idx].update(context.f_nodes) - - # loop through each domain pair to learn the F-node skeleton + # for x_var, y_vars in self.sep_set_.items(): + # for y_var in y_vars: + # sep_sets: List = self.sep_set_.get(x_var).get(y_var) # type: ignore + # if len(sep_sets) > 0: + # for idx in range(len(sep_sets)): + # self.sep_set_[x_var][y_var][idx].update(context.f_nodes) + + # loop through each pair of datasets to learn the augmented F-node skeleton seen_domain_pairs = set() for idx, source in enumerate(domain_indices): - # analyze F-nodes only within the 'source' domain + # analyze F-nodes only within the 'source' single domain source_fnodes = [ node for node in augmented_nodes if set(node_domain_map[node]) == {source} ] @@ -1706,7 +1709,13 @@ def learn_graph( cross_distribution_test=True, ) + # now compute skeleton among all possible F-nodes representing domain pairs + for idx, source in enumerate(domain_indices): for jdx, target in enumerate(domain_indices): + # skip the same dataset + if idx == jdx: + continue + # skip if source and target are the same domain because we have # already learned from these pairs of datasets if source == target: @@ -1737,8 +1746,7 @@ def learn_graph( skipped_z_nodes=skip_nodes, cross_distribution_test=True, # debug=debug, - ) - + ) # prepare the context object for the second stage of learning # all separating sets are either: diff --git a/examples/constraint/plot_simulation_sfci.ipynb b/examples/constraint/plot_simulation_sfci.ipynb index 5e0dbeee8..aa91912a5 100644 --- a/examples/constraint/plot_simulation_sfci.ipynb +++ b/examples/constraint/plot_simulation_sfci.ipynb @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 220, + "execution_count": 2, "id": "290503ef-96a6-433a-b01c-e10ea04ba6f7", "metadata": {}, "outputs": [], @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "3ec27151-eee2-49a3-bf74-0cc671ecac7c", "metadata": {}, "outputs": [], @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "7ebd007f-de4a-41d0-951a-057c7d4aa627", "metadata": {}, "outputs": [], @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 161, + "execution_count": 5, "id": "8de9d34b-cc5f-4acb-8c49-a7a05fbb7b43", "metadata": {}, "outputs": [], @@ -121,7 +121,28 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 32, + "id": "cba43643-7f55-46ff-9113-fd42c1b119b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "True\n" + ] + } + ], + "source": [ + "print(type(G))\n", + "# print(G.undirected_edges)\n", + "print(isinstance(G, type(nx.Graph())))" + ] + }, + { + "cell_type": "code", + "execution_count": 33, "id": "84b152fd-0a9b-410e-af5f-4bbe7b041744", "metadata": {}, "outputs": [ @@ -220,21 +241,87 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 164, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dot_graph = draw(G)\n", - "dot_graph.render(outfile=\"true_graph.png\", view=False, cleanup=True)\n", + "# get the layout position for the graph G using networkx\n", + "pos_G = nx.spring_layout(G, k=1)\n", + "\n", + "dot_graph = draw(G, pos=pos_G, prog=\"neato\")\n", + "dot_graph.render(outfile=\"true_graph.png\", view=False, cleanup=True, engine=\"neato\")\n", "\n", "dot_graph" ] }, + { + "cell_type": "code", + "execution_count": 34, + "id": "9bde340d-d05a-430e-8663-23c824e25b6f", + "metadata": {}, + "outputs": [], + "source": [ + "node_order = list(nx.topological_sort(G))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1a781934-c086-487b-8fb9-b1bb63fdfa8a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.10793277 0.21842778]\n", + "digraph {\n", + "\tA [height=.5 pos=\"0.10793277386412264,0.21842778372323665\" shape=square width=.5]\n", + "\tX -> A [color=blue prog=neato]\n", + "\tB [height=.5 pos=\"-0.5083602744222117,-0.2879750418138882\" shape=square width=.5]\n", + "\tA -> B [color=blue prog=neato]\n", + "\tC [height=.5 pos=\"0.06927561966926396,-0.20876747677347904\" shape=square width=.5]\n", + "\tB -> C [color=blue prog=neato]\n", + "\tX -> C [color=blue prog=neato]\n", + "\tD [height=.5 pos=\"-0.9358469497119339,0.17196159773885009\" shape=square width=.5]\n", + "\tC -> D [color=blue prog=neato]\n", + "\tB -> D [color=blue prog=neato]\n", + "\tX [height=.5 pos=\"0.26699883060075913,0.5517523955094646\" shape=square width=.5]\n", + "\tW [height=.5 pos=\"1.0,-0.44539925838418415\" shape=square width=.5]\n", + "\tC -> W [color=blue prog=neato]\n", + "}\n", + "\n" + ] + } + ], + "source": [ + "print(pos_G[\"A\"])\n", + "print(dot_graph)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d3f8ac7f-8100-4981-87ae-c3ae1af470b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{}\n" + ] + } + ], + "source": [ + "print(dot_graph.node_attr)" + ] + }, { "cell_type": "markdown", "id": "391415ef-d4ed-4f1b-a868-15b856561bf7", @@ -248,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 340, + "execution_count": 16, "id": "f1306805-a77f-4515-be77-de6ae630f8e9", "metadata": {}, "outputs": [], @@ -261,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 341, + "execution_count": 17, "id": "8e116785-4421-4657-89f2-15cd163bfa99", "metadata": {}, "outputs": [ @@ -289,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 342, + "execution_count": 18, "id": "60e9cb9a-d941-4cc0-bca0-decd7830756a", "metadata": {}, "outputs": [ @@ -310,14 +397,27 @@ }, { "cell_type": "code", - "execution_count": 343, + "execution_count": 19, "id": "30f2e2a4-667b-45e5-b9f3-c87d0d209854", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "inside: [('A', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}), ('B', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}), ('C', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x1768a8310>}), ('D', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x1768a8940>}), ('X', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x1051b5160>}), ('W', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>})]\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x1768a8310>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x1768a8940>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x1051b5160>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>}\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9ef5303132fb47f9b77424de0b0946d3", + "model_id": "cbb992ae11824c748a2ff4d561458afa", "version_major": 2, "version_minor": 0 }, @@ -336,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 20, "id": "b0acf0c7-0ca9-4fde-8100-f91597d726d9", "metadata": {}, "outputs": [ @@ -365,8 +465,8 @@ " B\n", " C\n", " D\n", - " W\n", " X\n", + " W\n", " \n", " \n", " \n", @@ -376,8 +476,8 @@ " 1\n", " 0\n", " 0\n", - " 2\n", " 1\n", + " 2\n", " \n", " \n", " 1\n", @@ -394,8 +494,8 @@ " 2\n", " 2\n", " 2\n", - " 0\n", " 1\n", + " 0\n", " \n", " \n", " 3\n", @@ -403,8 +503,8 @@ " 1\n", " 2\n", " 2\n", - " 1\n", " 2\n", + " 1\n", " \n", " \n", " 4\n", @@ -412,20 +512,20 @@ " 2\n", " 2\n", " 1\n", - " 1\n", " 2\n", + " 1\n", " \n", " \n", "\n", "" ], "text/plain": [ - " A B C D W X\n", - "0 2 1 0 0 2 1\n", + " A B C D X W\n", + "0 2 1 0 0 1 2\n", "1 1 1 2 1 2 2\n", - "2 1 2 2 2 0 1\n", - "3 1 1 2 2 1 2\n", - "4 1 2 2 1 1 2" + "2 1 2 2 2 1 0\n", + "3 1 1 2 2 2 1\n", + "4 1 2 2 1 2 1" ] }, "metadata": {}, @@ -457,74 +557,42 @@ }, { "cell_type": "code", - "execution_count": 123, - "id": "9d50b505-2181-44d7-a62b-0d4890d169e6", - "metadata": {}, - "outputs": [], - "source": [ - "ci_estimator = CategoricalCITest(lambda_=\"cressie-read\")" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "id": "be1b9ec1-59ce-4134-bfc8-c7429936698e", + "execution_count": 250, + "id": "0f341994-ccb8-44c7-a1ac-d4af8513797f", "metadata": {}, "outputs": [], "source": [ - "context = make_context().variables(data=df).build()\n", - "\n", - "learner = SFCI(\n", - " ci_estimator=ci_estimator,\n", - " cd_estimator=ci_estimator,\n", - " n_jobs=n_jobs,\n", - " max_cond_set_size=2,\n", - " max_combinations=None,\n", - " # alpha=0.5,\n", + "ctx_builder = make_context()\n", + "ctx: Context = (\n", + " ctx_builder.variables(data=df)\n", + " # .obs_distribution(True)\n", + " .build()\n", ")" ] }, { "cell_type": "code", - "execution_count": 125, - "id": "e7d3fccc-6b82-4b0d-b772-d360b3d83b9a", + "execution_count": 251, + "id": "760c6d42-8bea-404b-987d-8a7c19699b37", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using data from distribution 0 for learning the skeleton.\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "learner.fit([df], context, domain_indices=[1], intervention_targets=[None])" + "ci_estimator = CategoricalCITest()" ] }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 252, "id": "edefd463-f795-4ef4-a17a-dc762452b5aa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 126, + "execution_count": 252, "metadata": {}, "output_type": "execute_result" } @@ -538,13 +606,13 @@ " max_combinations=None,\n", " # alpha=0.5,\n", ")\n", - "fci_learner.fit(df, context)" + "fci_learner.learn_graph(df, ctx)" ] }, { "cell_type": "code", - "execution_count": 127, - "id": "70754e13-0ce0-48db-a7e6-f26d3704ab68", + "execution_count": 258, + "id": "4807951b-197d-4137-88bb-c5b49be48255", "metadata": {}, "outputs": [ { @@ -556,227 +624,154 @@ "\n", "\n", - "\n", - "\n", - "\n", - "SFCI graph\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", + "\n", + "W\n", "\n", "\n", - "\n", + "\n", "B\n", - "\n", - "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", "\n", "\n", "\n", "B->C\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "A\n", - "\n", - "A\n", + "\n", + "A\n", "\n", "\n", - "\n", + "\n", "B->A\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "X\n", - "\n", - "X\n", - "\n", - "\n", - "\n", - "A->X\n", - "\n", - "\n", - "\n", + "\n", + "X\n", "\n", "\n", "\n", "X->C\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 127, + "execution_count": 258, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "graph = learner.graph_\n", - "draw(graph, name=\"SFCI graph\")" + "graph = fci_learner.graph_\n", + "# draw(graph, name=\"FCI graph\", pos=pos_G, prog=\"neato\")\n", + "dot_graph = draw(\n", + " graph,\n", + " # name=\"FCI graph\",\n", + " pos=pos_G, # prog=\"neato\" # , node_order=node_order\n", + ")\n", + "\n", + "dot_graph.render(\n", + " outfile=\"./fci_obs.png\",\n", + " view=False,\n", + " cleanup=True,\n", + " # engine=\"neato\"\n", + ")\n", + "dot_graph" ] }, { "cell_type": "code", - "execution_count": 128, - "id": "4807951b-197d-4137-88bb-c5b49be48255", + "execution_count": 254, + "id": "1739c748-c2e1-4025-9234-0d3d751ef57c", "metadata": {}, "outputs": [ { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "FCI graph\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", - "\n", - "\n", - "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B\n", - "\n", - "B\n", - "\n", - "\n", - "\n", - "B->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A\n", - "\n", - "A\n", - "\n", - "\n", - "\n", - "B->A\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", - "\n", - "\n", - "\n", - "A->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X->C\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 128, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "digraph {\n", + "\tgraph [label=\"FCI graph\"]\n", + "\tX [height=.5 pos=\"0.7391505362251583,0.11699328808194805!\" shape=square width=.5]\n", + "\tA [height=.5 pos=\"1.0,-0.3140320449124699!\" shape=square width=.5]\n", + "\tB [height=.5 pos=\"-0.08608632483664021,0.2688828567162253!\" shape=square width=.5]\n", + "\tC [height=.5 pos=\"-0.22678494014014539,-0.37720753552784386!\" shape=square width=.5]\n", + "\tD [height=.5 pos=\"-0.8244997069657383,-0.42188428497794495!\" shape=square width=.5]\n", + "\tW [height=.5 pos=\"-0.6017795642826345,0.7272477206200854!\" shape=square width=.5]\n", + "\tB -> A [arrowhead=odot arrowtail=normal color=green dir=both]\n", + "\tC -> W [arrowhead=odot arrowtail=normal color=green dir=both]\n", + "\tX -> A [arrowhead=odot arrowtail=odot color=green dir=both]\n", + "\tB -> D [color=red dir=both]\n", + "\tB -> C [color=blue engine=neato]\n", + "\tX -> C [color=blue engine=neato]\n", + "\tC -> D [color=blue engine=neato]\n", + "}\n", + "\n" + ] } ], "source": [ - "graph = fci_learner.graph_\n", - "draw(graph, name=\"FCI graph\")" + "print(dot_graph)" ] }, { @@ -802,7 +797,17 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 66, + "id": "701726ae-1c84-4efc-8ce8-bd7eae39ce83", + "metadata": {}, + "outputs": [], + "source": [ + "n_sample_ints = 30_000" + ] + }, + { + "cell_type": "code", + "execution_count": 67, "id": "262ca3c7-2971-45c9-98e7-18c7ca18a715", "metadata": {}, "outputs": [], @@ -812,42 +817,27 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 68, "id": "1b327575-69b0-42c8-a7d9-5dcd1bb77998", "metadata": {}, "outputs": [ { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3e3ebc16cf004cb0b9355d383636df98", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/6 [00:00, 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}), ('B', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}), ('C', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x1768a8310>}), ('D', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x29011d820>}), ('X', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x1051b5160>}), ('W', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>})]\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x1768a8310>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x29011d820>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x1051b5160>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>}\n" + ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3635c37e07b542eaa613a6aa72b996e4", + "model_id": "e29e3fecb9544024877bee26611e512b", "version_major": 2, "version_minor": 0 }, @@ -862,8 +852,8 @@ "source": [ "# we will now simulate a set of interventions on the graph\n", "targets = [\n", - " [\"X\"],\n", - " [\"C\"],\n", + " # [\"X\"],\n", + " # [\"C\"],\n", " [\"D\"],\n", "]\n", "data = [df]\n", @@ -872,14 +862,16 @@ " int_G = apply_discrete_soft_intervention(G.copy(), target, random_state=seed)\n", "\n", " # now we sample from the graph the discrete dataset\n", - " int_df = sample_from_graph(int_G, n_samples=30000, n_jobs=1, random_state=seed)\n", + " int_df = sample_from_graph(\n", + " int_G, n_samples=n_sample_ints, n_jobs=1, random_state=seed\n", + " )\n", "\n", " data.append(int_df)" ] }, { "cell_type": "code", - "execution_count": 156, + "execution_count": 69, "id": "b7fb1516-0c11-4c27-938e-d9b9c1e2113d", "metadata": {}, "outputs": [ @@ -887,7 +879,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "4\n" + "2\n" ] } ], @@ -897,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 157, + "execution_count": 70, "id": "8faa5572-0bf1-404b-b9bd-130196e5dcf5", "metadata": {}, "outputs": [], @@ -913,7 +905,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 71, "id": "4e1cd006-b5f4-4cd1-b796-55587d226503", "metadata": {}, "outputs": [], @@ -923,14 +915,15 @@ " cd_estimator=ci_estimator,\n", " max_cond_set_size=2,\n", " n_jobs=-1,\n", + " debug=True,\n", ")\n", "\n", - "int_learner = int_learner.fit(data, ctx)" + "int_learner = int_learner.learn_graph(data, ctx)" ] }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 72, "id": "3b6f3e72-4c50-44b1-be16-c7b62f06b3ea", "metadata": {}, "outputs": [ @@ -943,100 +936,100 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "W\n", - "\n", - "W\n", + "\n", + "W\n", "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", "\n", "\n", "\n", "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", + "\n", + "D\n", "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "A\n", - "\n", - "A\n", + "\n", + "A\n", "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", + "\n", + "\n", + "B->A\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "B\n", - "\n", - "B\n", + "C\n", + "\n", + "C\n", "\n", "\n", - "\n", + "\n", "B->C\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", + "\n", + "\n", + "A->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 134, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -1046,12 +1039,15 @@ "\n", "# %%\n", "# Visualize the full graph including the F-node\n", - "draw(est_pag, direction=\"LR\")" + "dot_graph = draw(est_pag, pos=pos_G)\n", + "\n", + "dot_graph.render(outfile=\"./psifci_obsandint.png\", view=False, cleanup=True)\n", + "dot_graph" ] }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 74, "id": "0c9c5d55-534c-4aaf-b4ca-71132878bbbc", "metadata": {}, "outputs": [ @@ -1064,190 +1060,112 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", - "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A\n", - "\n", - "A\n", - "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", + "\n", + "W\n", "\n", "\n", - "\n", + "\n", "B\n", - "\n", - "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", "\n", "\n", "\n", "B->C\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", "\n", "\n", "\n", "B->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 2)\n", - "\n", - "('F', 2)\n", - "\n", - "\n", - "\n", - "('F', 2)->D\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "('F', 3)\n", - "\n", - "('F', 3)\n", - "\n", - "\n", - "\n", - "('F', 3)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 3)->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 1)\n", - "\n", - "('F', 1)\n", + "A\n", + "\n", + "A\n", "\n", - "\n", - "\n", - "('F', 1)->C\n", - "\n", - "\n", + "\n", + "\n", + "B->A\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 5)\n", - "\n", - "('F', 5)\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "('F', 5)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", + "C->D\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 4)\n", - "\n", - "('F', 4)\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", "\n", - "\n", - "\n", - "('F', 4)->D\n", - "\n", - "\n", + "\n", + "\n", + "('F', 0)->D\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 4)->X\n", - "\n", - "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", "\n", - "\n", - "\n", - "('F', 0)\n", - "\n", - "('F', 0)\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 0)->X\n", - "\n", - "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 135, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -1257,204 +1175,70 @@ "\n", "# %%\n", "# Visualize the full graph including the F-node\n", - "draw(est_pag, direction=\"LR\")" + "draw(est_pag, pos=pos_G)" ] }, { "cell_type": "code", - "execution_count": 150, - "id": "51fcfcf0-46ec-41ec-9eba-ae1a1b1ee231", + "execution_count": 52, + "id": "58416873-6d8f-4a2e-880f-43c9d948db1c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[None, ['X'], ['C'], ['D']]\n" + "{('A', 'B'): 'collider',\n", + " ('A', 'C'): 'rule9',\n", + " ('B', 'C'): 'rule 1: A *-> B o-* C',\n", + " ('B', 'D'): 'rule2',\n", + " ('C', 'B'): 'rule 1: A *-> B o-* C',\n", + " ('C', 'D'): 'rule 1: W *-> C o-* D',\n", + " ('D', 'B'): 'collider',\n", + " ('D', 'C'): 'rule 1: W *-> C o-* D',\n", + " ('W', 'C'): 'collider',\n", + " ('X', 'C'): 'collider'}\n" ] } ], "source": [ - "intervention_targets = targets.copy()\n", - "intervention_targets.insert(0, None)\n", - "print(intervention_targets)" + "pprint(int_learner.debug_map)" ] }, { - "cell_type": "code", - "execution_count": 141, - "id": "a8bfb31a-dbfa-4106-8d3f-fc09af3e9f07", + "cell_type": "markdown", + "id": "0a3dc765-a4cd-46bf-aa7c-3847041419a7", "metadata": {}, - "outputs": [], "source": [ - "learner = SFCI(\n", - " ci_estimator=ci_estimator,\n", - " cd_estimator=ci_estimator,\n", - " max_cond_set_size=2,\n", - " n_jobs=-1,\n", - ")\n", + "We see that additional edges can be oriented with the presence of interventional data. Moreover, the SFCI algorithm perfectly \n", + "replicates and builds on top of the interventional data." + ] + }, + { + "cell_type": "markdown", + "id": "1a15289e-32ee-45ab-a5ff-a6f3aeedf4b3", + "metadata": {}, + "source": [ + "Causal Discovery: Observational data across multiple domains\n", + "------------------------------------------------------------\n", "\n", - "learner.fit(\n", - " data,\n", - " ctx,\n", - " domain_indices=[1, 1, 1, 1],\n", - " intervention_targets=intervention_targets,\n", - ")" + "In the SFCI paper, it is shown that the $\\Psi$-FCI algorithm is equivalent to the SFCI algorithm when there is\n", + "observational data across multiple domains, where the F-nodes can be seen as equivalent to S-nodes.\n", + "\n", + "We can leverage the same distributions that were intervened on because the change in domain can be seen\n", + "as an unknown-target intervention that occurs over those variables. That is, nature changes the distribution (CPD)\n", + "of the intervened variables, but we do not know where nature intervened. Thus conceptually, we see observational\n", + "data across multiple domains is similar to the setting with unknown-target interventional data within\n", + "a single domain. \n", + "\n", + "We will see later that when we have interventional data across multiple domains, the story becomes more complex\n", + "(and as a result, more interesting)." ] }, { "cell_type": "code", - "execution_count": 160, - "id": "fe520613-c5ce-4714-bce1-101077345ea9", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", - "\n", - "\n", - "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", - "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A\n", - "\n", - "A\n", - "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B\n", - "\n", - "B\n", - "\n", - "\n", - "\n", - "B->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 160, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "est_pag = learner.graph_\n", - "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", - "draw(est_pag_no_fnodes, direction=\"LR\")" - ] - }, - { - "cell_type": "markdown", - "id": "0a3dc765-a4cd-46bf-aa7c-3847041419a7", - "metadata": {}, - "source": [ - "We see that additional edges can be oriented with the presence of interventional data. Moreover, the SFCI algorithm perfectly \n", - "replicates and builds on top of the interventional data." - ] - }, - { - "cell_type": "markdown", - "id": "1a15289e-32ee-45ab-a5ff-a6f3aeedf4b3", - "metadata": {}, - "source": [ - "Causal Discovery: Observational data across multiple domains\n", - "------------------------------------------------------------\n", - "\n", - "In the SFCI paper, it is shown that the $\\Psi$-FCI algorithm is equivalent to the SFCI algorithm when there is\n", - "observational data across multiple domains, where the F-nodes can be seen as equivalent to S-nodes.\n", - "\n", - "We can leverage the same distributions that were intervened on because the change in domain can be seen\n", - "as an unknown-target intervention that occurs over those variables. That is, nature changes the distribution (CPD)\n", - "of the intervened variables, but we do not know where nature intervened. Thus conceptually, we see observational\n", - "data across multiple domains is similar to the setting with unknown-target interventional data within\n", - "a single domain. \n", - "\n", - "We will see later that when we have interventional data across multiple domains, the story becomes more complex\n", - "(and as a result, more interesting)." - ] - }, - { - "cell_type": "code", - "execution_count": 205, - "id": "f3478f02-7401-478c-b2bc-86058af4efc6", + "execution_count": 75, + "id": "f3478f02-7401-478c-b2bc-86058af4efc6", "metadata": {}, "outputs": [], "source": [ @@ -1470,7 +1254,7 @@ }, { "cell_type": "code", - "execution_count": 238, + "execution_count": 76, "id": "deceeeac-3866-4ecd-9ca7-b1206a11b4cd", "metadata": {}, "outputs": [], @@ -1483,12 +1267,12 @@ " debug=True,\n", ")\n", "\n", - "int_learner = int_learner.fit(data, ctx)" + "int_learner = int_learner.learn_graph(data, ctx)" ] }, { "cell_type": "code", - "execution_count": 240, + "execution_count": 245, "id": "4116afe8-8dff-4487-930f-277bbd382301", "metadata": {}, "outputs": [ @@ -1501,190 +1285,194 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", "\n", - "C\n", - "\n", - "C\n", - "\n", - "\n", - "\n", - "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", + "B\n", + "\n", + "B\n", "\n", "\n", - "\n", + "\n", "D\n", - "\n", - "D\n", + "\n", + "D\n", "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "X\n", - "\n", - "X\n", + "C\n", + "\n", + "C\n", "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", "\n", - "\n", - "\n", - "A\n", - "\n", - "A\n", + "\n", + "\n", + "D->C\n", + "\n", + "\n", "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", "\n", - "\n", - "\n", - "B\n", - "\n", - "B\n", + "\n", + "\n", + "W->C\n", + "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "B->C\n", - "\n", - "\n", + "\n", + "\n", + "('F', 5)\n", + "\n", + "('F', 5)\n", "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "('F', 5)->W\n", + "\n", + "\n", "\n", "\n", "\n", "('F', 2)\n", - "\n", - "('F', 2)\n", + "\n", + "('F', 2)\n", "\n", - "\n", - "\n", - "('F', 2)->D\n", - "\n", - "\n", + "\n", + "\n", + "('F', 2)->W\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 3)\n", - "\n", - "('F', 3)\n", + "\n", + "\n", + "('F', 2)->C\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 3)->C\n", - "\n", - "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", "\n", - "\n", - "\n", - "('F', 3)->X\n", - "\n", - "\n", + "\n", + "\n", + "('F', 2)->X\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 1)\n", - "\n", - "('F', 1)\n", + "\n", + "('F', 1)\n", "\n", "\n", - "\n", + "\n", "('F', 1)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)\n", - "\n", - "('F', 5)\n", - "\n", - "\n", - "\n", - "('F', 5)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('F', 5)->D\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "A->B\n", - "\n", - "\n", + "('F', 1)->X\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 4)\n", - "\n", - "('F', 4)\n", + "\n", + "('F', 4)\n", "\n", - "\n", - "\n", - "('F', 4)->D\n", - "\n", - "\n", + "\n", + "\n", + "('F', 4)->W\n", + "\n", + "\n", "\n", - "\n", - "\n", - "('F', 4)->X\n", - "\n", - "\n", + "\n", + "\n", + "('F', 4)->C\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "('F', 0)\n", - "\n", - "('F', 0)\n", + "\n", + "('F', 0)\n", "\n", "\n", - "\n", + "\n", "('F', 0)->X\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)\n", + "\n", + "('F', 3)\n", + "\n", + "\n", + "\n", + "('F', 3)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 240, + "execution_count": 245, "metadata": {}, "output_type": "execute_result" } @@ -1699,7 +1487,7 @@ }, { "cell_type": "code", - "execution_count": 242, + "execution_count": 48, "id": "007ac3d5-c259-4442-9bdc-1bfe36901c7f", "metadata": {}, "outputs": [ @@ -1712,100 +1500,100 @@ "\n", "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", "C\n", - "\n", - "C\n", + "\n", + "C\n", "\n", "\n", "\n", "W\n", - "\n", - "W\n", + "\n", + "W\n", "\n", "\n", "\n", "C->W\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "D\n", - "\n", - "D\n", + "\n", + "D\n", "\n", "\n", - "\n", + "\n", "C->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "X\n", - "\n", - "X\n", + "\n", + "X\n", "\n", - "\n", + "\n", "\n", - "C->X\n", - "\n", - "\n", - "\n", + "X->C\n", + "\n", + "\n", + "\n", "\n", "\n", "\n", "A\n", - "\n", - "A\n", + "\n", + "A\n", "\n", "\n", "\n", "X->A\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "B\n", - "\n", - "B\n", - "\n", - "\n", + "\n", "\n", - "B->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", + "A->B\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 242, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1815,7 +1603,10 @@ "\n", "# %%\n", "# Visualize the full graph including the F-node\n", - "draw(est_pag, direction=\"LR\")" + "dot_graph = draw(est_pag, direction=\"LR\")\n", + "\n", + "dot_graph.render(outfile=\"./sfci_obs.png\", view=False, cleanup=True)\n", + "dot_graph" ] }, { @@ -1837,465 +1628,6 @@ "print(intervention_targets)" ] }, - { - "cell_type": "code", - "execution_count": 268, - "id": "2f52b02d-d0ce-408a-91ff-c976c46394c1", - "metadata": { - "collapsed": true, - "jupyter": { - "outputs_hidden": true - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using data from distribution 0 for learning the skeleton.\n", - "Trying to learn skeleton for 0 to remove F-nodes: []\n", - "[('S', 0)]\n", - "{}\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "here... \n", - "\n", - "\n", - "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", - "0 1\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "{}\n", - "Trying to learn skeleton for 0 and 1 to remove S-nodes: [('S', 0)]\n", - "Trying to learn skeleton for 0 and 1 to remove F-nodes: [] grouped with S-node: ('S', 0)\n", - "[('S', 1)]\n", - "{}\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "here... \n", - "\n", - "\n", - "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", - "0 2\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "{}\n", - "Trying to learn skeleton for 0 and 2 to remove S-nodes: [('S', 1)]\n", - "Trying to learn skeleton for 0 and 2 to remove F-nodes: [] grouped with S-node: ('S', 1)\n", - "[('S', 2)]\n", - "{}\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "here... \n", - "\n", - "\n", - "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", - "0 3\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "{}\n", - "Trying to learn skeleton for 0 and 3 to remove S-nodes: [('S', 2)]\n", - "Trying to learn skeleton for 0 and 3 to remove F-nodes: [] grouped with S-node: ('S', 2)\n", - "Trying to learn skeleton for 1 to remove F-nodes: []\n", - "[('S', 3)]\n", - "{}\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "here... \n", - "\n", - "\n", - "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", - "1 2\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "{}\n", - "Trying to learn skeleton for 1 and 2 to remove S-nodes: [('S', 3)]\n", - "Trying to learn skeleton for 1 and 2 to remove F-nodes: [] grouped with S-node: ('S', 3)\n", - "[('S', 4)]\n", - "{}\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "here... \n", - "\n", - "\n", - "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", - "1 3\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "{}\n", - "Trying to learn skeleton for 1 and 3 to remove S-nodes: [('S', 4)]\n", - "Trying to learn skeleton for 1 and 3 to remove F-nodes: [] grouped with S-node: ('S', 4)\n", - "Trying to learn skeleton for 2 to remove F-nodes: []\n", - "[('S', 5)]\n", - "{}\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "here... \n", - "\n", - "\n", - "{('S', 2), ('S', 3), ('S', 1), ('S', 4), ('S', 5), ('S', 0)}\n", - "2 3\n", - "{('S', 0): [0, 1], ('S', 1): [0, 2], ('S', 2): [0, 3], ('S', 3): [1, 2], ('S', 4): [1, 3], ('S', 5): [2, 3]}\n", - "{}\n", - "Trying to learn skeleton for 2 and 3 to remove S-nodes: [('S', 5)]\n", - "Trying to learn skeleton for 2 and 3 to remove F-nodes: [] grouped with S-node: ('S', 5)\n", - "Trying to learn skeleton for 3 to remove F-nodes: []\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 268, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "learner = SFCI(\n", - " ci_estimator=ci_estimator,\n", - " cd_estimator=ci_estimator,\n", - " max_cond_set_size=2,\n", - " n_jobs=-1,\n", - " debug=True,\n", - ")\n", - "\n", - "learner.fit(\n", - " data,\n", - " ctx,\n", - " domain_indices=[0, 1, 2, 3],\n", - " intervention_targets=intervention_targets,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 272, - "id": "02ebb37d-f01a-4173-bc33-5dc5ef7071d7", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "SFCI\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", - "\n", - "\n", - "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", - "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A\n", - "\n", - "A\n", - "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B\n", - "\n", - "B\n", - "\n", - "\n", - "\n", - "B->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 272, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "est_pag = learner.graph_\n", - "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", - "draw(est_pag_no_fnodes, direction=\"LR\", name=\"SFCI\")" - ] - }, - { - "cell_type": "code", - "execution_count": 273, - "id": "49034875-c60c-46ca-9b85-0e56b992f15d", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "SFCI\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", - "\n", - "\n", - "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "D\n", - "\n", - "D\n", - "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", - "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A\n", - "\n", - "A\n", - "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B\n", - "\n", - "B\n", - "\n", - "\n", - "\n", - "B->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 3)\n", - "\n", - "('S', 3)\n", - "\n", - "\n", - "\n", - "('S', 3)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 3)->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 1)\n", - "\n", - "('S', 1)\n", - "\n", - "\n", - "\n", - "('S', 1)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 5)\n", - "\n", - "('S', 5)\n", - "\n", - "\n", - "\n", - "('S', 5)->C\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 5)->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 2)\n", - "\n", - "('S', 2)\n", - "\n", - "\n", - "\n", - "('S', 2)->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 4)\n", - "\n", - "('S', 4)\n", - "\n", - "\n", - "\n", - "('S', 4)->D\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 4)->X\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "('S', 0)\n", - "\n", - "('S', 0)\n", - "\n", - "\n", - "\n", - "('S', 0)->X\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 273, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "est_pag = learner.graph_\n", - "est_pag_no_fnodes = est_pag\n", - "dot_graph = draw(\n", - " est_pag_no_fnodes,\n", - " direction=\"LR\",\n", - " # name=\"SFCI\"\n", - ")\n", - "\n", - "dot_graph.render(outfile=\"./sfci_multidomain_obs.png\", view=False, cleanup=True)\n", - "dot_graph" - ] - }, { "cell_type": "code", "execution_count": 274, @@ -2351,7 +1683,7 @@ }, { "cell_type": "code", - "execution_count": 370, + "execution_count": 294, "id": "8115bfcd-209e-4c71-b1bd-87639955d134", "metadata": {}, "outputs": [ @@ -2359,46 +1691,49 @@ "name": "stdout", "output_type": "stream", "text": [ - "[set(), ['X'], ['C'], ['D']]\n", - "[set(), 'W', 'X']\n" + "[frozenset(), ['D']]\n", + "[frozenset(), ['D']]\n", + "[frozenset(), ('D',)]\n" ] } ], "source": [ "intervention_targets = targets.copy()\n", - "intervention_targets.insert(0, set())\n", + "intervention_targets.insert(0, frozenset())\n", "print(intervention_targets)\n", "\n", "domain_one_targets = intervention_targets.copy()\n", - "domain_two_targets = [set(), \"W\", \"X\"]\n", + "domain_two_targets = [frozenset(), (\"D\",)]\n", "\n", + "print(domain_one_targets)\n", "print(domain_two_targets)" ] }, { "cell_type": "code", - "execution_count": 371, + "execution_count": 295, "id": "56b79f04-c6ac-4d42-a7a2-b165ff212abb", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "inside: [('A', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}), ('B', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}), ('C', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x1768a8310>}), ('D', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x2929b2700>}), ('X', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x1051b5160>}), ('W', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>})]\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x1768a8310>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x2929b2700>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x1051b5160>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>}\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2ab6f5b712c54b3cbb2528544f3f984b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0/6 [00:00, 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}), ('B', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}), ('C', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x2907fae50>}), ('D', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x1768a8940>}), ('X', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x2907fa8b0>}), ('W', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>})]\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x2907fae50>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x1768a8940>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x2907fa8b0>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>}\n" + ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e8abd31deed54bf09c4b0cd1d6a90c52", + "model_id": "cb3a0740dad84013b1d524fdeb4a3c85", "version_major": 2, "version_minor": 0 }, @@ -2426,26 +1799,40 @@ ], "source": [ "# we will now simulate a set of interventions on the graph\n", - "domain_one_data = [df]\n", - "for target in domain_one_targets[1:]:\n", - " int_G = apply_discrete_soft_intervention(G.copy(), target, random_state=seed)\n", + "domain_two_data = []\n", + "int_G = apply_discrete_soft_intervention(G.copy(), {\"X\", \"C\"}, random_state=seed)\n", "\n", - " # now we sample from the graph the discrete dataset\n", - " int_df = sample_from_graph(int_G, n_samples=30000, n_jobs=1, random_state=seed)\n", + "# now we sample from the graph the discrete dataset\n", + "int_df = sample_from_graph(int_G, n_samples=n_sample_ints, n_jobs=1, random_state=seed)\n", + "domain_two_data.append(int_df)\n", + "domain_two_G = int_G.copy()\n", "\n", - " domain_one_data.append(int_df)" + "domain_two_obs = int_df.copy()" ] }, { "cell_type": "code", - "execution_count": 372, - "id": "9ce8617a-e9f6-437b-afd3-222fff0e917c", + "execution_count": 297, + "id": "1f06bcc8-8e5b-479c-a3c3-8787458baf1d", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "inside: [('A', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}), ('B', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}), ('C', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x2907fae50>}), ('D', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x2907e8310>}), ('X', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x2907fa8b0>}), ('W', {'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>})]\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x28e4f4670>, 'exogenous_distribution': . at 0x1768a8790>, 'parent_function': .parent_func at 0x1768a8430>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a8700>, 'exogenous_distribution': . at 0x1768a85e0>, 'parent_function': .parent_func at 0x1768a8550>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a83a0>, 'exogenous_distribution': . at 0x1768a84c0>, 'parent_function': .parent_func at 0x2907fae50>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.0, 'exogenous_function': . at 0x1768a8820>, 'exogenous_distribution': . at 0x1768a88b0>, 'parent_function': .parent_func at 0x2907e8310>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 1.0, 'exogenous_function': . at 0x104e5bee0>, 'exogenous_distribution': .parent_func at 0x2907fa8b0>}\n", + "{'cpd': , 'cardinality': 3, 'possible_values': [0, 1, 2], 'noise_ratio': 0.1, 'exogenous_function': . at 0x1768a89d0>, 'exogenous_distribution': . at 0x1768a8a60>, 'parent_function': .parent_func at 0x1768a8af0>}\n" + ] + }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7613921b1bf64d4ebff8363cf417bca6", + "model_id": "fdb605b59a7447ad8bbaffb1bdb12d71", "version_major": 2, "version_minor": 0 }, @@ -2458,180 +1845,894 @@ } ], "source": [ - "# we will now simulate a set of interventions on the graph\n", - "domain_two_data = []\n", - "int_G = apply_discrete_soft_intervention(G.copy(), {\"X\", \"C\"}, random_state=seed)\n", + "# add an S-node to node 'X', starting after the observational \"set()\"\n", + "for target in domain_two_targets[1:]:\n", + " int_G = apply_discrete_soft_intervention(\n", + " domain_two_G.copy(), target, random_state=seed\n", + " )\n", "\n", - "# now we sample from the graph the discrete dataset\n", - "int_df = sample_from_graph(int_G, n_samples=30000, n_jobs=1, random_state=seed)\n", - "domain_two_data.append(int_df)\n", - "domain_two_G = int_G.copy()" + " # now we sample from the graph the discrete dataset\n", + " int_df = sample_from_graph(\n", + " int_G, n_samples=n_sample_ints, n_jobs=1, random_state=seed\n", + " )\n", + "\n", + " domain_two_data.append(int_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 298, + "id": "9cfb5d36-7e7f-4253-8d6d-d9dadfdc9d9e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + } + ], + "source": [ + "data = domain_one_data + domain_two_data\n", + "print(len(data))" + ] + }, + { + "cell_type": "code", + "execution_count": 299, + "id": "b1ae275e-9e59-450b-9c9c-f13b6b6e7f05", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "[frozenset(), ['D'], frozenset(), ('D',)]\n" + ] + } + ], + "source": [ + "intervention_targets = domain_one_targets + domain_two_targets\n", + "print(len(intervention_targets))\n", + "print(intervention_targets)" + ] + }, + { + "cell_type": "code", + "execution_count": 300, + "id": "54dca048-f492-4b7c-a4b0-2cc5e920677c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + } + ], + "source": [ + "domain_ids = [0] * len(domain_one_targets) + [1] * len(domain_two_targets)\n", + "print(len(domain_ids))" + ] + }, + { + "cell_type": "code", + "execution_count": 301, + "id": "852441a3-6fca-46cb-a203-03a8fb7931ae", + "metadata": {}, + "outputs": [], + "source": [ + "# create context with information about the interventions\n", + "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", + "ctx: Context = ctx_builder.variables(data=data[0]).num_distributions(len(data)).build()" + ] + }, + { + "cell_type": "code", + "execution_count": 278, + "id": "481e0736-4c0c-45db-ac16-fc9a55eaf13c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using data from distribution 0 for learning the skeleton.\n", + "Trying to learn skeleton for 0 to remove F-nodes: [('F', 0)]\n", + "Trying to learn skeleton for 0 to remove F-nodes: [('F', 0)]\n", + "Trying to learn skeleton for 1 to remove F-nodes: [('F', 5)]\n", + "Trying to learn skeleton for 1 to remove F-nodes: [('F', 5)]\n", + "Trying to learn skeleton for 0 and 1 to remove F-nodes: [('F', 2), ('F', 1), ('F', 4), ('F', 3)]\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 278, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "learner = SFCI(\n", + " ci_estimator=ci_estimator,\n", + " cd_estimator=ci_estimator,\n", + " max_cond_set_size=2,\n", + " n_jobs=-1,\n", + " debug=True,\n", + ")\n", + "\n", + "learner.learn_graph(\n", + " data,\n", + " ctx,\n", + " domain_indices=domain_ids,\n", + " intervention_targets=intervention_targets,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "id": "09ba3ceb-5b6b-47c7-9eac-c4c73372a169", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('F', 2), 'W', 'B', ('F', 1), ('F', 4), 'D', 'A', ('F', 3), 'C', 'X', ('F', 0), ('F', 5)]\n", + "['W', 'B', 'C', ('F', 0), 'X', 'D', 'A']\n", + "{'W', 'B', 'D', 'A', 'C', 'X'}\n" + ] + } + ], + "source": [ + "print(ctx.init_graph.nodes)\n", + "print(est_pag.nodes)\n", + "print(ctx.get_non_augmented_nodes())" + ] + }, + { + "cell_type": "code", + "execution_count": 303, + "id": "75fa96b0-61b0-4632-a471-b38a8e3499a8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[frozenset(), ['D'], frozenset(), ('D',)]\n" + ] + } + ], + "source": [ + "print(intervention_targets)" + ] + }, + { + "cell_type": "code", + "execution_count": 302, + "id": "d207660c-a336-4ef3-ac59-e57e37d9690a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{('F', 0): (0, 1), ('F', 1): (0, 2), ('F', 2): (0, 3), ('F', 3): (1, 2), ('F', 4): (1, 3), ('F', 5): (2, 3)}\n" + ] + } + ], + "source": [ + "print(ctx.sigma_map)" + ] + }, + { + "cell_type": "code", + "execution_count": 280, + "id": "8afb55d8-313a-4f18-8da3-07ce89ab4b7d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)\n", + "\n", + "('F', 2)\n", + "\n", + "\n", + "\n", + "('F', 2)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 2)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)\n", + "\n", + "('F', 1)\n", + "\n", + "\n", + "\n", + "('F', 1)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 1)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)\n", + "\n", + "('F', 4)\n", + "\n", + "\n", + "\n", + "('F', 4)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 4)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)\n", + "\n", + "('F', 3)\n", + "\n", + "\n", + "\n", + "('F', 3)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 3)->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 0)\n", + "\n", + "('F', 0)\n", + "\n", + "\n", + "\n", + "('F', 0)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "('F', 5)\n", + "\n", + "('F', 5)\n", + "\n", + "\n", + "\n", + "('F', 5)->D\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 280, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = learner.graph_\n", + "\n", + "draw(\n", + " est_pag,\n", + " # direction=\"LR\",\n", + " pos=pos_G,\n", + " # name=\"SFCI\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 281, + "id": "968fb5ed-d8e9-4a6a-a471-baea43d635ed", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "A->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 281, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "est_pag = learner.graph_\n", + "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", + "\n", + "dot_graph = draw(\n", + " est_pag_no_fnodes,\n", + " pos=pos_G,\n", + " # direction=\"LR\",\n", + " # name=\"SFCI\"\n", + ")\n", + "\n", + "dot_graph.render(outfile=\"./sfci_multidomain_obsandint.png\", view=False, cleanup=True)\n", + "dot_graph" + ] + }, + { + "cell_type": "code", + "execution_count": 282, + "id": "90587357-0d97-4502-ae74-665ddb5358af", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(('F', 0), 'D'): 'collider',\n", + " (('F', 1), 'C'): 'collider',\n", + " (('F', 1), 'X'): 'collider',\n", + " (('F', 2), 'C'): 'collider',\n", + " (('F', 2), 'D'): 'collider',\n", + " (('F', 2), 'X'): 'collider',\n", + " (('F', 3), 'C'): 'collider',\n", + " (('F', 4), 'C'): 'collider',\n", + " (('F', 4), 'D'): 'collider',\n", + " (('F', 4), 'X'): 'collider',\n", + " ('A', 'C'): 'rule9',\n", + " ('A', 'X'): \"rule 1: ('F', 2) *-> X o-* A\",\n", + " ('B', 'A'): 'rule 1: X *-> A o-* B',\n", + " ('C', 'B'): 'rule 1: A *-> B o-* C',\n", + " (('F', 5), 'D'): 'Rule 11',\n", + " ('A', 'B'): 'rule 1: X *-> A o-* B',\n", + " ('B', 'C'): 'rule 1: A *-> B o-* C',\n", + " ('B', 'D'): 'collider',\n", + " ('C', 'D'): 'collider',\n", + " ('D', 'B'): 'collider',\n", + " ('D', 'C'): 'collider',\n", + " ('W', 'C'): 'collider',\n", + " ('X', 'C'): 'collider',\n", + " (('F', 3), 'D'): 'collider',\n", + " (('F', 3), 'X'): 'collider',\n", + " ('X', 'A'): \"rule 1: ('F', 2) *-> X o-* A\"}\n" + ] + } + ], + "source": [ + "pprint(learner.debug_map)" + ] + }, + { + "cell_type": "markdown", + "id": "3118d12f-3ee1-4577-9bf6-30446c7af10f", + "metadata": {}, + "source": [ + "# Stacking all the obs. data together" + ] + }, + { + "cell_type": "code", + "execution_count": 283, + "id": "c8b30f3d-e571-46c0-b384-91ea53549fd6", + "metadata": {}, + "outputs": [], + "source": [ + "# stack all the data together and then run through FCI\n", + "stacked_df = pd.concat((domain_one_obs, domain_two_obs), axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 284, + "id": "3869613c-8b5b-4bd1-977c-2abba38503a1", + "metadata": {}, + "outputs": [], + "source": [ + "ctx_builder = make_context()\n", + "ctx: Context = (\n", + " ctx_builder.variables(data=stacked_df)\n", + " # .obs_distribution(True)\n", + " .build()\n", + ")" ] }, { "cell_type": "code", - "execution_count": 373, - "id": "1f06bcc8-8e5b-479c-a3c3-8787458baf1d", + "execution_count": 285, + "id": "918546db-12ad-49b1-85bd-40ab1d6ea884", "metadata": {}, "outputs": [ { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "911d766330b3443fb60a656f7813fa36", - "version_major": 2, - "version_minor": 0 - }, "text/plain": [ - " 0%| | 0/6 [00:00" ] }, + "execution_count": 285, "metadata": {}, - "output_type": "display_data" - }, + "output_type": "execute_result" + } + ], + "source": [ + "# now let's run FCI\n", + "fci_learner = FCI(\n", + " ci_estimator=ci_estimator,\n", + " n_jobs=n_jobs,\n", + " max_cond_set_size=2,\n", + " max_combinations=None,\n", + " # alpha=0.5,\n", + ")\n", + "fci_learner.learn_graph(stacked_df, ctx)" + ] + }, + { + "cell_type": "code", + "execution_count": 286, + "id": "7e13fcca-1b3d-4960-a75d-08b675f80e81", + "metadata": {}, + "outputs": [ { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ebf83dba9fdb42f4975c7af480310a77", - "version_major": 2, - "version_minor": 0 - }, + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "W\n", + "\n", + "W\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "C\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "D\n", + "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "A\n", + "\n", + "\n", + "\n", + "B->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->A\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - " 0%| | 0/6 [00:00" ] }, + "execution_count": 286, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "# add an S-node to node 'X', starting after the observational \"set()\"\n", - "for target in domain_two_targets[1:]:\n", - " int_G = apply_discrete_soft_intervention(\n", - " domain_two_G.copy(), target, random_state=seed\n", - " )\n", + "est_pag = fci_learner.graph_\n", "\n", - " # now we sample from the graph the discrete dataset\n", - " int_df = sample_from_graph(int_G, n_samples=30000, n_jobs=1, random_state=seed)\n", + "dot_graph = draw(\n", + " est_pag,\n", + " direction=\"LR\",\n", + ")\n", "\n", - " domain_two_data.append(int_df)" + "\n", + "dot_graph.render(outfile=\"./fci_multidomain_stacked_obs.png\", view=False, cleanup=True)\n", + "dot_graph" + ] + }, + { + "cell_type": "markdown", + "id": "7eaf60a1-7fb6-4acc-871b-49c3a58fbe36", + "metadata": {}, + "source": [ + "# Stacking all the obs. and interventional data together" ] }, { "cell_type": "code", - "execution_count": 374, - "id": "9cfb5d36-7e7f-4253-8d6d-d9dadfdc9d9e", + "execution_count": 287, + "id": "13003a43-4b0c-459c-9308-1b90708f048b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "7\n" + "2\n" ] } ], "source": [ - "data = domain_one_data + domain_two_data\n", - "print(len(data))" + "# stack all observational and interventional data together and run through Psi-FCI\n", + "stacked_data = [\n", + " stacked_df.copy(), # stacked obs\n", + " pd.concat((domain_one_data[1], domain_two_data[1]), axis=0),\n", + "]\n", + "\n", + "# stacked_data.extend(domain_one_data[1:])\n", + "# stacked_data.extend(domain_two_data[1:])\n", + "\n", + "print(len(stacked_data))" ] }, { "cell_type": "code", - "execution_count": 375, - "id": "b1ae275e-9e59-450b-9c9c-f13b6b6e7f05", + "execution_count": 288, + "id": "96a15459-ffcc-4dfe-8e5b-c3a55cc79c80", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "7\n", - "[set(), ['X'], ['C'], ['D'], set(), 'W', 'X']\n" + "[frozenset(), ['D']]\n", + "[frozenset(), ('D',)]\n" ] } ], "source": [ - "intervention_targets = domain_one_targets + domain_two_targets\n", - "print(len(intervention_targets))\n", - "print(intervention_targets)" + "print(domain_one_targets)\n", + "print(domain_two_targets)" ] }, { "cell_type": "code", - "execution_count": 376, - "id": "54dca048-f492-4b7c-a4b0-2cc5e920677c", + "execution_count": 289, + "id": "cb39bed5-10b5-4b00-97d8-70bd3538f406", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "7\n" + "[['D']]\n" ] } ], "source": [ - "domain_ids = [0] * len(domain_one_targets) + [1] * len(domain_two_targets)\n", - "print(len(domain_ids))" + "stacked_targets = domain_one_targets.copy()[1:]\n", + "# stacked_targets.extend(domain_two_targets[1:])\n", + "\n", + "print(stacked_targets)" ] }, { "cell_type": "code", - "execution_count": 378, - "id": "852441a3-6fca-46cb-a203-03a8fb7931ae", + "execution_count": 290, + "id": "0f6b3ba3-5718-4084-ae95-26db290687cb", "metadata": {}, "outputs": [], "source": [ "# create context with information about the interventions\n", "ctx_builder = make_context(create_using=InterventionalContextBuilder)\n", - "ctx: Context = ctx_builder.variables(data=data[0]).num_distributions(len(data)).build()" + "ctx: Context = (\n", + " ctx_builder.variables(data=stacked_data[0])\n", + " .num_distributions(len(stacked_data))\n", + " .intervention_targets(stacked_targets)\n", + " .obs_distribution(True)\n", + " .build()\n", + ")" ] }, { "cell_type": "code", - "execution_count": 382, - "id": "481e0736-4c0c-45db-ac16-fc9a55eaf13c", + "execution_count": 291, + "id": "356859c0-5c65-4147-8582-ed027a0e5d5f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using data from distribution 0 for learning the skeleton.\n", - "Trying to learn skeleton for 0 to remove F-nodes: [('F', 2), ('F', 5), ('F', 0), ('F', 6), ('F', 1), ('F', 10)]\n", - "[('S', 0)]\n", - "{('F', 0): frozenset({'X'}), ('F', 1): frozenset({'C'}), ('F', 2): frozenset({'D'}), ('F', 3): frozenset({'W'}), ('F', 4): frozenset({'X'}), ('F', 5): frozenset({'X', 'C'}), ('F', 6): frozenset({'X', 'D'}), ('F', 7): frozenset({'X'}), ('F', 8): frozenset({'W', 'X'}), ('F', 9): frozenset(), ('F', 10): frozenset({'D', 'C'}), ('F', 11): frozenset({'C'}), ('F', 12): frozenset({'W', 'C'}), ('F', 13): frozenset({'X', 'C'}), ('F', 14): frozenset({'D'}), ('F', 15): frozenset({'W', 'D'}), ('F', 16): frozenset({'X', 'D'}), ('F', 17): frozenset({'W'}), ('F', 18): frozenset({'X'}), ('F', 19): frozenset({'W', 'X'})}\n", - "{('F', 0): [0, 1], ('F', 1): [0, 2], ('F', 2): [0, 3], ('S', 0): [0, 4], ('F', 3): [0, 5], ('F', 4): [0, 6], ('F', 5): [1, 2], ('F', 6): [1, 3], ('F', 7): [1, 4], ('F', 8): [1, 5], ('F', 9): [1, 6], ('F', 10): [2, 3], ('F', 11): [2, 4], ('F', 12): [2, 5], ('F', 13): [2, 6], ('F', 14): [3, 4], ('F', 15): [3, 5], ('F', 16): [3, 6], ('F', 17): [4, 5], ('F', 18): [4, 6], ('F', 19): [5, 6]}\n", - "here... \n", - "\n", - "\n", - "{('F', 2), ('F', 5), ('F', 11), ('F', 8), ('F', 14), ('F', 17), ('F', 0), ('F', 3), ('F', 9), ('F', 6), ('F', 12), ('F', 15), ('F', 18), ('F', 4), ('F', 1), ('F', 7), ('F', 10), ('F', 16), ('F', 13), ('F', 19), ('S', 0)}\n", - "0 1\n", - "{('F', 0): [0, 1], ('F', 1): [0, 2], ('F', 2): [0, 3], ('S', 0): [0, 4], ('F', 3): [0, 5], ('F', 4): [0, 6], ('F', 5): [1, 2], ('F', 6): [1, 3], ('F', 7): [1, 4], ('F', 8): [1, 5], ('F', 9): [1, 6], ('F', 10): [2, 3], ('F', 11): [2, 4], ('F', 12): [2, 5], ('F', 13): [2, 6], ('F', 14): [3, 4], ('F', 15): [3, 5], ('F', 16): [3, 6], ('F', 17): [4, 5], ('F', 18): [4, 6], ('F', 19): [5, 6]}\n", - "{('F', 0): frozenset({'X'}), ('F', 1): frozenset({'C'}), ('F', 2): frozenset({'D'}), ('F', 3): frozenset({'W'}), ('F', 4): frozenset({'X'}), ('F', 5): frozenset({'X', 'C'}), ('F', 6): frozenset({'X', 'D'}), ('F', 7): frozenset({'X'}), ('F', 8): frozenset({'W', 'X'}), ('F', 9): frozenset(), ('F', 10): frozenset({'D', 'C'}), ('F', 11): frozenset({'C'}), ('F', 12): frozenset({'W', 'C'}), ('F', 13): frozenset({'X', 'C'}), ('F', 14): frozenset({'D'}), ('F', 15): frozenset({'W', 'D'}), ('F', 16): frozenset({'X', 'D'}), ('F', 17): frozenset({'W'}), ('F', 18): frozenset({'X'}), ('F', 19): frozenset({'W', 'X'})}\n", - "Trying to learn skeleton for 0 and 1 to remove S-nodes: [('S', 0)]\n", - "Trying to learn skeleton for 0 and 1 to remove F-nodes: [('F', 11), ('F', 8), ('F', 14), ('F', 3), ('F', 9), ('F', 12), ('F', 15), ('F', 4), ('F', 7), ('F', 16), ('F', 13)] grouped with S-node: ('S', 0)\n", - "Trying to learn skeleton for 0 to remove F-nodes: [('F', 2), ('F', 5), ('F', 0), ('F', 6), ('F', 1), ('F', 10)]\n", - "Trying to learn skeleton for 0 to remove F-nodes: [('F', 2), ('F', 5), ('F', 0), ('F', 6), ('F', 1), ('F', 10)]\n", - "Trying to learn skeleton for 0 to remove F-nodes: [('F', 2), ('F', 5), ('F', 0), ('F', 6), ('F', 1), ('F', 10)]\n", - "Trying to learn skeleton for 1 to remove F-nodes: [('F', 17), ('F', 18), ('F', 19)]\n", - "Trying to learn skeleton for 1 to remove F-nodes: [('F', 17), ('F', 18), ('F', 19)]\n", - "Trying to learn skeleton for 1 to remove F-nodes: [('F', 17), ('F', 18), ('F', 19)]\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 382, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "learner = SFCI(\n", + "#\n", + "int_learner = PsiFCI(\n", " ci_estimator=ci_estimator,\n", " cd_estimator=ci_estimator,\n", " max_cond_set_size=2,\n", @@ -2639,40 +2740,13 @@ " debug=True,\n", ")\n", "\n", - "learner.fit(\n", - " data,\n", - " ctx,\n", - " domain_indices=domain_ids,\n", - " intervention_targets=intervention_targets,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 395, - "id": "09ba3ceb-5b6b-47c7-9eac-c4c73372a169", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['W', 'C', 'B', 'A', 'X', 'D']\n", - "['W', 'X', 'C', 'B', 'D', 'A', ('F', 2), ('F', 5), ('F', 11), ('F', 8), ('F', 14), ('F', 17), ('F', 0), ('F', 3), ('F', 9), ('F', 6), ('F', 12), ('F', 15), ('F', 18), ('F', 4), ('F', 1), ('F', 7), ('F', 10), ('F', 16), ('F', 13), ('F', 19), ('S', 0)]\n", - "{'C', 'B', 'D', 'W', 'X', 'A'}\n" - ] - } - ], - "source": [ - "print(context.init_graph.nodes)\n", - "print(est_pag.nodes)\n", - "print(ctx.get_non_augmented_nodes())" + "int_learner = int_learner.learn_graph(stacked_data, ctx)" ] }, { "cell_type": "code", - "execution_count": 400, - "id": "968fb5ed-d8e9-4a6a-a471-baea43d635ed", + "execution_count": 292, + "id": "812f0cd9-0f2e-4571-8e1a-7a365681b09b", "metadata": {}, "outputs": [ { @@ -2684,122 +2758,123 @@ "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "C\n", - "\n", - "C\n", - "\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "W\n", - "\n", - "W\n", - "\n", - "\n", - "\n", - "C->W\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "X\n", - "\n", - "X\n", + "\n", + "W\n", "\n", - "\n", - "\n", - "C->X\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "B\n", + "\n", + "B\n", "\n", "\n", - "\n", + "\n", "D\n", - "\n", - "D\n", + "\n", + "D\n", "\n", - "\n", - "\n", - "C->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "B->D\n", + "\n", + "\n", + "\n", "\n", "\n", - "\n", + "\n", "A\n", - "\n", - "A\n", + "\n", + "A\n", "\n", - "\n", - "\n", - "X->A\n", - "\n", - "\n", + "\n", + "\n", + "B->A\n", + "\n", + "\n", + "\n", "\n", - "\n", + "\n", "\n", - "B\n", - "\n", - "B\n", + "C\n", + "\n", + "C\n", "\n", "\n", - "\n", + "\n", "B->C\n", - "\n", - "\n", + "\n", + "\n", "\n", - "\n", - "\n", - "B->D\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "X\n", + "\n", + "X\n", "\n", - "\n", - "\n", - "A->B\n", - "\n", - "\n", + "\n", + "\n", + "A->X\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->W\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "X->C\n", + "\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 400, + "execution_count": 292, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "est_pag = learner.graph_\n", + "est_pag = int_learner.graph_\n", "est_pag_no_fnodes = est_pag.subgraph(ctx.get_non_augmented_nodes())\n", "\n", "dot_graph = draw(\n", " est_pag_no_fnodes,\n", - " direction=\"LR\",\n", - " # name=\"SFCI\"\n", + " direction=\"TD\",\n", ")\n", "\n", - "dot_graph.render(outfile=\"./sfci_multidomain_obsandint.png\", view=False, cleanup=True)\n", + "dot_graph.render(\n", + " outfile=\"./psifci_multidomain_stacked_obsandint.png\", view=False, cleanup=True\n", + ")\n", "dot_graph" ] }, { "cell_type": "code", "execution_count": null, - "id": "b0f2d0db-a6f7-4d47-b999-21dc1d876f24", + "id": "8fd85143-ce80-4b8b-9da1-f592e9f59ede", "metadata": {}, "outputs": [], "source": [] diff --git a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py index 0031e0735..91ff49381 100644 --- a/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py +++ b/tests/unit_tests/constraint/skeleton/test_multidomain_skeleton.py @@ -72,7 +72,7 @@ def test_fnode_multidomain_skeleton_known_targets(): ) domain_indices = [1, 1] intervention_targets = [{}, {"x"}] - learner.fit( + learner.learn_graph( data, context, domain_indices=domain_indices, intervention_targets=intervention_targets ) @@ -91,78 +91,6 @@ def test_fnode_multidomain_skeleton_known_targets(): assert nx.is_isomorphic(expected_skeleton, skel_graph) -def test_number_augmented_nodes_created(): - """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`. - - However, this time, we have an S-node pointing to y. - """ - # first create the oracle - directed_edges = [ - ("x", "w"), - ("w", "y"), - ("z", "y"), - ] - bidirected_edges = [("x", "z"), ("z", "y")] - graph = pgraphs.AugmentedGraph( - incoming_directed_edges=directed_edges, incoming_bidirected_edges=bidirected_edges - ) - non_f_graph = graph.copy() - graph.add_f_node({"x"}, domain=1) - graph.add_s_node((1, 2), {"y"}) - oracle = Oracle(graph) - - # define the expected graph we will learn - edges = [ - (("F", 0), "x"), - (("F", 0), "y"), - (("S", 0), "y"), - (("S", 0), "x"), - ("x", "w"), - ("x", "z"), - ("x", "y"), - ("z", "y"), - ("w", "y"), - ] - expected_skeleton = nx.Graph(edges) - obs_expected_skeleton = expected_skeleton.copy() - obs_expected_skeleton.remove_node(("F", 0)) - - # define the learner and the context - learner = LearnMultiDomainSkeleton( - ci_estimator=oracle, cd_estimator=oracle, known_intervention_targets=True - ) - data = [dummy_sample(non_f_graph), dummy_sample(non_f_graph), dummy_sample(non_f_graph)] - context = ( - make_context(create_using=InterventionalContextBuilder).variables(data=data[0]).build() - ) - domain_indices = [1, 2, 2] - intervention_targets = [{}, {}, {"x"}] - - # test augmented nodes - ( - augmented_nodes, - symmetric_diff_map, - sigma_map, - node_domain_map, - ) = learner._create_augmented_nodes(domain_indices, intervention_targets) - assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - assert symmetric_diff_map == {("F", 0): frozenset({"x"}), ("F", 1): frozenset({"x"})} - assert sigma_map == {("F", 0): [0, 2], ("F", 1): [1, 2], ("S", 0): [0, 1]} - assert node_domain_map == {("F", 0): [1, 2], ("F", 1): [2, 2], ("S", 0): [1, 2]} - - domain_indices = [1, 2, 2, 2, 2] - intervention_targets = [{}, {}, {3}, {2}, {3}] - - # test augmented nodes - ( - augmented_nodes, - symmetric_diff_map, - sigma_map, - node_domain_map, - ) = learner._create_augmented_nodes(domain_indices, intervention_targets) - assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - 1 - - def test_fnode_multidomain_skeleton_known_targets_with_snode(): """Test learning the skeleton for Figure 3 in :footcite:`Kocaoglu2019characterization`. @@ -190,7 +118,7 @@ def test_fnode_multidomain_skeleton_known_targets_with_snode(): (("F", 0), "y"), (("F", 1), "x"), (("F", 1), "y"), - (("S", 0), "y"), + (("F", 2), "y"), ("x", "w"), ("x", "z"), ("x", "y"), @@ -212,16 +140,7 @@ def test_fnode_multidomain_skeleton_known_targets_with_snode(): domain_indices = [1, 2, 2] intervention_targets = [{}, {}, {"x"}] - # test augmented nodes - ( - augmented_nodes, - symmetric_diff_map, - sigma_map, - node_domain_map, - ) = learner._create_augmented_nodes(domain_indices, intervention_targets) - assert len(augmented_nodes) == math.comb(len(domain_indices), 2) - - learner.fit( + learner.learn_graph( data, context, domain_indices=domain_indices, intervention_targets=intervention_targets ) @@ -253,7 +172,7 @@ def test_basic_multidomain_fsnode_skeleton(): (("F", 0), "y"), (("F", 1), "x"), (("F", 1), "y"), - (("S", 0), "y"), + (("F", 2), "y"), # correspondence with the S-node ("x", "y"), ("y", "z"), ] @@ -272,7 +191,7 @@ def test_basic_multidomain_fsnode_skeleton(): # .intervention_targets([("x")]) .build() ) - learner.fit(data, context, domain_indices, intervention_targets) + learner.learn_graph(data, context, domain_indices, intervention_targets) # first check the observational skeleton skel_graph = learner.adj_graph_ @@ -283,7 +202,11 @@ def test_basic_multidomain_fsnode_skeleton(): sep_set = learner.sep_set_ # check the separating sets - assert sep_set["x"]["z"] == [{"y", ("F", 0), ("S", 0), ("F", 1)}] + # XXX: the edge is tested twice + assert sep_set["x"]["z"] == [ + {"y", ("F", 0), ("F", 2), ("F", 1)}, + {"y", ("F", 0), ("F", 2), ("F", 1)}, + ] # check the skeleton after obs data print(obs_expected_skeleton.edges()) @@ -296,6 +219,8 @@ def test_basic_multidomain_fsnode_skeleton(): assert nx.is_isomorphic(expected_skeleton, skel_graph) +# import pytest +# @pytest.mark.skip() def test_basic_multidomain_fsnode_skeleton_with_lindata(): seed = 1234 n_samples = 1000 @@ -316,7 +241,7 @@ def test_basic_multidomain_fsnode_skeleton_with_lindata(): obs_expected_skeleton = expected_skeleton.copy() # define functional relationships of the causal diagram - graph = pgraphs.functional.make_graph_linear_gaussian(graph, random_state=seed) + graph = pgraphs.functional.make_random_linear_gaussian_graph(graph, random_state=seed) datasets = [] domain_ids = [] @@ -330,6 +255,7 @@ def test_basic_multidomain_fsnode_skeleton_with_lindata(): graph.copy(), targets, random_state=seed ) + print(new_graph.nodes(data=True)) # generate dataset data = sample_from_graph(new_graph, n_samples=n_samples, random_state=seed) @@ -358,7 +284,7 @@ def test_basic_multidomain_fsnode_skeleton_with_lindata(): learner = LearnMultiDomainSkeleton(ci_estimator=FisherZCITest(), cd_estimator=KernelCDTest()) context = make_context(create_using=ContextBuilder).variables(data=datasets[0]).build() - learner.fit(datasets, context, domain_ids, intervention_sets) + learner.learn_graph(datasets, context, domain_ids, intervention_sets) # first check the observational skeleton skel_graph = learner.adj_graph_ From 6fc548bd7a330b89ae9be36c7e95e8fb3637cd20 Mon Sep 17 00:00:00 2001 From: Adam Li Date: Thu, 18 Jul 2024 17:18:41 -0400 Subject: [PATCH 61/61] Mypy errors Signed-off-by: Adam Li --- dodiscover/cd/base.py | 6 ++++-- dodiscover/cd/bregman.py | 5 ++++- dodiscover/cd/kernel_test.py | 6 ++++-- dodiscover/constraint/sfcialg.py | 6 +++++- dodiscover/constraint/skeleton.py | 19 ++++++++++++++----- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/dodiscover/cd/base.py b/dodiscover/cd/base.py index afc0bf4ad..d69f1d3dc 100644 --- a/dodiscover/cd/base.py +++ b/dodiscover/cd/base.py @@ -138,7 +138,9 @@ def _compute_propensity_scores(self, group_ind, **kwargs): return self.propensity_est_ @abstractmethod - def _statistic(self, Y: ArrayLike, group_ind: ArrayLike, X: ArrayLike = None) -> float: + def _statistic( + self, Y: ArrayLike, group_ind: ArrayLike, X: Optional[ArrayLike] = None + ) -> float: """Abstract method for computing the test statistic.""" pass @@ -146,7 +148,7 @@ def compute_null( self, e_hat: ArrayLike, Y: ArrayLike, - X: ArrayLike = None, + X: Optional[ArrayLike] = None, null_reps: int = 1000, random_state=None, ) -> ArrayLike: diff --git a/dodiscover/cd/bregman.py b/dodiscover/cd/bregman.py index acd68bbe9..9b91c9189 100644 --- a/dodiscover/cd/bregman.py +++ b/dodiscover/cd/bregman.py @@ -111,7 +111,10 @@ def test( pvalue = (1.0 + np.sum(null_dist >= conditional_div)) / (1 + self.null_reps) return conditional_div, pvalue - def _statistic(self, X: ArrayLike, Y: ArrayLike, group_ind: ArrayLike) -> float: + def _statistic(self, X: ArrayLike, Y: ArrayLike, group_ind: ArrayLike) -> float: # type: ignore + # def _statistic( + # self, Y: ArrayLike, group_ind: ArrayLike, X: Optional[ArrayLike] = None + # ) -> float: first_group = group_ind == 0 second_group = group_ind == 1 X1 = X[first_group, :] diff --git a/dodiscover/cd/kernel_test.py b/dodiscover/cd/kernel_test.py index e4a5138a6..5b11b4c31 100644 --- a/dodiscover/cd/kernel_test.py +++ b/dodiscover/cd/kernel_test.py @@ -1,4 +1,4 @@ -from typing import Set, Tuple +from typing import Optional, Set, Tuple import numpy as np import pandas as pd @@ -151,7 +151,9 @@ def test( pvalue = (1 + np.sum(null_dist >= stat)) / (1 + self.null_reps) return stat, pvalue - def _statistic(self, L: ArrayLike, group_ind: ArrayLike, K: ArrayLike = None) -> float: + def _statistic( + self, L: ArrayLike, group_ind: ArrayLike, K: Optional[ArrayLike] = None + ) -> float: n_samples = len(L) # compute L kernels diff --git a/dodiscover/constraint/sfcialg.py b/dodiscover/constraint/sfcialg.py index 2e28ce66c..20d0cfc92 100644 --- a/dodiscover/constraint/sfcialg.py +++ b/dodiscover/constraint/sfcialg.py @@ -49,7 +49,11 @@ def __init__( ) def learn_skeleton( - self, data: pd.DataFrame, context: Context, sep_set: Optional[SeparatingSet] = None, **params, + self, + data: pd.DataFrame, + context: Context, + sep_set: Optional[SeparatingSet] = None, + **params, ) -> Tuple[nx.Graph, SeparatingSet]: # now compute all possibly d-separating sets and learn a better skeleton self.skeleton_learner_ = LearnMultiDomainSkeleton( diff --git a/dodiscover/constraint/skeleton.py b/dodiscover/constraint/skeleton.py index 829c58659..aa189d75b 100644 --- a/dodiscover/constraint/skeleton.py +++ b/dodiscover/constraint/skeleton.py @@ -1612,11 +1612,12 @@ def __init__( def learn_graph( self, data: List[pd.DataFrame], - context: Context, - domain_indices: List[int], - intervention_targets: List[Optional[Set]], + context: Optional[Context] = None, + domain_indices: Optional[List[int]] = None, + intervention_targets: Optional[List[Optional[Set]]] = None, check_input: bool = True, debug: bool = False, + **params, ) -> None: """Fit data and context. @@ -1635,6 +1636,13 @@ def learn_graph( The intervention targets of each dataframe in ``data``. Is ``None`` if ``data`` is observational, or ``unknown`` if target is unknown. """ + if context is None: + # make a private Context object to store causal context used in this algorithm + # store the context + from dodiscover.context_builder import make_context + + context = make_context().build() + # ensure data is a list if isinstance(data, pd.DataFrame): data = [data] @@ -1677,8 +1685,9 @@ def learn_graph( skip_nodes = augmented_nodes # provide multi-domain context - context.augmented_nodes = augmented_nodes - context.node_domain_map = node_domain_map + # XXX: Do I need to do assignment? + # context.augmented_nodes = augmented_nodes + # context.node_domain_map = node_domain_map context.add_state_variable("node_domain_map", node_domain_map) context.add_state_variable("augmented_nodes", augmented_nodes) context.symmetric_diff_map = symmetric_diff_map