├── helpers ├── __init__.py ├── draw.py └── plots.py ├── CODEOWNERS ├── .gitpod.yml ├── requirements.txt ├── images ├── k4_7_solution_space.png └── feature_selection_titanic.png ├── .circleci └── config.yml ├── .devcontainer └── devcontainer.json ├── data ├── format_data.py └── formatted_titanic.csv ├── README.md ├── tests └── test_jn.py ├── LICENSE.md └── 01-feature-selection.ipynb /helpers/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @JoelPasvolsky 2 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | tasks: 2 | - name: Run jupyter notebook 3 | command: | 4 | jupyter notebook *.ipynb 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | dwave-ocean-sdk>=3.3.0 2 | 3 | notebook~=7.0 4 | jupyter 5 | 6 | pandas 7 | matplotlib~=3.0 8 | scipy 9 | -------------------------------------------------------------------------------- /images/k4_7_solution_space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dwave-examples/feature-selection-notebook/HEAD/images/k4_7_solution_space.png -------------------------------------------------------------------------------- /images/feature_selection_titanic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dwave-examples/feature-selection-notebook/HEAD/images/feature_selection_titanic.png -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | dwave: dwave/orb-examples@2 5 | 6 | workflows: 7 | version: 2.1 8 | tests: 9 | jobs: 10 | - dwave/test-linux 11 | - dwave/test-osx 12 | - dwave/test-win 13 | 14 | # Run weekly tests on all python versions 15 | weekly: 16 | triggers: 17 | - schedule: 18 | cron: "0 8 * * 4" 19 | filters: 20 | branches: 21 | only: 22 | - master 23 | - main 24 | jobs: 25 | - dwave/test-linux 26 | - dwave/test-osx 27 | - dwave/test-win 28 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/debian 3 | { 4 | "name": "Ocean Development Environment", 5 | 6 | // python 3.11 on debian, with latest Ocean and optional packages 7 | // source repo: https://github.com/dwavesystems/ocean-dev-docker 8 | "image": "docker.io/dwavesys/ocean-dev:latest", 9 | 10 | // install repo requirements on create and content update 11 | "updateContentCommand": "pip install -r requirements.txt", 12 | 13 | // forward/expose container services (relevant only when run locally) 14 | "forwardPorts": [ 15 | // dwave-inspector web app 16 | 18000, 18001, 18002, 18003, 18004, 17 | // OAuth connect redirect URIs 18 | 36000, 36001, 36002, 36003, 36004 19 | ], 20 | 21 | "portsAttributes": { 22 | "18000-18004": { 23 | "label": "D-Wave Problem Inspector", 24 | "requireLocalPort": true 25 | }, 26 | "36000-36004": { 27 | "label": "OAuth 2.0 authorization code redirect URI", 28 | "requireLocalPort": true 29 | } 30 | }, 31 | 32 | // Configure tool-specific properties. 33 | "customizations": { 34 | // Configure properties specific to VS Code. 35 | "vscode": { 36 | // Set *default* container specific settings.json values on container create. 37 | "settings": { 38 | "workbench": { 39 | "editorAssociations": { 40 | "*.md": "vscode.markdown.preview.editor" 41 | }, 42 | "startupEditor": "readme" 43 | } 44 | }, 45 | "extensions": [ 46 | "ms-python.python", 47 | "ms-toolsai.jupyter" 48 | ] 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /helpers/draw.py: -------------------------------------------------------------------------------- 1 | # Copyright 2021 D-Wave Systems Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import matplotlib.pyplot as plt 16 | import matplotlib.colors as colors 17 | import numpy as np 18 | import networkx as nx 19 | 20 | def plot_bqm(bqm): 21 | """Plot binary quadratic model as a labeled graph.""" 22 | g = nx.Graph() 23 | g.add_nodes_from(bqm.variables) 24 | g.add_edges_from(bqm.quadratic) 25 | 26 | plt.figure(figsize=(8, 8)) 27 | ax = plt.gca() 28 | ax.set_title(f"BQM with {len(bqm)} nodes and {len(bqm.quadratic)} edges") 29 | nx.draw_circular(g, with_labels=True, node_size=3000, node_color="y") 30 | plt.show() 31 | 32 | def plot_feature_selection(features, selected_features): 33 | fig = plt.figure(figsize=(6, 6)) 34 | ax = fig.add_axes([0.1, 0.3, .9, .7]) 35 | ax.set_title("Best Feature Selection") 36 | ax.set_ylabel('Number of Selected Features') 37 | ax.set_xticks(np.arange(len(features))) 38 | ax.set_xticklabels(features, rotation=90) 39 | ax.set_yticks(np.arange(len(features))) 40 | ax.set_yticklabels(np.arange(1, len(features)+1)) 41 | # Set a grid on minor ticks 42 | ax.set_xticks(np.arange(-0.5, len(features)), minor=True) 43 | ax.set_yticks(np.arange(-0.5, len(features)), minor=True) 44 | ax.grid(which='minor', color='black') 45 | ax.imshow(selected_features, cmap=colors.ListedColormap(['white', 'red'])) 46 | -------------------------------------------------------------------------------- /data/format_data.py: -------------------------------------------------------------------------------- 1 | # Copyright 2021 D-Wave Systems Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | # reformat the data 16 | import os 17 | import re 18 | 19 | import numpy as np 20 | import pandas as pd 21 | 22 | # make this runnable from other locations 23 | my_loc = os.path.dirname(os.path.abspath(__file__)) 24 | os.chdir(my_loc) 25 | 26 | 27 | dataset = pd.read_csv('titanic.csv') 28 | 29 | 30 | # statistics about name 31 | 32 | def get_title(name): 33 | title_search = re.search(r" ([A-Za-z]+)\.", name) 34 | # If the title exists, extract and return it. 35 | if title_search: 36 | 37 | title = title_search.group(1) 38 | 39 | # do some grouping 40 | if title in ('Miss', 'Ms', 'Mlle'): 41 | return 'miss' 42 | if title in ('Mrs', 'Mme'): 43 | return 'mrs' 44 | if title in ['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 45 | 'Rev', 'Sir', 'Jonkheer', 'Dona']: 46 | return 'rare' 47 | 48 | return title.lower() 49 | return "" 50 | 51 | 52 | dataset['title'] = dataset['name'].apply(get_title) 53 | 54 | for title in dataset['title'].unique(): 55 | dataset[title] = dataset['title'].apply(lambda t: t == title) 56 | 57 | # alone or not 58 | dataset['alone'] = (dataset["sibsp"] + dataset["parch"]).apply(lambda x: x == 0) 59 | 60 | # in a cabin or not 61 | dataset['cabin'] = dataset['cabin'].apply(lambda c: not pd.isna(c)) 62 | 63 | # sex to binary 64 | dataset['sex'] = dataset['sex'].apply(lambda s: s == 'female')*1 65 | 66 | # embarked port 67 | dataset['embarked port S'] = dataset['embarked'].apply(lambda x: x == 'S') 68 | dataset['embarked port C'] = dataset['embarked'].apply(lambda x: x == 'C') 69 | dataset['embarked port Q'] = dataset['embarked'].apply(lambda x: x == 'Q') 70 | 71 | # drop the folks with no age or fare 72 | dataset = dataset[np.isfinite(dataset['age'])] 73 | dataset = dataset[np.isfinite(dataset['fare'])] 74 | 75 | # make age discrete by grouping into 20s (rounding down) 76 | dataset['age'] = dataset['age'].apply(lambda a: 2*int(a // 20)) 77 | 78 | # make fare discrete by rounding down to the $100 79 | dataset['fare'] = dataset['fare'].apply(lambda f: int(f // 100)) 80 | 81 | # clean out old columns 82 | dataset.drop(['name', 'sibsp', 'parch', 'ticket', 'embarked', 83 | 'boat', 'body', 'home.dest', 'title'], 84 | axis=1, inplace=True) 85 | 86 | # finally write 87 | dataset.to_csv('formatted_titanic.csv', index=False) 88 | 89 | # print(dataset) 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > This repository has been archived and is no longer maintained. An updated version of the Feature Selection demo can be found [here](https://github.com/dwave-examples/feature-selection-cqm). 3 | 4 | --- 5 | 6 | [![Open in GitHub Codespaces]( 7 | https://img.shields.io/badge/Open%20in%20GitHub%20Codespaces-333?logo=github)]( 8 | https://codespaces.new/dwave-examples/feature-selection-notebook?quickstart=1) 9 | [![Linux/Mac/Windows build status]( 10 | https://circleci.com/gh/dwave-examples/feature-selection-notebook.svg?style=shield)]( 11 | https://circleci.com/gh/dwave-examples/feature-selection-notebook) 12 | 13 | # Feature Selection 14 | 15 | This notebook develops a QPU programming model for an optimization problem that 16 | selects a subset and demonstrates it using Ocean software's 17 | [dwave-hybrid](https://docs.ocean.dwavesys.com/en/stable/docs_hybrid/sdk_index.html) 18 | on an example of feature selection for machine learning. 19 | 20 | The notebook has the following sections: 21 | 22 | 1. **What is Feature Selection?** defines and explains the feature-selection problem. 23 | 2. **Feature Selection by Mutual Information** describes a particular method of 24 | feature selection that is demonstrated in this notebook. 25 | 3. **Solving Feature Selection on a Quantum Computer** shows how such optimization 26 | problems can be formulated for solution on a D-Wave quantum computer. 27 | 4. **Example Application: Predicting Survival of Titanic Passengers** demonstrates 28 | the use of 29 | [Kerberos](https://docs.ocean.dwavesys.com/en/stable/docs_hybrid/reference/reference.html), 30 | an out-of-the-box classical-quantum 31 | [hybrid](https://docs.ocean.dwavesys.com/en/stable/docs_hybrid/sdk_index.html) 32 | sampler, to select optimal features for a public-domain dataset. 33 | 34 | ## What is Feature Selection? 35 | 36 | Statistical and machine-learning models use sets of input variables ("features") 37 | to predict output variables of interest. Feature selection can be part of the model 38 | design process: selecting from a large set of potential features a highly informative 39 | subset simplifies the model and reduces dimensionality. 40 | 41 | For systems with large numbers of potential input information—for example, 42 | weather forecasting or image recognition—model complexity and required compute 43 | resources can be daunting. Feature selection can help make such models tractable. 44 | 45 | However, optimal feature selection can itself be a hard problem. This example 46 | introduces a powerful method of optimizing feature selection based on a complex 47 | probability calculation. This calculation is submitted for solution to a quantum 48 | computer. 49 | 50 | ![Example Solution](images/feature_selection_titanic.png) 51 | 52 | ## Installation 53 | 54 | You can run this example without installation in cloud-based IDEs that support 55 | the [Development Containers specification](https://containers.dev/supporting) 56 | (aka "devcontainers"). 57 | 58 | For development environments that do not support ``devcontainers``, install 59 | requirements: 60 | 61 | pip install -r requirements.txt 62 | 63 | If you are cloning the repo to your local system, working in a 64 | [virtual environment](https://docs.python.org/3/library/venv.html) is 65 | recommended. 66 | 67 | ## Usage 68 | 69 | Your development environment should be configured to 70 | [access Leap’s Solvers](https://docs.ocean.dwavesys.com/en/stable/overview/sapi.html). 71 | You can see information about supported IDEs and authorizing access to your 72 | Leap account [here](https://docs.dwavesys.com/docs/latest/doc_leap_dev_env.html). 73 | 74 | The notebook can be opened by clicking on the 75 | ``01-feature-selection.ipynb`` file in VS Code-based IDEs. 76 | 77 | To run a locally installed notebook: 78 | 79 | ```bash 80 | jupyter notebook 81 | ``` 82 | 83 | ## License 84 | 85 | See [LICENSE](LICENSE.md) file. 86 | -------------------------------------------------------------------------------- /helpers/plots.py: -------------------------------------------------------------------------------- 1 | # Copyright 2021 D-Wave Systems Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import numpy as np 16 | import pandas as pd 17 | import matplotlib.pyplot as plt 18 | from matplotlib.gridspec import GridSpec 19 | import matplotlib.colors as colors 20 | 21 | def sub_plot(size, small, big, x, subtitles, y, *y2): 22 | gs = GridSpec(big + 1, small) 23 | plt.figure(figsize=size) 24 | for i in range(small): 25 | ax = 'ax_' + str(i) 26 | ax = plt.subplot(gs[0, i]) 27 | ax.set_title(subtitles[i]) 28 | if y2: 29 | ax.plot(x, y2[0]['out'].values, 'ro') 30 | ax.plot(x, y[y.columns[i]].values, 'bv') 31 | ax.legend(["out", "model"]) 32 | else: 33 | ax.plot(x, y[y.columns[i]].values) 34 | 35 | if big: 36 | axy = plt.subplot(gs[1, :]) 37 | i += 1 38 | axy.set_title(y.columns[i]) 39 | axy.plot(x, y[y.columns[i]].values, 'r') 40 | return plt 41 | 42 | def plot_toy_signals(df): 43 | sub_plot((10, 8), 3, True, np.linspace(-np.pi, np.pi, len(df)), df.columns, df) 44 | plt.suptitle("Toy Problem: System Inputs and Output", fontsize=15) 45 | 46 | def plot_two_var_model(df1, df2): 47 | subtitles = ["Modeling %s and %s" % f0f1 for f0f1 in df1.columns] 48 | sub_plot((12, 4), 3, 0, np.linspace(-np.pi, np.pi, len(df1)), subtitles, df1, df2) 49 | plt.suptitle("Toy Problem: Output Vesus Two-Signal Model", fontsize=15) 50 | 51 | def plot_lingress(df, toy): 52 | subtitles = ["%s correlation coefficient: %.2f" % var_rval for var_rval in df.columns] 53 | sub_plot((12, 4), 3, 0, np.linspace(-np.pi, np.pi, len(df)), subtitles, df, toy) 54 | plt.suptitle("Toy Problem: Linear Regression", fontsize=15) 55 | 56 | # Warning since 0.24.2 57 | #def plot_se(data): 58 | # pd.DataFrame(data).plot(x='Bins', y=['Maximum', 'Uniform', 'Exp', 'Vals'], style = [ 'ro','b', 'g', 'y']) 59 | # plt.title("Shannon Entropy") 60 | # plt.ylabel("Entropy") 61 | def plot_se(data): 62 | df = pd.DataFrame(data) 63 | plt.figure(figsize=(5, 4)) 64 | plt.plot(df[['Bins']].values, df[['Maximum']].values, 'ro', 65 | df[['Bins']].values, df[['Uniform']].values, 'b', 66 | df[['Bins']].values, df[['Exp']].values, 'g', 67 | df[['Bins']].values, df[['Vals']].values, 'y') 68 | plt.title("Shannon Entropy") 69 | plt.xlabel("Bins") 70 | plt.ylabel("Entropy") 71 | plt.legend(['Maximum', 'Uniform', 'Exp', 'Vals']) 72 | 73 | def plot_mi(scores): 74 | if len(scores) > 5: 75 | plt.figure(figsize=(8, 5)) 76 | else: 77 | plt.figure(figsize=(4, 4)) 78 | labels, values = zip(*sorted(scores.items(), key=lambda pair: pair[1], reverse=True)) 79 | plt.bar(np.arange(len(labels)), values) 80 | plt.xticks(np.arange(len(labels)), labels, rotation=90) 81 | plt.bar(np.arange(len(labels)), values) 82 | plt.xticks(np.arange(len(labels)), labels, rotation=90) 83 | plt.title("Mutual Information") 84 | plt.ylabel("MI with Variable of Interest") 85 | 86 | def plot_solutions(result): 87 | features = [] 88 | energies = [] 89 | for sample, energy in result.data(['sample', 'energy']): 90 | energies.append(energy) 91 | features.append([key for (key, value) in sample.items() if value == 1]) 92 | plt.figure(figsize=(4, 4)) 93 | plt.bar(np.arange(len(features)), energies) 94 | plt.xticks(np.arange(len(features)), features, rotation=90) 95 | plt.title("Toy Problem: Unconstrained Solution") 96 | plt.ylabel("Energy") 97 | 98 | def plot_features(features, selected_features): 99 | fig = plt.figure(figsize=(6, 6)) 100 | ax = fig.add_axes([0.1, 0.3, .9, .7]) 101 | ax.set_title("Best Feature Selection") 102 | ax.set_ylabel('Number of Selected Features') 103 | ax.set_xticks(np.arange(len(features))) 104 | ax.set_xticklabels(features, rotation=90) 105 | ax.set_yticks(np.arange(len(features))) 106 | ax.set_yticklabels(np.arange(1, len(features)+1)) 107 | # Set a grid on minor ticks 108 | ax.set_xticks(np.arange(-0.5, len(features)), minor=True) 109 | ax.set_yticks(np.arange(-0.5, len(features)), minor=True) 110 | ax.grid(which='minor', color='black') 111 | ax.imshow(selected_features, cmap=colors.ListedColormap(['white', 'red'])) 112 | -------------------------------------------------------------------------------- /tests/test_jn.py: -------------------------------------------------------------------------------- 1 | # Copyright 2021 D-Wave Systems Inc. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | import os 16 | import nbformat 17 | from nbconvert.preprocessors import ExecutePreprocessor 18 | import unittest 19 | 20 | def run_jn(jn, timeout): 21 | 22 | open_jn = open(jn, "r", encoding='utf-8') 23 | notebook = nbformat.read(open_jn, nbformat.current_nbformat) 24 | open_jn.close() 25 | 26 | preprocessor = ExecutePreprocessor(timeout=timeout, kernel_name='python3') 27 | preprocessor.allow_errors = True 28 | preprocessor.preprocess(notebook, {'metadata': {'path': os.path.dirname(jn)}}) 29 | 30 | return notebook 31 | 32 | def collect_jn_errors(nb): 33 | 34 | errors = [] 35 | for cell in nb.cells: 36 | if 'outputs' in cell: 37 | for output in cell['outputs']: 38 | if output.output_type == 'error': 39 | errors.append(output) 40 | 41 | return errors 42 | 43 | def embedding_fail(error_list): 44 | return error_list and error_list[0].evalue == 'no embedding found' 45 | 46 | def robust_run_jn(jn, timeout, retries): 47 | 48 | run_num = 1 49 | notebook = run_jn(jn, timeout) 50 | errors = collect_jn_errors(notebook) 51 | 52 | while embedding_fail(errors) and run_num < retries: 53 | run_num += 1 54 | notebook = run_jn(jn, timeout) 55 | errors = collect_jn_errors(notebook) 56 | 57 | return notebook, errors 58 | 59 | def cell_text(nb, cell): 60 | return nb["cells"][cell]["outputs"][0]["text"] 61 | 62 | def cell_output(nb, cell, part, data_type): 63 | return nb["cells"][cell]["outputs"][part][data_type] 64 | 65 | jn_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 66 | jn_file = os.path.join(jn_dir, '01-feature-selection.ipynb') 67 | 68 | class TestJupyterNotebook(unittest.TestCase): 69 | 70 | def test_jn(self): 71 | # Smoketest 72 | MAX_EMBEDDING_RETRIES = 3 73 | MAX_RUN_TIME = 100 74 | 75 | nb, errors = robust_run_jn(jn_file, MAX_RUN_TIME, MAX_EMBEDDING_RETRIES) 76 | 77 | self.assertEqual(errors, []) 78 | 79 | # Section Illustrative Toy Problem, code cell 2 (plot_toy_signals) 80 | self.assertIn("image/png", cell_output(nb, 6, 0, "data")) 81 | 82 | # Section Illustrative Toy Problem, code cell 4 (plot_two_var_model) 83 | self.assertIn("Standard deviation", cell_text(nb, 10)) 84 | 85 | # Section Illustration of Shannon Entropy, code cell 1 (plot_se) 86 | self.assertIn("image/png", cell_output(nb, 16, 0, "data")) 87 | 88 | # Section Illustration of CSE, code cell 1 89 | self.assertIn("H(in1)", cell_text(nb, 20)) 90 | 91 | # Section Mutual Information on the Toy Problem, code cell 1 (plot_mi) 92 | self.assertIn("image/png", cell_output(nb, 24, 0, "data")) 93 | 94 | # Section Mutual Information on the Toy Problem, code cell 2 (plot_lingress) 95 | self.assertIn("image/png", cell_output(nb, 26, 0, "data")) 96 | 97 | # Section Conditional Mutual Information, code cell 2 98 | self.assertIn("I(out;in2|in1)", cell_text(nb, 31)) 99 | 100 | # Section MIQUBO on the Toy Problem, code cell 1 101 | self.assertIn("in1:", cell_text(nb, 36)) 102 | 103 | # Section MIQUBO on the Toy Problem, code cell 2 104 | self.assertRegex(cell_text(nb, 38), "\('in.', 'in.'\)") 105 | 106 | # Section MIQUBO on the Toy Problem, code cell 3 (plot_solutions) 107 | self.assertIn("image/png", cell_output(nb, 40, 0, "data")) 108 | 109 | # Section Penalizing Non-k Selections, code cell 1 (plot_solutions) 110 | self.assertIn("image/png", cell_output(nb, 43, 0, "data")) 111 | 112 | # Section Example Application: Predicting, code cell 1 (plot_mi) 113 | self.assertIn("image/png", cell_output(nb, 47, 0, "data")) 114 | 115 | # Section Exact Versus Good Solutions, code cell 1 116 | self.assertIn("image/png", cell_output(nb, 49, 1, "data")) 117 | 118 | # Section Building the MI-Based BQM, code cell 1 119 | self.assertIn("8", cell_text(nb, 53)) 120 | 121 | # Section Building the MI-Based BQM, code cell 2 (plot_bqm) 122 | self.assertIn("image/png", cell_output(nb, 55, 0, "data")) 123 | 124 | # Section Setting Up a QPU as a Solver, code cell 1 125 | self.assertIn("Maximum chain length", cell_text(nb, 57)) 126 | 127 | # Section Submit the Problem for All k Values, code cell 1 128 | self.assertIn("image/png", cell_output(nb, 61, 8, "data")) 129 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The software provided in this example, both the code lines demonstrated in the 2 | [Jupyter Notebook](01-feature-selection.ipynb) and in additional helper files, is 3 | licensed under the Apache License, Version 2.0 (see below). 4 | 5 | The [Jupyter Notebook](01-feature-selection.ipynb) itself is licensed under a 6 | [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-nc-sa/4.0) 7 | 8 | ![Creative Commons License](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png) 9 | 10 | Apache License 11 | Version 2.0, January 2004 12 | http://www.apache.org/licenses/ 13 | 14 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 15 | 16 | 1. Definitions. 17 | 18 | "License" shall mean the terms and conditions for use, reproduction, 19 | and distribution as defined by Sections 1 through 9 of this document. 20 | 21 | "Licensor" shall mean the copyright owner or entity authorized by 22 | the copyright owner that is granting the License. 23 | 24 | "Legal Entity" shall mean the union of the acting entity and all 25 | other entities that control, are controlled by, or are under common 26 | control with that entity. For the purposes of this definition, 27 | "control" means (i) the power, direct or indirect, to cause the 28 | direction or management of such entity, whether by contract or 29 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 30 | outstanding shares, or (iii) beneficial ownership of such entity. 31 | 32 | "You" (or "Your") shall mean an individual or Legal Entity 33 | exercising permissions granted by this License. 34 | 35 | "Source" form shall mean the preferred form for making modifications, 36 | including but not limited to software source code, documentation 37 | source, and configuration files. 38 | 39 | "Object" form shall mean any form resulting from mechanical 40 | transformation or translation of a Source form, including but 41 | not limited to compiled object code, generated documentation, 42 | and conversions to other media types. 43 | 44 | "Work" shall mean the work of authorship, whether in Source or 45 | Object form, made available under the License, as indicated by a 46 | copyright notice that is included in or attached to the work 47 | (an example is provided in the Appendix below). 48 | 49 | "Derivative Works" shall mean any work, whether in Source or Object 50 | form, that is based on (or derived from) the Work and for which the 51 | editorial revisions, annotations, elaborations, or other modifications 52 | represent, as a whole, an original work of authorship. For the purposes 53 | of this License, Derivative Works shall not include works that remain 54 | separable from, or merely link (or bind by name) to the interfaces of, 55 | the Work and Derivative Works thereof. 56 | 57 | "Contribution" shall mean any work of authorship, including 58 | the original version of the Work and any modifications or additions 59 | to that Work or Derivative Works thereof, that is intentionally 60 | submitted to Licensor for inclusion in the Work by the copyright owner 61 | or by an individual or Legal Entity authorized to submit on behalf of 62 | the copyright owner. For the purposes of this definition, "submitted" 63 | means any form of electronic, verbal, or written communication sent 64 | to the Licensor or its representatives, including but not limited to 65 | communication on electronic mailing lists, source code control systems, 66 | and issue tracking systems that are managed by, or on behalf of, the 67 | Licensor for the purpose of discussing and improving the Work, but 68 | excluding communication that is conspicuously marked or otherwise 69 | designated in writing by the copyright owner as "Not a Contribution." 70 | 71 | "Contributor" shall mean Licensor and any individual or Legal Entity 72 | on behalf of whom a Contribution has been received by Licensor and 73 | subsequently incorporated within the Work. 74 | 75 | 2. Grant of Copyright License. Subject to the terms and conditions of 76 | this License, each Contributor hereby grants to You a perpetual, 77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 78 | copyright license to reproduce, prepare Derivative Works of, 79 | publicly display, publicly perform, sublicense, and distribute the 80 | Work and such Derivative Works in Source or Object form. 81 | 82 | 3. Grant of Patent License. Subject to the terms and conditions of 83 | this License, each Contributor hereby grants to You a perpetual, 84 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 85 | (except as stated in this section) patent license to make, have made, 86 | use, offer to sell, sell, import, and otherwise transfer the Work, 87 | where such license applies only to those patent claims licensable 88 | by such Contributor that are necessarily infringed by their 89 | Contribution(s) alone or by combination of their Contribution(s) 90 | with the Work to which such Contribution(s) was submitted. If You 91 | institute patent litigation against any entity (including a 92 | cross-claim or counterclaim in a lawsuit) alleging that the Work 93 | or a Contribution incorporated within the Work constitutes direct 94 | or contributory patent infringement, then any patent licenses 95 | granted to You under this License for that Work shall terminate 96 | as of the date such litigation is filed. 97 | 98 | 4. Redistribution. You may reproduce and distribute copies of the 99 | Work or Derivative Works thereof in any medium, with or without 100 | modifications, and in Source or Object form, provided that You 101 | meet the following conditions: 102 | 103 | (a) You must give any other recipients of the Work or 104 | Derivative Works a copy of this License; and 105 | 106 | (b) You must cause any modified files to carry prominent notices 107 | stating that You changed the files; and 108 | 109 | (c) You must retain, in the Source form of any Derivative Works 110 | that You distribute, all copyright, patent, trademark, and 111 | attribution notices from the Source form of the Work, 112 | excluding those notices that do not pertain to any part of 113 | the Derivative Works; and 114 | 115 | (d) If the Work includes a "NOTICE" text file as part of its 116 | distribution, then any Derivative Works that You distribute must 117 | include a readable copy of the attribution notices contained 118 | within such NOTICE file, excluding those notices that do not 119 | pertain to any part of the Derivative Works, in at least one 120 | of the following places: within a NOTICE text file distributed 121 | as part of the Derivative Works; within the Source form or 122 | documentation, if provided along with the Derivative Works; or, 123 | within a display generated by the Derivative Works, if and 124 | wherever such third-party notices normally appear. The contents 125 | of the NOTICE file are for informational purposes only and 126 | do not modify the License. You may add Your own attribution 127 | notices within Derivative Works that You distribute, alongside 128 | or as an addendum to the NOTICE text from the Work, provided 129 | that such additional attribution notices cannot be construed 130 | as modifying the License. 131 | 132 | You may add Your own copyright statement to Your modifications and 133 | may provide additional or different license terms and conditions 134 | for use, reproduction, or distribution of Your modifications, or 135 | for any such Derivative Works as a whole, provided Your use, 136 | reproduction, and distribution of the Work otherwise complies with 137 | the conditions stated in this License. 138 | 139 | 5. Submission of Contributions. Unless You explicitly state otherwise, 140 | any Contribution intentionally submitted for inclusion in the Work 141 | by You to the Licensor shall be under the terms and conditions of 142 | this License, without any additional terms or conditions. 143 | Notwithstanding the above, nothing herein shall supersede or modify 144 | the terms of any separate license agreement you may have executed 145 | with Licensor regarding such Contributions. 146 | 147 | 6. Trademarks. This License does not grant permission to use the trade 148 | names, trademarks, service marks, or product names of the Licensor, 149 | except as required for reasonable and customary use in describing the 150 | origin of the Work and reproducing the content of the NOTICE file. 151 | 152 | 7. Disclaimer of Warranty. Unless required by applicable law or 153 | agreed to in writing, Licensor provides the Work (and each 154 | Contributor provides its Contributions) on an "AS IS" BASIS, 155 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 156 | implied, including, without limitation, any warranties or conditions 157 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 158 | PARTICULAR PURPOSE. You are solely responsible for determining the 159 | appropriateness of using or redistributing the Work and assume any 160 | risks associated with Your exercise of permissions under this License. 161 | 162 | 8. Limitation of Liability. In no event and under no legal theory, 163 | whether in tort (including negligence), contract, or otherwise, 164 | unless required by applicable law (such as deliberate and grossly 165 | negligent acts) or agreed to in writing, shall any Contributor be 166 | liable to You for damages, including any direct, indirect, special, 167 | incidental, or consequential damages of any character arising as a 168 | result of this License or out of the use or inability to use the 169 | Work (including but not limited to damages for loss of goodwill, 170 | work stoppage, computer failure or malfunction, or any and all 171 | other commercial damages or losses), even if such Contributor 172 | has been advised of the possibility of such damages. 173 | 174 | 9. Accepting Warranty or Additional Liability. While redistributing 175 | the Work or Derivative Works thereof, You may choose to offer, 176 | and charge a fee for, acceptance of support, warranty, indemnity, 177 | or other liability obligations and/or rights consistent with this 178 | License. However, in accepting such obligations, You may act only 179 | on Your own behalf and on Your sole responsibility, not on behalf 180 | of any other Contributor, and only if You agree to indemnify, 181 | defend, and hold each Contributor harmless for any liability 182 | incurred by, or claims asserted against, such Contributor by reason 183 | of your accepting any such warranty or additional liability. 184 | 185 | END OF TERMS AND CONDITIONS 186 | 187 | APPENDIX: How to apply the Apache License to your work. 188 | 189 | To apply the Apache License to your work, attach the following 190 | boilerplate notice, with the fields enclosed by brackets "[]" 191 | replaced with your own identifying information. (Don't include 192 | the brackets!) The text should be enclosed in the appropriate 193 | comment syntax for the file format. We also recommend that a 194 | file or class name and description of purpose be included on the 195 | same "printed page" as the copyright notice for easier 196 | identification within third-party archives. 197 | 198 | Copyright [yyyy] [name of copyright owner] 199 | 200 | Licensed under the Apache License, Version 2.0 (the "License"); 201 | you may not use this file except in compliance with the License. 202 | You may obtain a copy of the License at 203 | 204 | http://www.apache.org/licenses/LICENSE-2.0 205 | 206 | Unless required by applicable law or agreed to in writing, software 207 | distributed under the License is distributed on an "AS IS" BASIS, 208 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 209 | See the License for the specific language governing permissions and 210 | limitations under the License. 211 | -------------------------------------------------------------------------------- /01-feature-selection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "attachments": {}, 5 | "cell_type": "markdown", 6 | "metadata": {}, 7 | "source": [ 8 | "# Feature Selection with the D-Wave System\n", 9 | "This notebook demonstrates the formulation of an $n \\choose k$ optimization problem for solution on a D-Wave quantum computer. The method used in the example problem of this notebook—feature-selection for machine learning— is applicable to problems from a wide range of domains; for example financial portfolio optimization. \n", 10 | " \n", 11 | "1. [What is Feature Selection?](#What-is-Feature-Selection?) defines and explains the feature-selection problem.\n", 12 | "2. [Feature Selection by Mutual Information](#Feature-Selection-by-Mutual-Information) describes a particular method of feature selection that is demonstrated in this notebook.\n", 13 | "3. [Solving Feature Selection on a Quantum Computer](#Solving-Feature-Selection-on-a-Quantum-Computer) shows how such optimization problems can be formulated for solution on a D-Wave quantum computer. \n", 14 | "4. [Example Application: Predicting Survival of Titanic Passengers](#Example-Application:-Predicting-Survival-of-Titanic-Passengers) demonstrates the use of *Kerberos*, an out-of-the-box classical-quantum [hybrid](https://docs.ocean.dwavesys.com/en/stable/docs_hybrid/sdk_index.html) sampler, to select optimal features for a public-domain dataset. \n", 15 | "\n", 16 | "This notebook should help you understand both the techniques and [Ocean software](https://docs.ocean.dwavesys.com) tools used for solving optimization problems on D-Wave quantum computers." 17 | ] 18 | }, 19 | { 20 | "attachments": {}, 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "**New to Jupyter Notebooks?** JNs are divided into text or code cells. Pressing the **Run** button in the menu bar moves to the next cell. Code cells are marked by an \"In: \\[\\]\" to the left; when run, an asterisk displays until code completion: \"In: \\[\\*\\]\"." 25 | ] 26 | }, 27 | { 28 | "attachments": {}, 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "# What is Feature Selection?\n", 33 | "Statistical and machine-learning models use sets of input variables (\"features\") to predict output variables of interest. Feature selection can be part of the model design process: selecting from a large set of potential features a highly informative subset simplifies the model and reduces dimensionality. \n", 34 | "\n", 35 | "For example, to build a model that predicts the ripening of hothouse tomatoes, Farmer MacDonald daily records the date, noontime temperature, daylight hours, degree of cloudiness, rationed water and fertilizer, soil humidity, electric-light hours, etc. These measurements constitute a list of potential features. After a growth cycle or two, her analysis reveals some correlations between these features and crop yields:\n", 36 | "\n", 37 | "* fertilizer seems a strong predictor of fruit size\n", 38 | "* cloudiness and daylight hours seem poor predictors of growth \n", 39 | "* water rations and soil humidity seem a highly correlated pair of strong predictors of crop rot \n", 40 | "\n", 41 | "Farmer MacDonald suspects that her hothouse's use of electric light reduces dependency on seasons and sunlight. She can simplify her model by discarding date, daylight hours, and cloudiness. She can record just water ration or just soil humidity rather than both.\n", 42 | "\n", 43 | "For systems with large numbers of potential input information—for example, weather forecasting or image recognition—model complexity and required compute resources can be daunting. Feature selection can help make such models tractable. \n", 44 | "\n", 45 | "However, optimal feature selection can itself be a hard problem. This example introduces a powerful method of optimizing feature selection based on a complex probability calculation. This calculation is submitted for solution to a quantum computer. " 46 | ] 47 | }, 48 | { 49 | "attachments": {}, 50 | "cell_type": "markdown", 51 | "metadata": {}, 52 | "source": [ 53 | "## Illustrative Toy Problem\n", 54 | "This subsection illustrates the use of feature selection with a simple example: a toy system with a single output generated from three inputs. \n", 55 | "\n", 56 | "The model built to predict the system's output is even simpler: it uses just two of three possible features (inputs). You can expect it to perform better when the selected two features are more independent, assuming all three contribute somewhat commensurately to the system output (if an independent feature contributes less than the difference between two dependent ones, this might not be true). In the case of Farmer MacDonalds's tomatoes, a model using rationed water and fertilizer should perform better than one using rationed water and soil humidity. \n", 57 | "\n", 58 | "The code cell below uses the NumPy library to define three inputs, the first two of which are very similar: a sine, a noisy sine, and a linear function with added random noise. It defines an output that is a simple linear combination of these three inputs." 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": null, 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [ 67 | "import numpy as np\n", 68 | "\n", 69 | "sig_len = 100\n", 70 | "# Three inputs: in1 & in2 are similar \n", 71 | "in1 = np.sin(np.linspace(-np.pi, np.pi, sig_len)).reshape(sig_len, 1)\n", 72 | "in2 = np.sin(np.linspace(-np.pi+0.1, np.pi+0.2, sig_len)).reshape(sig_len, 1) + 0.3*np.random.rand(sig_len, 1)\n", 73 | "in3 = np.linspace(-1, 1, sig_len).reshape(sig_len,1) + 2*np.random.rand(sig_len, 1)\n", 74 | "\n", 75 | "out = 2*in1 + 3*in2 + 6*in3" 76 | ] 77 | }, 78 | { 79 | "attachments": {}, 80 | "cell_type": "markdown", 81 | "metadata": {}, 82 | "source": [ 83 | "Plot the features and variable of interest (the output). In this and other cells below, graphics code is imported from a `helpers` module. To see this code, navigate to the `helpers` folder of this repository." 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": null, 89 | "metadata": {}, 90 | "outputs": [], 91 | "source": [ 92 | "from helpers.plots import plot_toy_signals\n", 93 | "import matplotlib.pyplot as plt\n", 94 | "%matplotlib inline\n", 95 | "import pandas as pd\n", 96 | "\n", 97 | "# Store problem in a pandas DataFrame for later use\n", 98 | "toy = pd.DataFrame(np.hstack((in1, in2, in3, out)), columns=[\"in1\", \"in2\", \"in3\", \"out\"])\n", 99 | "\n", 100 | "plot_toy_signals(toy)" 101 | ] 102 | }, 103 | { 104 | "attachments": {}, 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "The `two_var_model` function in the next cell defines a linear model of two variables. " 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": null, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "def two_var_model(in_tuple, a, b):\n", 118 | " ina, inb = in_tuple\n", 119 | " return a*ina + b*inb" 120 | ] 121 | }, 122 | { 123 | "attachments": {}, 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "Use the SciPy library's `curve_fit` function to try to predict the variable of interest from two of three features. The model with less-correlated features performs better." 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": null, 133 | "metadata": {}, 134 | "outputs": [], 135 | "source": [ 136 | "from helpers.plots import plot_two_var_model \n", 137 | "import itertools\n", 138 | "from scipy.optimize import curve_fit\n", 139 | "\n", 140 | "model = []\n", 141 | "two_vars = []\n", 142 | "for f0, f1 in itertools.combinations(['in1', 'in2', 'in3'], 2): \n", 143 | " two_vars.append((f0, f1))\n", 144 | " popt, pcov = curve_fit(two_var_model, (toy[f0].values, toy[f1].values), toy['out'].values)\n", 145 | " model.append(two_var_model((toy[f0].values, toy[f1].values), popt[0], popt[1]).reshape(len(toy), 1))\n", 146 | " print(\"Standard deviation for selection of features {} and {} is {:.4f}.\".format(f0, f1, max(np.sqrt(np.diag(pcov)))))\n", 147 | "model_df = pd.DataFrame(np.hstack(model), columns=two_vars)\n", 148 | "\n", 149 | "plot_two_var_model(model_df, toy)" 150 | ] 151 | }, 152 | { 153 | "attachments": {}, 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "The following section introduces a method for optimizing feature selection that can be useful in modeling complex systems. " 158 | ] 159 | }, 160 | { 161 | "attachments": {}, 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "# Feature Selection by Mutual Information\n", 166 | "There are various methods for [feature selection](https://en.wikipedia.org/wiki/Feature_selection). If you are building a machine-learning model, for example, and have six potential features, you might naively consider training it first on each of the features by itself, then on all 15 combinations of subsets of two features, then 20 combinations of subsets of three features, and so on. However, statistical methods are more efficient. \n", 167 | "\n", 168 | "One statistical criterion that can guide this selection is mutual information (MI). The following subsections explain information and MI with some simple examples.\n", 169 | "\n", 170 | "If you already understand MI and Shannon entropy, please skip ahead to section [Solving Feature Selection on a Quantum Computer](#Solving-Feature-Selection-on-a-Quantum-Computer) (and then from the menu bar, click the *Run All Above* option). " 171 | ] 172 | }, 173 | { 174 | "attachments": {}, 175 | "cell_type": "markdown", 176 | "metadata": {}, 177 | "source": [ 178 | "## Quantifying Information: Shannon Entropy\n", 179 | "[Shannon entropy](https://en.wiktionary.org/wiki/Shannon_entropy), $H(X)$, mathematically quantifies the information in a signal:\n", 180 | "\n", 181 | "$H(X) = - \\sum_{x \\in X} p(x) \\log p(x)$\n", 182 | "\n", 183 | "where $p(x)$ represents the probability of an event's occurrence. The Shannon Entropy (SE) formula can be understood as weighing by an event's probability a value of $\\log \\frac{1}{p(x)}$ for the event, where the reciprocal is due to the minus sign. This value means that the less likely the occurrence of an event, the more information is attributed to it (intuitively, when a man bites a dog it's news). \n", 184 | "\n", 185 | "To calculate SE, the `prob` function defined below calculates probability for a dataset representing some variables (a training set in a machine learning context) by dividing it into bins as a histogram using the NumPy library's `histogramdd` function." 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": null, 191 | "metadata": {}, 192 | "outputs": [], 193 | "source": [ 194 | "def prob(dataset, max_bins=10):\n", 195 | " \"\"\"Joint probability distribution P(X) for the given data.\"\"\"\n", 196 | "\n", 197 | " # bin by the number of different values per feature\n", 198 | " num_rows, num_columns = dataset.shape\n", 199 | " bins = [min(len(np.unique(dataset[:, ci])), max_bins) for ci in range(num_columns)]\n", 200 | "\n", 201 | " freq, _ = np.histogramdd(dataset, bins)\n", 202 | " p = freq / np.sum(freq)\n", 203 | " return p\n", 204 | "\n", 205 | "def shannon_entropy(p):\n", 206 | " \"\"\"Shannon entropy H(X) is the sum of P(X)log(P(X)) for probabilty distribution P(X).\"\"\"\n", 207 | " p = p.flatten()\n", 208 | " return -sum(pi*np.log2(pi) for pi in p if pi)" 209 | ] 210 | }, 211 | { 212 | "attachments": {}, 213 | "cell_type": "markdown", 214 | "metadata": {}, 215 | "source": [ 216 | "### Illustration of Shannon Entropy\n", 217 | "For an intuitive example of measuring SE, this subsection applies the `shannon_entropy` function to three signals with defined distributions:\n", 218 | "\n", 219 | "* Uniform: this distribution maximizes values of SE because all outcomes are equally likely, meaning every outcome is equally unpredictable. $H(X) = log(N)$ for uniform distribution, where $N$ is the number of possible outcomes, ${x_1, x_2, ...x_N}$. \n", 220 | "* Exponential: the steeper the curve, the more outcomes are in the \"tail\" part (have higher probability) with lower information value. \n", 221 | "* Binomial: the stronger this signal is biased to one outcome, the more predictable its values, the lower its information value. $H(X) = -p \\log(p) - (1-p) \\log(1-p)$ for binomial distribution; for $p = 0.1$, for example, $H(X) = 0.468$. \n", 222 | "\n", 223 | "Define the three signals and plot the SE. The red dots show the maximal values of SE for different numbers of bits (Shannon developed the formula to calculate channel bandwidth, which for digital communications is measured in bits) or, as here, the bins into which the signals' possible values are divided. " 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": null, 229 | "metadata": {}, 230 | "outputs": [], 231 | "source": [ 232 | "from helpers.plots import plot_se \n", 233 | "\n", 234 | "max_bins = 10\n", 235 | "\n", 236 | "# Signals with defined distributions\n", 237 | "x_uniform = np.random.uniform(0, 1, (1000, 1))\n", 238 | "x_exp = np.exp(-np.linspace(0, 10, 1000)/2).reshape(1000, 1)\n", 239 | "x_vals = np.random.choice([0, 1],(1000, 1), p=[0.1, 0.9])\n", 240 | "\n", 241 | "data = list()\n", 242 | "for bins in range(1, max_bins):\n", 243 | " uniform_se = shannon_entropy(prob(x_uniform, bins))\n", 244 | " exp_se = shannon_entropy(prob(x_exp, bins))\n", 245 | " vals_se = shannon_entropy(prob(x_vals, bins)) \n", 246 | " data.append({'Bins': bins, 'Uniform': uniform_se, 'Maximum': np.log2(bins), 'Exp': exp_se, 'Vals': vals_se})\n", 247 | "\n", 248 | "plot_se(data)" 249 | ] 250 | }, 251 | { 252 | "attachments": {}, 253 | "cell_type": "markdown", 254 | "metadata": {}, 255 | "source": [ 256 | "### Conditional Shannon Entropy\n", 257 | "\n", 258 | "Conditional SE (CSE) measures the information in one signal, $X$, when the value of another signal, $Y$, is known: \n", 259 | "\n", 260 | "$\\begin{aligned} H(X|Y) \n", 261 | "& = H(X,Y)-H(Y) \\\\\n", 262 | "& = - \\sum_{x \\in X} p(x, y) \\log p(x, y) - H(Y) \\end{aligned}$\n", 263 | "\n", 264 | "where joint SE, $H(X,Y)$, measures the information in both signals together, with $p(x,y)$ being their joint probability. For example, knowing that it's winter reduces the information value of news that it is raining. " 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": null, 270 | "metadata": {}, 271 | "outputs": [], 272 | "source": [ 273 | "def conditional_shannon_entropy(p, *conditional_indices):\n", 274 | " \"\"\"Shannon entropy of P(X) conditional on variable j\"\"\"\n", 275 | "\n", 276 | " axis = tuple(i for i in np.arange(len(p.shape)) if i not in conditional_indices)\n", 277 | "\n", 278 | " return shannon_entropy(p) - shannon_entropy(np.sum(p, axis=axis))" 279 | ] 280 | }, 281 | { 282 | "attachments": {}, 283 | "cell_type": "markdown", 284 | "metadata": {}, 285 | "source": [ 286 | "### Illustration of CSE \n", 287 | "Apply CSE to the toy problem. Because signals `in1` and `in2` are similar, knowing the value of one provides a good estimate of the other; in contrast, the value of signal `in3` is less good for estimating the first two. " 288 | ] 289 | }, 290 | { 291 | "cell_type": "code", 292 | "execution_count": null, 293 | "metadata": {}, 294 | "outputs": [], 295 | "source": [ 296 | "print(\"H(in1) = {:.2f}\".format(shannon_entropy(prob(toy[[\"in1\"]].values))))\n", 297 | "print(\"H(in1|in3) = {:.2f}\".format(conditional_shannon_entropy(prob(toy[[\"in1\", \"in3\"]].values), 1)))\n", 298 | "print(\"H(in1|in2) = {:.2f}\".format(conditional_shannon_entropy(prob(toy[[\"in1\", \"in2\"]].values), 1)))" 299 | ] 300 | }, 301 | { 302 | "attachments": {}, 303 | "cell_type": "markdown", 304 | "metadata": {}, 305 | "source": [ 306 | "## Mutual Information\n", 307 | "[Mutual information](https://en.wikipedia.org/wiki/Mutual_information) between variables $X$ and $Y$ is defined as \n", 308 | "\n", 309 | "$I(X;Y) = \\sum_{y \\in Y} \\sum_{x \\in X} p(x, y) \\log \\frac{p(x,y)}{p(x)p(y)}$\n", 310 | "\n", 311 | "where $p(x)$ and $p(y)$ are marginal probabilities of $X$ and $Y$, and $p(x,y)$ the joint probability. Equivalently, \n", 312 | "\n", 313 | "$I(X;Y) = H(Y) - H(Y|X)$\n", 314 | "\n", 315 | "where $H(Y)$ is the SE of $Y$ and $H(Y|X)$ is the CSE of $Y$ conditional on $X$.\n", 316 | "\n", 317 | "Mutual information (MI) quantifies how much one knows about one random variable from observations of another. Intuitively, a model based on just one of a pair of features (e.g., farmer MacDonald's water rations and soil humidity) will better reproduce their combined contribution when MI between them is high. " 318 | ] 319 | }, 320 | { 321 | "cell_type": "code", 322 | "execution_count": null, 323 | "metadata": {}, 324 | "outputs": [], 325 | "source": [ 326 | "def mutual_information(p, j):\n", 327 | " \"\"\"Mutual information between all variables and variable j\"\"\"\n", 328 | " return shannon_entropy(np.sum(p, axis=j)) - conditional_shannon_entropy(p, j)" 329 | ] 330 | }, 331 | { 332 | "attachments": {}, 333 | "cell_type": "markdown", 334 | "metadata": {}, 335 | "source": [ 336 | "### Mutual Information on the Toy Problem\n", 337 | "Calculate and plot MI between the output of the toy problem and its three input signals. This measures the suitability of each on its own as a feature in a model of the system, or how much each shapes the output. " 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": null, 343 | "metadata": { 344 | "scrolled": false 345 | }, 346 | "outputs": [], 347 | "source": [ 348 | "from helpers.plots import plot_mi \n", 349 | "\n", 350 | "mi = {}\n", 351 | "for column in toy.columns:\n", 352 | " if column == 'out':\n", 353 | " continue\n", 354 | " mi[column] = mutual_information(prob(toy[['out', column]].values), 1)\n", 355 | "\n", 356 | "plot_mi(mi)" 357 | ] 358 | }, 359 | { 360 | "attachments": {}, 361 | "cell_type": "markdown", 362 | "metadata": {}, 363 | "source": [ 364 | "The plot of input and output signals in the first section might give an impression that the toy model's output is closer to the two sine signals than to `in3`, but the linear regression below confirms the MI result. " 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": null, 370 | "metadata": {}, 371 | "outputs": [], 372 | "source": [ 373 | "from scipy.stats import linregress\n", 374 | "from helpers.plots import plot_lingress \n", 375 | "\n", 376 | "model = []\n", 377 | "var_rval = []\n", 378 | "for column in toy.columns:\n", 379 | " if column == 'out':\n", 380 | " continue\n", 381 | " slope, intercept, rvalue, pvalue, stderr = linregress(toy[column].values, toy['out'].values) \n", 382 | " model.append((slope*toy[column].values + intercept).reshape(len(toy), 1))\n", 383 | " var_rval.append((column, rvalue))\n", 384 | "\n", 385 | "plot_lingress(pd.DataFrame(np.hstack(model), columns=var_rval), toy)" 386 | ] 387 | }, 388 | { 389 | "attachments": {}, 390 | "cell_type": "markdown", 391 | "metadata": {}, 392 | "source": [ 393 | "The result should in fact be expected given an output defined as $out = 2 \\times in_1 + 3 \\times in_2 + 6 \\times in_3$ with the sixfold multiplier on $in_3$ greater than the sum of multipliers on the other signals, all three of which have an amplitude of 1. " 394 | ] 395 | }, 396 | { 397 | "attachments": {}, 398 | "cell_type": "markdown", 399 | "metadata": {}, 400 | "source": [ 401 | "### Conditional Mutual Information\n", 402 | "\n", 403 | "Conditional mutual information (CMI) between a variable of interest, $X$, and a feature, $Y$, given the selection of another feature, $Z$, is given by\n", 404 | "\n", 405 | "$I(X;Y|Z) = H(X|Z)-H(X|Y,Z)$\n", 406 | "\n", 407 | "where $H(X|Z)$ is the CSE of $X$ conditional on $Z$ and $H(X|Y, Z)$ is the CSE of $X$ conditional on both $Y$ and $Z$.\n", 408 | "\n", 409 | "In this code cell, because marginalization over $j$ removes a dimension, any conditional indices pointing to subsequent dimensions are decremented by 1." 410 | ] 411 | }, 412 | { 413 | "cell_type": "code", 414 | "execution_count": null, 415 | "metadata": {}, 416 | "outputs": [], 417 | "source": [ 418 | "def conditional_mutual_information(p, j, *conditional_indices):\n", 419 | " \"\"\"Mutual information between variables X and variable Y conditional on variable Z.\"\"\"\n", 420 | "\n", 421 | " marginal_conditional_indices = [i-1 if i > j else i for i in conditional_indices]\n", 422 | "\n", 423 | " return (conditional_shannon_entropy(np.sum(p, axis=j), *marginal_conditional_indices)\n", 424 | " - conditional_shannon_entropy(p, j, *conditional_indices))" 425 | ] 426 | }, 427 | { 428 | "attachments": {}, 429 | "cell_type": "markdown", 430 | "metadata": {}, 431 | "source": [ 432 | "Apply `conditional_mutual_information` to the toy problem to find CMI between `out` and either `in2` or `in3`, conditional on `in1`." 433 | ] 434 | }, 435 | { 436 | "cell_type": "code", 437 | "execution_count": null, 438 | "metadata": {}, 439 | "outputs": [], 440 | "source": [ 441 | "print(\"I(out;in2|in1) = {:.2f}\".format(conditional_mutual_information(prob(toy[['out', 'in2', 'in1']].values), 1, 2)))\n", 442 | "print(\"I(out;in3|in1) = {:.2f}\".format(conditional_mutual_information(prob(toy[['out', 'in3', 'in1']].values), 1, 2)))" 443 | ] 444 | }, 445 | { 446 | "attachments": {}, 447 | "cell_type": "markdown", 448 | "metadata": {}, 449 | "source": [ 450 | "Given the sine signal, `in1`, if you try to predict the output from one of the remaining signals, you find that the linear function, `in3` contributes more information than the noisy sine, `in2`.\n", 451 | "\n", 452 | "Ideally, to select a model's $k$ most relevant of $n$ features, you could maximize $I({X_k}; Y)$, the MI between a set of $k$ features, $X_k$, and variable of interest, $Y$. This is a hard calculation because $n \\choose k$ grows rapidly in real-world problems." 453 | ] 454 | }, 455 | { 456 | "attachments": {}, 457 | "cell_type": "markdown", 458 | "metadata": {}, 459 | "source": [ 460 | "# Solving Feature Selection on a Quantum Computer\n", 461 | "There are different methods of approximating the hard calculation of optimally selecting $n \\choose k$ features to maximize MI. The approach followed here assumes conditional independence of features and limits CMI calculations to permutations of three features. The optimal set of features, $S$, is then approximated by:\n", 462 | "\n", 463 | "$\\arg \\max_S \\sum_{i \\in S} \\left \\{ I(X_i;Y) + \\sum_{j \\in S, j \\ne i} I(X_j;Y |X_i) \\right \\}$\n", 464 | "\n", 465 | "\n", 466 | "The left-hand component, $I(X_i;Y)$, represents MI between the variable of interest and a particular feature; maximizing selects features that best predict the variable of interest. The right-hand component, $I(X_j;Y |X_i)$, represents conditional MI between the variable of interest and a feature given the prior selection of another feature; maximizing selects features that complement information about the variable of interest rather than provide redundant information.\n", 467 | "\n", 468 | "This approximation is still a hard calculation. The following subsection demonstrates a method for formulating it for solution on the D-Wave quantum computer. The method is based on the 2014 paper, [Effective Global Approaches for Mutual Information Based Feature Selection](https://dl.acm.org/citation.cfm?id=2623611), by Nguyen, Chan, Romano, and Bailey published in the Proceedings of the 20th ACM SIGKDD international conference on knowledge discovery and data mining." 469 | ] 470 | }, 471 | { 472 | "attachments": {}, 473 | "cell_type": "markdown", 474 | "metadata": {}, 475 | "source": [ 476 | "## MIQUBO: QUBO Representation of Feature Selection\n", 477 | "D-Wave systems solve binary quadratic models (BQM)—the Ising model traditionally used in statistical mechanics and its computer-science equivalent, the quadratic unconstrained binary optimization (QUBO) problem. Given $N$ variables $x_1,...,x_N$, where each variable $x_i$ can have binary values $0$ or $1$, the system finds assignments of values that minimize,\n", 478 | " \n", 479 | "$\\sum_i^N q_ix_i + \\sum_{iTerms**           |\t**Quadratic
Terms**                  | **Formula**                                         |\t\n", 488 | "|:-|:-----------------|:---------------------|:-------------------------|:------------|\n", 489 | "| **Feature
Selection**     | Maximize           |$I(X_i;Y)$ | $I(X_j;Y \\|X_i)$ | $\\sum_{i \\in S} \\left \\{ I(X_i;Y) + \\sum_{j \\in S, j \\ne i} I(X_j;Y \\|X_i) \\right \\}$ |\n", 490 | "| **QUBO** | Minimize          | $q_ix_i$ | $q_{i,j}x_ix_j$ | $\\sum_i^N q_ix_i + \\sum_{i" 702 | ] 703 | }, 704 | { 705 | "attachments": {}, 706 | "cell_type": "markdown", 707 | "metadata": {}, 708 | "source": [ 709 | "Notice the high number of valid solutions that form a small cluster (the energy difference between the five best solutions in the depicted graph is in the fourth decimal place). The quantum computer's strength is in quickly finding diverse good solutions to hard problems, it is not best employed as a double-precision numerical calculator. Run naively on this dataset, it finds numerous good solutions but is unlikely to find the exact optimal solution.\n", 710 | "\n", 711 | "There are many techniques for reformulating problems for the D-Wave system that can improve performance on various metrics, some of which can help narrow down good solutions to closer approach an optimal solution. These are out of scope for this example. For more information, see Leap's other Jupyter Notebooks, the [D-Wave Problem-Solving Handbook](https://docs.dwavesys.com/docs/latest/doc_handbook.html), and examples in the [Ocean software documentation](https://docs.ocean.dwavesys.com/en/stable/index.html).\n", 712 | "\n", 713 | "The remainder of this section solves the problem for just the highest-scoring features." 714 | ] 715 | }, 716 | { 717 | "attachments": {}, 718 | "cell_type": "markdown", 719 | "metadata": {}, 720 | "source": [ 721 | "## Building the MI-Based BQM\n", 722 | "Select 8 features with the top MI ranking found above. " 723 | ] 724 | }, 725 | { 726 | "cell_type": "code", 727 | "execution_count": null, 728 | "metadata": {}, 729 | "outputs": [], 730 | "source": [ 731 | "keep = 8\n", 732 | "\n", 733 | "sorted_mi = sorted(mi.items(), key=lambda pair: pair[1], reverse=True)\n", 734 | "titanic = titanic[[column[0] for column in sorted_mi[0:keep]] + [\"survived\"]]\n", 735 | "features = list(set(titanic.columns).difference(('survived',)))\n", 736 | "\n", 737 | "print(\"Submitting for {} features: {}\".format(keep, features))" 738 | ] 739 | }, 740 | { 741 | "attachments": {}, 742 | "cell_type": "markdown", 743 | "metadata": {}, 744 | "source": [ 745 | "Calculate a BQM based on the problem's MI and CMI as done previously for the toy problem." 746 | ] 747 | }, 748 | { 749 | "cell_type": "code", 750 | "execution_count": null, 751 | "metadata": {}, 752 | "outputs": [], 753 | "source": [ 754 | "from helpers.draw import plot_bqm \n", 755 | "\n", 756 | "bqm = dimod.BinaryQuadraticModel.empty(dimod.BINARY)\n", 757 | "\n", 758 | "# add the features\n", 759 | "for feature in features:\n", 760 | " mi = mutual_information(prob(titanic[['survived', feature]].values), 1)\n", 761 | " bqm.add_variable(feature, -mi)\n", 762 | "\n", 763 | "for f0, f1 in itertools.combinations(features, 2):\n", 764 | " cmi_01 = conditional_mutual_information(prob(titanic[['survived', f0, f1]].values), 1, 2)\n", 765 | " cmi_10 = conditional_mutual_information(prob(titanic[['survived', f1, f0]].values), 1, 2)\n", 766 | " bqm.add_interaction(f0, f1, -cmi_01)\n", 767 | " bqm.add_interaction(f1, f0, -cmi_10)\n", 768 | "\n", 769 | "bqm.normalize() \n", 770 | "\n", 771 | "plot_bqm(bqm)" 772 | ] 773 | }, 774 | { 775 | "attachments": {}, 776 | "cell_type": "markdown", 777 | "metadata": {}, 778 | "source": [ 779 | "## Setting Up a QPU as a Solver\n", 780 | "Set up a D-Wave system as your solver in the standard way described in the Ocean documentation's [Configuring Access to D-Wave Solvers](https://docs.ocean.dwavesys.com/en/stable/overview/sapi.html). \n", 781 | "\n", 782 | "*minor-embedding*, the mapping between the problem's variables to the D-Wave QPU's numerically indexed qubits, can be handled in a variety of ways and this affects solution quality and performance. Ocean software provides tools suited for different types of problems; for example, [dwave-system](https://docs.ocean.dwavesys.com/en/stable/docs_system/sdk_index.html) [EmbeddingComposite()](https://docs.ocean.dwavesys.com/en/stable/docs_system/reference/composites.html) has a heuristic for automatic embedding. This example uses [FixedEmbeddingComposite()](https://docs.ocean.dwavesys.com/en/stable/docs_system/reference/composites.html) with the embedding found using an algorithm tuned for cliques (complete graphs).\n", 783 | "\n", 784 | "The code below creates a [*dwave-networkx*](https://docs.ocean.dwavesys.com/en/stable/docs_dnx/sdk_index.html) graph that represents the *working graph* of the QPU selected by [DWaveSampler](https://docs.ocean.dwavesys.com/en/stable/docs_system/reference/samplers.html), such as a Pegasus graph with the same sets of nodes (qubits) and edges (couplers) as the QPU. Ocean software's [*minorminer*](https://docs.ocean.dwavesys.com/en/stable/docs_minorminer/sdk_index.html) finds an embedding for the required clique size in the working graph. " 785 | ] 786 | }, 787 | { 788 | "cell_type": "code", 789 | "execution_count": null, 790 | "metadata": {}, 791 | "outputs": [], 792 | "source": [ 793 | "from dwave.system import DWaveSampler, FixedEmbeddingComposite\n", 794 | "from minorminer.busclique import find_clique_embedding\n", 795 | "\n", 796 | "qpu = DWaveSampler()\n", 797 | "\n", 798 | "qpu_working_graph = qpu.to_networkx_graph()\n", 799 | "embedding = find_clique_embedding(bqm.variables, qpu_working_graph)\n", 800 | "\n", 801 | "qpu_sampler = FixedEmbeddingComposite(qpu, embedding)\n", 802 | "\n", 803 | "print(\"Maximum chain length for minor embedding is {}.\".format(max(len(x) for x in embedding.values())))" 804 | ] 805 | }, 806 | { 807 | "attachments": {}, 808 | "cell_type": "markdown", 809 | "metadata": {}, 810 | "source": [ 811 | "This problem is small enough to be solved in its entirety on an Advantage QPU. For datasets with higher numbers of features, D-Wave Ocean's [dwave-hybrid](https://docs.ocean.dwavesys.com/en/stable/docs_hybrid/sdk_index.html) tool can be used to break the BQM into smaller pieces for serial submission to the QPU and/or parallel solution on classical resources. Here, an out-of-the-box hybrid sampler, [Kerberos](https://docs.ocean.dwavesys.com/en/stable/docs_hybrid/reference/reference.html) is used." 812 | ] 813 | }, 814 | { 815 | "cell_type": "code", 816 | "execution_count": null, 817 | "metadata": {}, 818 | "outputs": [], 819 | "source": [ 820 | "from hybrid.reference.kerberos import KerberosSampler\n", 821 | "\n", 822 | "kerberos_sampler = KerberosSampler() " 823 | ] 824 | }, 825 | { 826 | "attachments": {}, 827 | "cell_type": "markdown", 828 | "metadata": {}, 829 | "source": [ 830 | "## Submit the Problem for All k Values\n", 831 | "For all numbers of selected features, $k$, set a $n \\choose k$ penalty, submit an updated BQM for solution, and at the end plot the selected features." 832 | ] 833 | }, 834 | { 835 | "cell_type": "code", 836 | "execution_count": null, 837 | "metadata": {}, 838 | "outputs": [], 839 | "source": [ 840 | "from helpers.draw import plot_feature_selection \n", 841 | "\n", 842 | "selected_features = np.zeros((len(features), len(features)))\n", 843 | "for k in range(1, len(features) + 1):\n", 844 | " print(\"Submitting for k={}\".format(k))\n", 845 | " kbqm = dimod.generators.combinations(features, k, strength=6)\n", 846 | " kbqm.update(bqm)\n", 847 | " kbqm.normalize()\n", 848 | " \n", 849 | " best = kerberos_sampler.sample(kbqm, \n", 850 | " qpu_sampler=qpu_sampler, \n", 851 | " qpu_reads=5000, \n", 852 | " max_iter=1,\n", 853 | " qpu_params={'label': 'Notebook - Feature Selection'}\n", 854 | " ).first.sample\n", 855 | " \n", 856 | " for fi, f in enumerate(features):\n", 857 | " selected_features[k-1, fi] = best[f]\n", 858 | "\n", 859 | "plot_feature_selection(features, selected_features)" 860 | ] 861 | }, 862 | { 863 | "attachments": {}, 864 | "cell_type": "markdown", 865 | "metadata": {}, 866 | "source": [ 867 | "Copyright © 2021 D-Wave Systems, Inc\n", 868 | "\n", 869 | "The software is licensed under the Apache License, Version 2.0 (the \"License\");\n", 870 | "you may not use this file except in compliance with the License.\n", 871 | "You may obtain a copy of the License at\n", 872 | "\n", 873 | " http://www.apache.org/licenses/LICENSE-2.0\n", 874 | "\n", 875 | "Unless required by applicable law or agreed to in writing, software\n", 876 | "distributed under the License is distributed on an \"AS IS\" BASIS,\n", 877 | "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", 878 | "See the License for the specific language governing permissions and\n", 879 | "limitations under the License.\n", 880 | "\n", 881 | "\"Creative
This Jupyter Notebook is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License" 882 | ] 883 | } 884 | ], 885 | "metadata": { 886 | "kernelspec": { 887 | "display_name": "Python 3", 888 | "language": "python", 889 | "name": "python3" 890 | }, 891 | "language_info": { 892 | "codemirror_mode": { 893 | "name": "ipython", 894 | "version": 3 895 | }, 896 | "file_extension": ".py", 897 | "mimetype": "text/x-python", 898 | "name": "python", 899 | "nbconvert_exporter": "python", 900 | "pygments_lexer": "ipython3", 901 | "version": "3.6.5" 902 | }, 903 | "toc": { 904 | "base_numbering": "1", 905 | "nav_menu": {}, 906 | "number_sections": false, 907 | "sideBar": true, 908 | "skip_h1_title": false, 909 | "title_cell": "Table of Contents", 910 | "title_sidebar": "Contents", 911 | "toc_cell": false, 912 | "toc_position": {}, 913 | "toc_section_display": true, 914 | "toc_window_display": true 915 | } 916 | }, 917 | "nbformat": 4, 918 | "nbformat_minor": 2 919 | } 920 | -------------------------------------------------------------------------------- /data/formatted_titanic.csv: -------------------------------------------------------------------------------- 1 | pclass,survived,sex,age,fare,cabin,miss,master,mr,mrs,rare,alone,embarked port S,embarked port C,embarked port Q 2 | 1,1,1,2,2,True,True,False,False,False,False,True,True,False,False 3 | 1,1,0,0,1,True,False,True,False,False,False,False,True,False,False 4 | 1,0,1,0,1,True,True,False,False,False,False,False,True,False,False 5 | 1,0,0,2,1,True,False,False,True,False,False,False,True,False,False 6 | 1,0,1,2,1,True,False,False,False,True,False,False,True,False,False 7 | 1,1,0,4,0,True,False,False,True,False,False,True,True,False,False 8 | 1,1,1,6,0,True,True,False,False,False,False,False,True,False,False 9 | 1,0,0,2,0,True,False,False,True,False,False,True,True,False,False 10 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 11 | 1,0,0,6,0,False,False,False,True,False,False,True,False,True,False 12 | 1,0,0,4,2,True,False,False,False,False,True,False,False,True,False 13 | 1,1,1,0,2,True,False,False,False,True,False,False,False,True,False 14 | 1,1,1,2,0,True,False,False,False,True,False,True,False,True,False 15 | 1,1,1,2,0,False,True,False,False,False,False,True,True,False,False 16 | 1,1,0,8,0,True,False,False,True,False,False,True,True,False,False 17 | 1,0,0,2,2,True,False,False,True,False,False,False,False,True,False 18 | 1,1,1,4,2,True,False,False,False,True,False,False,False,True,False 19 | 1,1,1,2,0,True,True,False,False,False,False,True,False,True,False 20 | 1,0,0,2,0,True,False,False,True,False,False,True,False,True,False 21 | 1,1,0,2,0,True,False,False,True,False,False,False,True,False,False 22 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 23 | 1,1,0,2,0,True,False,False,True,False,False,True,False,True,False 24 | 1,1,1,4,2,False,True,False,False,False,False,True,False,True,False 25 | 1,1,1,2,2,True,True,False,False,False,False,True,True,False,False 26 | 1,0,0,2,0,False,False,False,True,False,False,True,False,True,False 27 | 1,1,0,2,0,True,False,False,True,False,False,False,False,True,False 28 | 1,1,1,0,0,True,False,False,False,True,False,False,False,True,False 29 | 1,1,1,2,1,True,True,False,False,False,False,True,True,False,False 30 | 1,1,0,2,0,True,False,False,True,False,False,True,True,False,False 31 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 32 | 1,1,0,4,0,True,False,False,True,False,False,True,False,True,False 33 | 1,1,1,2,1,True,True,False,False,False,False,True,True,False,False 34 | 1,1,1,4,0,True,True,False,False,False,False,True,True,False,False 35 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 36 | 1,1,1,4,2,False,True,False,False,False,False,True,False,True,False 37 | 1,1,1,2,0,True,True,False,False,False,False,False,True,False,False 38 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 39 | 1,0,0,4,0,True,False,False,True,False,False,True,False,True,False 40 | 1,1,1,4,0,True,False,False,False,True,False,True,False,True,False 41 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 42 | 1,1,1,6,0,True,False,False,False,True,False,True,False,True,False 43 | 1,1,1,4,1,True,True,False,False,False,False,True,False,True,False 44 | 1,0,0,4,0,True,False,False,False,False,True,True,True,False,False 45 | 1,1,0,4,0,True,False,False,True,False,False,True,True,False,False 46 | 1,1,1,4,0,False,False,False,False,True,False,True,False,True,False 47 | 1,1,0,2,5,True,False,False,True,False,False,False,False,True,False 48 | 1,1,1,4,5,True,False,False,False,True,False,False,False,True,False 49 | 1,0,0,2,0,True,False,False,True,False,False,True,True,False,False 50 | 1,0,0,2,0,False,False,False,True,False,False,True,True,False,False 51 | 1,0,0,0,0,False,False,False,True,False,False,True,True,False,False 52 | 1,1,0,0,1,True,False,True,False,False,False,False,True,False,False 53 | 1,1,1,0,1,True,True,False,False,False,False,False,True,False,False 54 | 1,1,0,2,1,True,False,False,True,False,False,False,True,False,False 55 | 1,1,1,2,1,True,False,False,False,True,False,False,True,False,False 56 | 1,0,0,4,0,False,False,False,True,False,False,True,True,False,False 57 | 1,0,0,2,0,True,False,False,True,False,False,False,True,False,False 58 | 1,1,1,6,0,True,False,False,False,True,False,False,True,False,False 59 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 60 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 61 | 1,1,0,2,0,True,False,False,True,False,False,False,True,False,False 62 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 63 | 1,1,1,2,2,True,True,False,False,False,False,True,False,True,False 64 | 1,1,1,2,0,True,True,False,False,False,False,True,True,False,False 65 | 1,1,0,4,0,True,False,False,True,False,False,True,False,True,False 66 | 1,0,0,2,1,True,False,False,True,False,False,False,False,True,False 67 | 1,1,1,2,1,True,False,False,False,True,False,False,False,True,False 68 | 1,1,1,2,1,False,True,False,False,False,False,True,True,False,False 69 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 70 | 1,1,1,2,0,True,True,False,False,False,False,False,False,True,False 71 | 1,0,0,2,0,True,False,False,True,False,False,False,False,True,False 72 | 1,1,1,6,0,True,False,False,False,True,False,False,False,True,False 73 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 74 | 1,0,0,6,0,True,False,False,False,False,True,False,True,False,False 75 | 1,1,1,2,0,True,True,False,False,False,False,False,True,False,False 76 | 1,1,1,6,0,True,False,False,False,True,False,False,True,False,False 77 | 1,0,0,2,0,True,False,False,True,False,False,False,False,True,False 78 | 1,1,1,2,0,True,False,False,False,True,False,False,False,True,False 79 | 1,1,0,4,0,True,False,False,True,False,False,True,True,False,False 80 | 1,1,0,2,0,False,False,False,True,False,False,True,True,False,False 81 | 1,1,1,2,1,False,True,False,False,False,False,True,True,False,False 82 | 1,0,0,2,0,True,False,False,True,False,False,False,True,False,False 83 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 84 | 1,1,0,2,0,True,False,False,True,False,False,False,True,False,False 85 | 1,1,1,0,0,True,False,False,False,True,False,False,True,False,False 86 | 1,1,0,4,0,True,False,False,False,False,True,False,True,False,False 87 | 1,1,0,0,0,True,False,True,False,False,False,False,True,False,False 88 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 89 | 1,0,0,4,1,True,False,False,True,False,False,False,False,True,False 90 | 1,1,1,2,2,True,False,False,False,True,False,False,False,True,False 91 | 1,1,1,4,1,True,False,False,False,True,False,False,False,True,False 92 | 1,1,1,4,0,True,False,False,False,False,True,False,False,True,False 93 | 1,1,0,4,0,True,False,False,False,False,True,False,False,True,False 94 | 1,0,0,2,0,True,False,False,True,False,False,True,False,True,False 95 | 1,1,1,2,0,True,False,False,False,True,False,False,False,True,False 96 | 1,1,1,2,2,True,True,False,False,False,False,True,False,True,False 97 | 1,1,1,4,0,True,True,False,False,False,False,False,False,True,False 98 | 1,0,1,2,0,True,True,False,False,False,False,True,False,True,False 99 | 1,1,0,2,0,True,False,False,True,False,False,True,True,False,False 100 | 1,0,0,2,0,True,False,False,True,False,False,True,False,True,False 101 | 1,1,1,2,2,True,True,False,False,False,False,False,True,False,False 102 | 1,1,1,2,2,True,True,False,False,False,False,False,True,False,False 103 | 1,1,1,2,2,True,True,False,False,False,False,False,True,False,False 104 | 1,0,0,0,2,True,False,False,True,False,False,False,True,False,False 105 | 1,0,0,6,2,True,False,False,True,False,False,False,True,False,False 106 | 1,1,1,6,2,True,False,False,False,True,False,False,True,False,False 107 | 1,1,1,2,0,True,True,False,False,False,False,True,False,True,False 108 | 1,1,0,4,1,False,False,False,False,False,True,False,True,False,False 109 | 1,1,0,4,0,True,False,False,True,False,False,False,False,True,False 110 | 1,1,1,2,0,True,True,False,False,False,False,False,False,True,False 111 | 1,1,0,6,0,True,False,False,True,False,False,False,False,True,False 112 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 113 | 1,0,0,2,0,True,False,False,True,False,False,False,True,False,False 114 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 115 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 116 | 1,1,1,2,2,True,True,False,False,False,False,True,False,True,False 117 | 1,1,1,2,0,False,True,False,False,False,False,False,False,True,False 118 | 1,1,1,4,0,False,False,False,False,True,False,False,False,True,False 119 | 1,0,0,2,0,True,False,False,True,False,False,True,False,True,False 120 | 1,1,0,4,0,True,False,False,True,False,False,False,False,True,False 121 | 1,0,0,6,0,True,False,False,True,False,False,True,False,True,False 122 | 1,1,0,4,0,True,False,False,False,False,True,True,False,True,False 123 | 1,1,1,0,0,True,True,False,False,False,False,True,True,False,False 124 | 1,0,0,2,1,True,False,False,True,False,False,False,True,False,False 125 | 1,1,1,4,1,True,False,False,False,True,False,False,True,False,False 126 | 1,1,0,2,0,True,False,False,True,False,False,False,False,True,False 127 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 128 | 1,0,0,4,0,True,False,False,True,False,False,True,False,True,False 129 | 1,1,0,2,0,True,False,False,True,False,False,False,False,True,False 130 | 1,1,1,2,0,True,False,False,False,True,False,False,False,True,False 131 | 1,1,0,4,0,True,False,False,True,False,False,False,False,True,False 132 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 133 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 134 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 135 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 136 | 1,1,0,2,0,True,False,False,True,False,False,True,False,True,False 137 | 1,1,1,2,0,True,True,False,False,False,False,True,False,True,False 138 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 139 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 140 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 141 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 142 | 1,1,1,0,0,True,True,False,False,False,False,False,False,True,False 143 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 144 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 145 | 1,0,0,4,0,False,False,False,True,False,False,False,True,False,False 146 | 1,1,1,2,0,False,False,False,False,True,False,False,True,False,False 147 | 1,1,0,2,0,False,False,False,True,False,False,True,False,True,False 148 | 1,1,0,2,0,True,False,False,True,False,False,False,True,False,False 149 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 150 | 1,1,1,2,0,True,True,False,False,False,False,True,False,False,False 151 | 1,0,1,4,0,True,True,False,False,False,False,True,False,True,False 152 | 1,1,0,4,0,True,False,False,True,False,False,True,True,False,False 153 | 1,0,0,4,0,False,False,False,True,False,False,True,True,False,False 154 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 155 | 1,0,0,2,2,True,False,False,True,False,False,True,False,True,False 156 | 1,0,0,4,0,True,False,False,True,False,False,True,False,True,False 157 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 158 | 1,1,0,4,0,True,False,False,True,False,False,False,True,False,False 159 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 160 | 1,1,1,2,2,False,True,False,False,False,False,True,True,False,False 161 | 1,1,1,4,0,True,False,False,False,False,True,True,True,False,False 162 | 1,1,1,2,1,False,True,False,False,False,False,True,False,True,False 163 | 1,1,0,2,5,True,False,False,True,False,False,True,False,True,False 164 | 1,0,0,4,0,False,False,False,True,False,False,True,True,False,False 165 | 1,1,1,4,0,False,False,False,False,True,False,True,False,True,False 166 | 1,1,1,0,0,True,True,False,False,False,False,False,True,False,False 167 | 1,1,1,4,0,True,False,False,False,True,False,False,True,False,False 168 | 1,0,0,2,0,True,False,False,True,False,False,True,True,False,False 169 | 1,1,1,2,0,True,True,False,False,False,False,True,True,False,False 170 | 1,0,0,2,0,False,False,False,True,False,False,True,True,False,False 171 | 1,1,1,4,1,True,True,False,False,False,False,True,False,True,False 172 | 1,1,1,0,2,True,True,False,False,False,False,False,True,False,False 173 | 1,0,0,2,0,True,False,False,True,False,False,True,True,False,False 174 | 1,1,1,0,0,True,True,False,False,False,False,True,True,False,False 175 | 1,0,0,0,0,True,False,False,True,False,False,False,True,False,False 176 | 1,1,1,0,0,True,False,False,False,True,False,False,True,False,False 177 | 1,1,1,2,0,True,True,False,False,False,False,True,False,True,False 178 | 1,0,0,4,0,True,False,False,True,False,False,True,False,True,False 179 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 180 | 1,1,0,2,0,True,False,False,True,False,False,True,True,False,False 181 | 1,0,0,2,0,False,False,False,True,False,False,False,False,True,False 182 | 1,0,0,6,0,True,False,False,True,False,False,True,True,False,False 183 | 1,0,0,4,0,True,False,False,False,False,True,False,False,False,True 184 | 1,1,1,2,0,True,True,False,False,False,False,False,False,False,True 185 | 1,1,1,2,0,True,False,False,False,True,False,False,False,False,True 186 | 1,1,0,2,0,True,False,False,True,False,False,False,False,True,False 187 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 188 | 1,0,0,4,0,False,False,False,True,False,False,True,True,False,False 189 | 1,0,0,2,0,True,False,False,True,False,False,False,False,True,False 190 | 1,1,1,2,1,True,True,False,False,False,False,False,False,True,False 191 | 1,1,1,2,1,True,True,False,False,False,False,False,False,True,False 192 | 1,0,0,4,1,True,False,False,True,False,False,False,False,True,False 193 | 1,1,1,0,0,True,True,False,False,False,False,False,True,False,False 194 | 1,0,0,6,0,False,False,False,True,False,False,True,True,False,False 195 | 1,1,1,2,1,True,False,False,False,False,True,True,False,True,False 196 | 1,1,1,2,0,True,True,False,False,False,False,False,False,True,False 197 | 1,0,0,6,0,True,False,False,True,False,False,False,False,True,False 198 | 1,0,0,2,0,True,False,False,True,False,False,True,False,True,False 199 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 200 | 1,0,0,2,0,True,False,False,True,False,False,True,True,False,False 201 | 1,0,0,2,0,True,False,False,True,False,False,False,True,False,False 202 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 203 | 1,0,0,0,1,True,False,False,True,False,False,False,False,True,False 204 | 1,1,1,0,1,True,False,False,False,True,False,False,False,True,False 205 | 1,1,1,2,0,True,True,False,False,False,False,True,True,False,False 206 | 1,1,0,4,0,True,False,False,False,False,True,True,True,False,False 207 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 208 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 209 | 1,0,0,2,0,False,False,False,False,False,True,True,True,False,False 210 | 1,0,0,2,1,False,False,False,True,False,False,True,False,True,False 211 | 1,1,1,4,2,True,False,False,False,True,False,False,True,False,False 212 | 1,0,0,2,0,True,False,False,True,False,False,True,True,False,False 213 | 1,1,0,4,0,False,False,False,True,False,False,True,True,False,False 214 | 1,1,1,2,0,True,True,False,False,False,False,True,False,True,False 215 | 1,0,0,4,0,False,False,False,True,False,False,True,False,True,False 216 | 1,0,0,2,0,True,False,False,True,False,False,True,False,True,False 217 | 1,1,1,2,0,True,False,False,False,False,True,True,True,False,False 218 | 1,0,0,4,0,False,False,False,True,False,False,False,False,True,False 219 | 1,1,1,4,0,False,False,False,False,True,False,False,False,True,False 220 | 1,0,0,2,0,False,False,False,True,False,False,True,True,False,False 221 | 1,1,0,0,2,True,False,True,False,False,False,False,False,True,False 222 | 1,1,1,0,2,True,True,False,False,False,False,False,False,True,False 223 | 1,1,1,2,2,True,True,False,False,False,False,False,False,True,False 224 | 1,0,0,6,2,True,False,False,True,False,False,False,False,True,False 225 | 1,1,1,4,2,True,False,False,False,True,False,False,False,True,False 226 | 1,1,1,2,0,True,True,False,False,False,False,True,False,True,False 227 | 1,1,1,2,0,True,False,False,False,True,False,False,False,True,False 228 | 1,1,1,2,0,False,True,False,False,False,False,True,False,True,False 229 | 1,1,0,2,0,False,False,False,True,False,False,True,True,False,False 230 | 1,1,1,4,1,True,True,False,False,False,False,True,True,False,False 231 | 1,1,0,2,0,True,False,False,True,False,False,True,True,False,False 232 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 233 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 234 | 1,1,0,4,0,True,False,False,False,False,True,True,False,True,False 235 | 1,1,0,2,0,True,False,False,True,False,False,True,True,False,False 236 | 1,0,0,4,0,False,False,False,True,False,False,True,True,False,False 237 | 1,0,0,4,0,True,False,False,True,False,False,True,False,True,False 238 | 1,0,0,2,0,True,False,False,True,False,False,False,True,False,False 239 | 1,1,1,0,0,True,False,False,False,True,False,False,True,False,False 240 | 1,1,0,2,0,True,False,False,True,False,False,False,True,False,False 241 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 242 | 1,1,0,0,1,True,False,True,False,False,False,False,False,True,False 243 | 1,1,0,4,1,True,False,False,True,False,False,False,False,True,False 244 | 1,1,1,4,1,True,False,False,False,True,False,False,False,True,False 245 | 1,0,0,4,1,True,False,False,True,False,False,False,False,True,False 246 | 1,1,0,2,0,True,False,False,False,False,True,True,False,True,False 247 | 1,0,0,6,0,True,False,False,True,False,False,True,True,False,False 248 | 1,1,0,4,0,True,False,False,True,False,False,False,False,True,False 249 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 250 | 1,1,1,4,0,True,False,False,False,True,False,False,False,True,False 251 | 1,1,1,6,0,True,False,False,False,True,False,True,False,False,False 252 | 1,0,0,6,2,True,False,False,True,False,False,False,True,False,False 253 | 1,0,1,6,2,True,False,False,False,True,False,False,True,False,False 254 | 1,0,0,6,0,True,False,False,True,False,False,True,True,False,False 255 | 1,1,1,4,0,True,False,False,False,True,False,True,True,False,False 256 | 1,1,1,0,0,True,True,False,False,False,False,False,True,False,False 257 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 258 | 1,1,1,2,0,True,False,False,False,True,False,False,True,False,False 259 | 1,1,0,4,0,True,False,False,True,False,False,False,True,False,False 260 | 1,0,0,4,1,True,False,False,True,False,False,False,False,True,False 261 | 1,1,0,0,1,True,False,False,True,False,False,False,False,True,False 262 | 1,1,1,2,1,True,False,False,False,True,False,False,False,True,False 263 | 1,1,0,2,0,True,False,False,True,False,False,True,False,True,False 264 | 1,0,0,4,0,False,False,False,False,False,True,True,False,True,False 265 | 1,0,0,6,0,True,False,False,True,False,False,True,True,False,False 266 | 1,0,0,4,0,True,False,False,True,False,False,True,True,False,False 267 | 1,1,1,2,5,False,True,False,False,False,False,True,False,True,False 268 | 1,0,0,6,0,True,False,False,True,False,False,False,False,True,False 269 | 1,1,1,6,0,True,False,False,False,True,False,False,False,True,False 270 | 1,0,0,6,0,False,False,False,False,False,True,True,True,False,False 271 | 1,0,0,4,0,True,False,False,True,False,False,False,True,False,False 272 | 1,0,0,2,0,True,False,False,True,False,False,False,True,False,False 273 | 1,1,1,4,1,True,False,False,False,True,False,True,False,True,False 274 | 1,1,1,2,1,True,True,False,False,False,False,False,True,False,False 275 | 1,0,0,4,1,False,False,False,True,False,False,False,True,False,False 276 | 1,1,1,4,1,False,False,False,False,True,False,False,True,False,False 277 | 1,0,0,4,2,True,False,False,True,False,False,False,False,True,False 278 | 1,0,0,2,2,True,False,False,True,False,False,False,False,True,False 279 | 1,1,1,4,2,True,False,False,False,True,False,False,False,True,False 280 | 1,1,1,2,0,False,True,False,False,False,False,True,True,False,False 281 | 1,0,0,4,0,False,False,False,True,False,False,False,False,True,False 282 | 1,1,0,2,0,False,False,False,True,False,False,False,False,True,False 283 | 1,1,1,2,1,True,True,False,False,False,False,True,False,True,False 284 | 1,0,0,6,0,False,False,False,True,False,False,True,True,False,False 285 | 1,1,1,2,1,True,True,False,False,False,False,True,False,True,False 286 | 2,0,0,2,0,False,False,False,True,False,False,False,False,True,False 287 | 2,1,1,2,0,False,False,False,False,True,False,False,False,True,False 288 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 289 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 290 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 291 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 292 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 293 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 294 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 295 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 296 | 2,1,1,2,0,True,False,False,False,True,False,True,True,False,False 297 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 298 | 2,0,0,4,0,False,False,False,False,False,True,True,True,False,False 299 | 2,1,0,2,0,False,False,False,True,False,False,False,True,False,False 300 | 2,1,1,0,0,False,False,False,False,True,False,False,True,False,False 301 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 302 | 2,1,0,0,0,True,False,True,False,False,False,False,True,False,False 303 | 2,1,1,0,0,True,True,False,False,False,False,False,True,False,False 304 | 2,1,1,0,0,True,True,False,False,False,False,False,True,False,False 305 | 2,1,1,2,0,True,False,False,False,True,False,False,True,False,False 306 | 2,1,0,2,0,True,False,False,True,False,False,True,True,False,False 307 | 2,1,1,0,0,False,True,False,False,False,False,True,True,False,False 308 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 309 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 310 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 311 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 312 | 2,1,1,2,0,True,True,False,False,False,False,True,True,False,False 313 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 314 | 2,0,0,6,0,False,False,False,True,False,False,False,True,False,False 315 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 316 | 2,1,1,2,0,False,True,False,False,False,False,False,True,False,False 317 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 318 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 319 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 320 | 2,0,0,4,0,False,False,False,False,False,True,True,True,False,False 321 | 2,1,1,4,0,False,False,False,False,True,False,True,True,False,False 322 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 323 | 2,1,0,2,0,False,False,False,True,False,False,False,True,False,False 324 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 325 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 326 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 327 | 2,0,1,4,0,False,False,False,False,True,False,False,True,False,False 328 | 2,0,0,4,0,False,False,False,False,False,True,False,True,False,False 329 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 330 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 331 | 2,0,1,2,0,False,False,False,False,True,False,False,True,False,False 332 | 2,1,1,2,0,False,True,False,False,False,False,False,True,False,False 333 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 334 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 335 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 336 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 337 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 338 | 2,1,0,2,0,False,False,False,True,False,False,True,True,False,False 339 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 340 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 341 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 342 | 2,1,1,2,0,True,False,False,False,True,False,True,True,False,False 343 | 2,0,1,2,0,False,False,False,False,True,False,True,True,False,False 344 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 345 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 346 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 347 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 348 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 349 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 350 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 351 | 2,0,0,2,0,False,False,False,True,False,False,False,False,True,False 352 | 2,1,1,2,0,False,False,False,False,True,False,False,False,True,False 353 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 354 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 355 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 356 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 357 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 358 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 359 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 360 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 361 | 2,1,1,2,0,False,True,False,False,False,False,False,False,True,False 362 | 2,1,1,2,0,False,True,False,False,False,False,False,False,True,False 363 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 364 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 365 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 366 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 367 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 368 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 369 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 370 | 2,0,1,2,0,False,True,False,False,False,False,True,True,False,False 371 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 372 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 373 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 374 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 375 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 376 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 377 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 378 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 379 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 380 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 381 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 382 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 383 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 384 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 385 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 386 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 387 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 388 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 389 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 390 | 2,0,0,2,0,False,False,False,False,False,True,False,True,False,False 391 | 2,1,0,6,0,False,False,False,True,False,False,True,True,False,False 392 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 393 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 394 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 395 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 396 | 2,1,1,2,0,False,True,False,False,False,False,False,True,False,False 397 | 2,1,1,2,0,False,True,False,False,False,False,False,True,False,False 398 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 399 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 400 | 2,1,1,4,0,False,False,False,False,True,False,True,True,False,False 401 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 402 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 403 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 404 | 2,0,1,0,0,False,True,False,False,False,False,False,True,False,False 405 | 2,1,1,2,0,False,True,False,False,False,False,False,True,False,False 406 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 407 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 408 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 409 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 410 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 411 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 412 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 413 | 2,1,0,4,0,False,False,False,True,False,False,True,True,False,False 414 | 2,0,0,6,0,False,False,False,True,False,False,False,True,False,False 415 | 2,0,1,6,0,False,False,False,False,True,False,False,True,False,False 416 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 417 | 2,1,1,0,0,False,True,False,False,False,False,True,True,False,False 418 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 419 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 420 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 421 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 422 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 423 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 424 | 2,1,1,2,0,True,False,False,False,True,False,True,False,True,False 425 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 426 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 427 | 2,0,1,2,0,False,False,False,False,True,False,True,True,False,False 428 | 2,0,0,2,0,False,False,False,True,False,False,True,False,False,True 429 | 2,1,1,4,0,False,False,False,False,True,False,True,True,False,False 430 | 2,0,0,4,0,False,False,False,False,False,True,True,False,False,True 431 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 432 | 2,0,1,2,0,False,False,False,False,True,False,False,True,False,False 433 | 2,0,0,2,0,False,False,False,False,False,True,False,True,False,False 434 | 2,1,1,0,0,False,True,False,False,False,False,False,False,True,False 435 | 2,1,1,0,0,False,True,False,False,False,False,False,False,True,False 436 | 2,0,0,2,0,False,False,False,True,False,False,False,False,True,False 437 | 2,1,1,2,0,False,False,False,False,True,False,False,False,True,False 438 | 2,1,1,0,0,False,True,False,False,False,False,True,False,True,False 439 | 2,1,1,2,0,True,False,False,False,True,False,True,True,False,False 440 | 2,0,0,2,0,True,False,False,True,False,False,True,False,True,False 441 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 442 | 2,0,0,6,0,False,False,False,True,False,False,True,False,False,True 443 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 444 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 445 | 2,0,1,4,0,True,False,False,False,True,False,True,True,False,False 446 | 2,1,0,0,0,False,False,True,False,False,False,False,False,True,False 447 | 2,0,0,2,0,False,False,False,True,False,False,False,False,True,False 448 | 2,1,1,2,0,False,False,False,False,True,False,False,False,True,False 449 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 450 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 451 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 452 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 453 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 454 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 455 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 456 | 2,1,0,0,0,False,False,False,True,False,False,True,True,False,False 457 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 458 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 459 | 2,0,0,6,0,False,False,False,True,False,False,True,True,False,False 460 | 2,0,0,2,0,False,False,False,False,False,True,True,True,False,False 461 | 2,0,0,4,0,False,False,False,False,False,True,True,True,False,False 462 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 463 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 464 | 2,0,0,6,0,False,False,False,True,False,False,True,False,False,True 465 | 2,0,0,2,0,False,False,False,True,False,False,False,False,True,False 466 | 2,1,1,0,0,False,False,False,False,True,False,False,False,True,False 467 | 2,1,0,0,0,True,False,True,False,False,False,False,True,False,False 468 | 2,1,0,0,0,True,False,True,False,False,False,False,True,False,False 469 | 2,0,0,2,0,True,False,False,True,False,False,False,True,False,False 470 | 2,0,0,2,0,True,False,False,True,False,False,True,True,False,False 471 | 2,0,0,0,0,False,False,False,True,False,False,False,True,False,False 472 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 473 | 2,1,0,2,0,True,False,False,True,False,False,True,False,True,False 474 | 2,1,1,2,0,True,False,False,False,True,False,True,True,False,False 475 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 476 | 2,1,0,2,0,False,False,False,True,False,False,True,True,False,False 477 | 2,0,0,2,0,False,False,False,False,False,True,True,True,False,False 478 | 2,1,0,2,0,False,False,False,True,False,False,True,False,True,False 479 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 480 | 2,1,1,4,0,False,False,False,False,True,False,False,True,False,False 481 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 482 | 2,0,0,4,0,False,False,False,False,False,True,True,True,False,False 483 | 2,1,1,2,0,False,True,False,False,False,False,False,True,False,False 484 | 2,1,1,0,0,False,True,False,False,False,False,True,True,False,False 485 | 2,0,0,4,0,False,False,False,True,False,False,False,True,False,False 486 | 2,1,1,2,0,False,False,False,False,True,False,True,True,False,False 487 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 488 | 2,1,0,2,0,False,False,False,True,False,False,True,False,True,False 489 | 2,0,0,2,0,False,False,False,True,False,False,True,False,True,False 490 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 491 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 492 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 493 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 494 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 495 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 496 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 497 | 2,0,0,2,0,False,False,False,True,False,False,True,False,True,False 498 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 499 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 500 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 501 | 2,1,1,4,0,False,True,False,False,False,False,True,True,False,False 502 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 503 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 504 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 505 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 506 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 507 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 508 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 509 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 510 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 511 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 512 | 2,1,1,2,0,False,True,False,False,False,False,True,False,False,True 513 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 514 | 2,1,1,4,0,False,True,False,False,False,False,True,True,False,False 515 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 516 | 2,0,0,4,0,False,False,False,True,False,False,True,False,True,False 517 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 518 | 2,0,0,0,0,True,False,False,True,False,False,True,True,False,False 519 | 2,0,0,0,0,False,False,False,True,False,False,True,True,False,False 520 | 2,1,1,4,0,False,True,False,False,False,False,True,True,False,False 521 | 2,0,0,2,0,False,False,False,True,False,False,True,True,False,False 522 | 2,1,1,2,0,False,False,False,False,True,False,True,True,False,False 523 | 2,1,1,2,0,True,True,False,False,False,False,True,True,False,False 524 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 525 | 2,0,1,2,0,False,False,False,False,True,False,False,True,False,False 526 | 2,0,0,4,0,False,False,False,True,False,False,True,True,False,False 527 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 528 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 529 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 530 | 2,1,1,2,0,False,False,False,False,True,False,True,True,False,False 531 | 2,1,1,0,0,False,True,False,False,False,False,True,True,False,False 532 | 2,1,1,4,0,False,False,False,False,True,False,True,True,False,False 533 | 2,1,1,2,0,True,True,False,False,False,False,True,True,False,False 534 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 535 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 536 | 2,1,0,0,0,False,False,True,False,False,False,False,True,False,False 537 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 538 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 539 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 540 | 2,1,1,0,0,False,True,False,False,False,False,False,True,False,False 541 | 2,0,0,2,0,False,False,False,True,False,False,False,True,False,False 542 | 2,1,1,2,0,False,False,False,False,True,False,False,True,False,False 543 | 2,0,0,6,0,False,False,False,True,False,False,True,True,False,False 544 | 2,1,0,2,0,False,False,False,True,False,False,True,True,False,False 545 | 2,1,1,2,0,False,True,False,False,False,False,True,True,False,False 546 | 2,0,1,2,0,False,True,False,False,False,False,True,True,False,False 547 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 548 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 549 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 550 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 551 | 3,1,1,0,0,False,True,False,False,False,False,True,True,False,False 552 | 3,1,0,2,0,True,False,False,True,False,False,True,True,False,False 553 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 554 | 3,1,1,0,0,False,False,False,False,True,False,True,False,True,False 555 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 556 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 557 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 558 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 559 | 3,1,1,0,0,False,False,False,False,True,False,False,True,False,False 560 | 3,1,0,2,0,False,False,False,True,False,False,True,False,True,False 561 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 562 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 563 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 564 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 565 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 566 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 567 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 568 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 569 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 570 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 571 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 572 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 573 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 574 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 575 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 576 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 577 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 578 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 579 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 580 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 581 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 582 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 583 | 3,0,1,0,0,False,False,False,False,True,False,False,True,False,False 584 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 585 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 586 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 587 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 588 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 589 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 590 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 591 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 592 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 593 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 594 | 3,1,1,4,0,False,False,False,False,True,False,True,False,True,False 595 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 596 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 597 | 3,0,1,0,0,False,True,False,False,False,False,True,False,True,False 598 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 599 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 600 | 3,1,1,0,0,False,True,False,False,False,False,True,False,True,False 601 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 602 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 603 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 604 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 605 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 606 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 607 | 3,1,1,2,0,False,False,False,False,True,False,False,False,True,False 608 | 3,1,1,0,0,False,True,False,False,False,False,True,True,False,False 609 | 3,0,0,4,0,False,False,False,True,False,False,True,False,True,False 610 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 611 | 3,1,0,2,0,False,False,False,True,False,False,True,False,True,False 612 | 3,0,1,0,0,False,True,False,False,False,False,False,False,True,False 613 | 3,0,1,4,0,False,False,False,False,True,False,False,False,True,False 614 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 615 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 616 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 617 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 618 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 619 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 620 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 621 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 622 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 623 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 624 | 3,0,0,0,0,False,False,True,False,False,False,False,False,True,False 625 | 3,0,1,0,0,False,True,False,False,False,False,False,False,True,False 626 | 3,0,0,4,0,False,False,False,True,False,False,False,False,False,True 627 | 3,0,1,2,0,False,False,False,False,True,False,False,False,False,True 628 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 629 | 3,1,1,2,0,False,True,False,False,False,False,True,False,False,True 630 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 631 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 632 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 633 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 634 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 635 | 3,0,1,0,0,False,True,False,False,False,False,True,False,False,True 636 | 3,1,0,2,0,False,False,False,True,False,False,True,False,False,True 637 | 3,0,0,0,0,False,False,False,True,False,False,True,False,False,True 638 | 3,0,1,0,0,False,True,False,False,False,False,True,False,False,True 639 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 640 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 641 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 642 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 643 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 644 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 645 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 646 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 647 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 648 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 649 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 650 | 3,1,1,0,0,False,True,False,False,False,False,True,False,False,True 651 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 652 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 653 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 654 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 655 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 656 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 657 | 3,0,0,2,0,False,False,False,True,False,False,False,False,True,False 658 | 3,0,0,0,0,False,False,False,True,False,False,False,False,True,False 659 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 660 | 3,1,0,0,0,False,False,False,True,False,False,True,True,False,False 661 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 662 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 663 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 664 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 665 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 666 | 3,1,1,2,0,False,True,False,False,False,False,True,False,False,True 667 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 668 | 3,0,0,6,0,False,False,False,True,False,False,True,False,False,True 669 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 670 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 671 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 672 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 673 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 674 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 675 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 676 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 677 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 678 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 679 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 680 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 681 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 682 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 683 | 3,1,0,4,0,False,False,False,True,False,False,True,True,False,False 684 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 685 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 686 | 3,1,1,2,0,False,True,False,False,False,False,True,False,False,True 687 | 3,1,0,2,0,False,False,False,True,False,False,True,False,False,True 688 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 689 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 690 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 691 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 692 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 693 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 694 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 695 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 696 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 697 | 3,1,0,2,0,False,False,False,True,False,False,False,True,False,False 698 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 699 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 700 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 701 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 702 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 703 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 704 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 705 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 706 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 707 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 708 | 3,1,1,0,0,False,True,False,False,False,False,True,False,False,True 709 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 710 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 711 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 712 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 713 | 3,1,0,0,0,False,False,False,True,False,False,True,True,False,False 714 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 715 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 716 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 717 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 718 | 3,0,0,6,0,False,False,False,True,False,False,True,False,False,True 719 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 720 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 721 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 722 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 723 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 724 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 725 | 3,0,0,2,0,False,False,False,True,False,False,False,False,True,False 726 | 3,0,0,0,0,False,False,False,True,False,False,False,False,True,False 727 | 3,0,0,0,0,False,False,False,True,False,False,False,False,True,False 728 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 729 | 3,1,1,0,0,False,True,False,False,False,False,True,True,False,False 730 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 731 | 3,0,0,4,0,False,False,False,True,False,False,True,False,False,True 732 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 733 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 734 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 735 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 736 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 737 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 738 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 739 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 740 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 741 | 3,1,1,0,0,False,True,False,False,False,False,True,False,False,True 742 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 743 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 744 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 745 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 746 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 747 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 748 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 749 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 750 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 751 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 752 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 753 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 754 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 755 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 756 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 757 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 758 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 759 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 760 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 761 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 762 | 3,0,1,0,0,False,True,False,False,False,False,True,False,False,True 763 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 764 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 765 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 766 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 767 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 768 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 769 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 770 | 3,1,1,4,0,False,False,False,False,True,False,False,True,False,False 771 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 772 | 3,0,0,0,0,False,False,False,True,False,False,True,False,True,False 773 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 774 | 3,0,1,0,0,False,True,False,False,False,False,True,False,False,True 775 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 776 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 777 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 778 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 779 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 780 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 781 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 782 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 783 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 784 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 785 | 3,0,0,4,0,True,False,False,True,False,False,True,True,False,False 786 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 787 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 788 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 789 | 3,1,0,2,0,False,False,False,True,False,False,True,False,True,False 790 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 791 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 792 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 793 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 794 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 795 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 796 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 797 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 798 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 799 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 800 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 801 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 802 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 803 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 804 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 805 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 806 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 807 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 808 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 809 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 810 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 811 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 812 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 813 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 814 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 815 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 816 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 817 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 818 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 819 | 3,1,0,2,0,False,False,False,True,False,False,False,False,True,False 820 | 3,0,0,0,0,False,False,False,True,False,False,True,False,True,False 821 | 3,0,0,2,0,False,False,False,True,False,False,True,False,False,True 822 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 823 | 3,0,1,2,0,False,True,False,False,False,False,False,True,False,False 824 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 825 | 3,1,1,0,0,False,True,False,False,False,False,False,True,False,False 826 | 3,1,0,2,0,False,False,False,True,False,False,False,True,False,False 827 | 3,1,1,2,0,False,False,False,False,True,False,False,True,False,False 828 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 829 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 830 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 831 | 3,1,0,2,0,True,False,False,True,False,False,True,False,True,False 832 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 833 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 834 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 835 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 836 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 837 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 838 | 3,1,0,2,0,False,False,False,True,False,False,True,False,True,False 839 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 840 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 841 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 842 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 843 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 844 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 845 | 3,0,1,4,0,False,True,False,False,False,False,True,True,False,False 846 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 847 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 848 | 3,1,0,2,0,False,False,False,True,False,False,False,True,False,False 849 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 850 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 851 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 852 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 853 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 854 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 855 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 856 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 857 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 858 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 859 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 860 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 861 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 862 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 863 | 3,1,1,0,0,False,True,False,False,False,False,True,False,False,True 864 | 3,0,1,2,0,False,True,False,False,False,False,True,False,False,True 865 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 866 | 3,0,1,0,0,False,False,False,False,True,False,False,True,False,False 867 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 868 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 869 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 870 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 871 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 872 | 3,0,0,2,0,True,False,False,True,False,False,True,True,False,False 873 | 3,1,0,0,0,True,False,True,False,False,False,False,True,False,False 874 | 3,1,1,2,0,True,False,False,False,True,False,False,True,False,False 875 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 876 | 3,1,1,2,0,False,True,False,False,False,False,True,False,False,True 877 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 878 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 879 | 3,1,1,0,0,False,True,False,False,False,False,True,False,True,False 880 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 881 | 3,1,0,2,0,False,False,False,True,False,False,False,False,True,False 882 | 3,1,1,0,0,False,False,False,False,True,False,False,False,True,False 883 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 884 | 3,1,0,0,0,False,False,True,False,False,False,False,False,True,False 885 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 886 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 887 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 888 | 3,1,1,0,0,False,True,False,False,False,False,True,True,False,False 889 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 890 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 891 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 892 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 893 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 894 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 895 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 896 | 3,0,0,6,0,False,False,False,True,False,False,True,True,False,False 897 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 898 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 899 | 3,1,0,0,0,False,False,True,False,False,False,False,True,False,False 900 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 901 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 902 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 903 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 904 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 905 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 906 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 907 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 908 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 909 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 910 | 3,1,1,2,0,False,False,False,False,True,False,True,True,False,False 911 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 912 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 913 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 914 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 915 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 916 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 917 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 918 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 919 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 920 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 921 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 922 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 923 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 924 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 925 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 926 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 927 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 928 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 929 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 930 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 931 | 3,1,0,2,0,False,False,False,True,False,False,False,True,False,False 932 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 933 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 934 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 935 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 936 | 3,0,1,0,0,False,True,False,False,False,False,True,True,False,False 937 | 3,1,0,2,0,True,False,False,True,False,False,True,True,False,False 938 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 939 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 940 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 941 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 942 | 3,0,0,0,0,False,False,True,False,False,False,False,False,False,True 943 | 3,0,0,0,0,False,False,True,False,False,False,False,False,False,True 944 | 3,0,0,0,0,False,False,True,False,False,False,False,False,False,True 945 | 3,0,0,0,0,False,False,True,False,False,False,False,False,False,True 946 | 3,0,0,0,0,False,False,True,False,False,False,False,False,False,True 947 | 3,0,1,2,0,False,False,False,False,True,False,False,False,False,True 948 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 949 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 950 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 951 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 952 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 953 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 954 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 955 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 956 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 957 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 958 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 959 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 960 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 961 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 962 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 963 | 3,1,1,0,0,True,True,False,False,False,False,False,True,False,False 964 | 3,1,1,2,0,True,False,False,False,True,False,False,True,False,False 965 | 3,1,1,0,0,True,True,False,False,False,False,False,True,False,False 966 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 967 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 968 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 969 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 970 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 971 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 972 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 973 | 3,1,1,0,0,False,True,False,False,False,False,True,True,False,False 974 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 975 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 976 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 977 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 978 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 979 | 3,0,1,4,0,False,False,False,False,True,False,False,True,False,False 980 | 3,0,0,0,0,True,False,False,True,False,False,True,True,False,False 981 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 982 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 983 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 984 | 3,1,1,2,0,False,True,False,False,False,False,True,True,False,False 985 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 986 | 3,0,0,0,0,False,False,False,True,False,False,True,True,False,False 987 | 3,0,1,2,0,False,True,False,False,False,False,True,True,False,False 988 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 989 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 990 | 3,0,1,0,0,True,True,False,False,False,False,False,True,False,False 991 | 3,0,1,2,0,True,False,False,False,True,False,False,True,False,False 992 | 3,1,0,0,0,False,False,False,True,False,False,True,True,False,False 993 | 3,1,0,4,0,False,False,False,True,False,False,True,True,False,False 994 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 995 | 3,0,0,6,0,False,False,False,True,False,False,True,True,False,False 996 | 3,1,0,0,0,False,False,False,True,False,False,True,True,False,False 997 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 998 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 999 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1000 | 3,1,0,0,0,False,False,True,False,False,False,False,False,True,False 1001 | 3,1,1,0,0,False,False,False,False,True,False,False,False,True,False 1002 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1003 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1004 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 1005 | 3,1,0,2,0,False,False,False,True,False,False,True,True,False,False 1006 | 3,1,0,0,0,False,False,True,False,False,False,False,False,True,False 1007 | 3,1,1,0,0,False,True,False,False,False,False,False,False,True,False 1008 | 3,1,1,2,0,False,False,False,False,True,False,False,False,True,False 1009 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1010 | 3,1,1,0,0,False,True,False,False,False,False,True,True,False,False 1011 | 3,1,1,6,0,False,False,False,False,True,False,True,True,False,False 1012 | 3,0,0,0,0,False,False,True,False,False,False,False,True,False,False 1013 | 3,0,0,4,0,False,False,False,True,False,False,False,True,False,False 1014 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 1015 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 1016 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 1017 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1018 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1019 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1020 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 1021 | 3,0,1,0,0,False,True,False,False,False,False,False,True,False,False 1022 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 1023 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 1024 | 3,0,1,2,0,False,False,False,False,True,False,False,True,False,False 1025 | 3,1,0,2,0,False,False,False,True,False,False,True,False,True,False 1026 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1027 | 3,0,1,0,0,False,True,False,False,False,False,True,True,False,False 1028 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1029 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1030 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1031 | 3,1,1,2,0,False,False,False,False,True,False,True,False,True,False 1032 | 3,0,0,4,0,False,False,False,True,False,False,True,True,False,False 1033 | 3,0,0,0,0,False,False,False,True,False,False,False,True,False,False 1034 | 3,0,0,2,0,False,False,False,True,False,False,False,True,False,False 1035 | 3,1,1,4,0,False,False,False,False,True,False,False,True,False,False 1036 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1037 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1038 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1039 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1040 | 3,0,0,2,0,False,False,False,True,False,False,False,False,True,False 1041 | 3,1,1,0,0,False,False,False,False,True,False,False,False,True,False 1042 | 3,0,0,4,0,False,False,False,True,False,False,True,False,True,False 1043 | 3,0,1,0,0,False,True,False,False,False,False,False,False,True,False 1044 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 1045 | 3,0,0,2,0,False,False,False,True,False,False,True,False,True,False 1046 | 3,0,0,2,0,False,False,False,True,False,False,True,True,False,False 1047 | --------------------------------------------------------------------------------