diff options
| Commit | ca4c08a327c2f173d93653b270767f9b6df8a969 (patch) | |
|---|---|---|
| Author | 2024-12-15 23:14:13 +0200 | |
| Committer | 2024-12-15 23:14:13 +0200 | |
| Files | dd811e02cd02406afc3fbac2b713d45bda846fa8 | |
| uni-projects-ca4c08a327c2f173d93653b270767f9b6df8a969.tar uni-projects-ca4c08a327c2f173d93653b270767f9b6df8a969.tar.gz uni-projects-ca4c08a327c2f173d93653b270767f9b6df8a969.zip | ||
| Parent | 98f97cb8e6350aaa468ea812d99688376651092f (diff) | |
hw(AI/5): Add initial implementation
Not everything is done, no laplace, no logic on input 1, no folds
5 files changed, 1000 insertions, 0 deletions
| -rw-r--r-- | Year 4/Artificial Intelligence/hw05/Cargo.lock | 206 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw05/Cargo.toml | 9 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw05/src/data.rs | 572 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw05/src/main.rs | 40 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw05/src/probabilities.rs | 173 |
diff --git a/Year 4/Artificial Intelligence/hw05/Cargo.lock b/Year 4/Artificial Intelligence/hw05/Cargo.lock new file mode 100644 index 0000000..fbf0a91 --- /dev/null +++ b/Year 4/Artificial Intelligence/hw05/Cargo.lock @@ -0,0 +1,206 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "erased-serde" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +dependencies = [ + "serde", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hw05" +version = "0.1.0" +dependencies = [ + "rand", + "struct_iterable", + "text_io", +] + +[[package]] +name = "libc" +version = "0.2.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "serde" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "struct_iterable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "849a064c6470a650b72e41fa6c057879b68f804d113af92900f27574828e7712" +dependencies = [ + "struct_iterable_derive", + "struct_iterable_internal", +] + +[[package]] +name = "struct_iterable_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb939ce88a43ea4e9d012f2f6b4cc789deb2db9d47bad697952a85d6978662c" +dependencies = [ + "erased-serde", + "proc-macro2", + "quote", + "struct_iterable_internal", + "syn", +] + +[[package]] +name = "struct_iterable_internal" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9426b2a0c03e6cc2ea8dbc0168dbbf943f88755e409fb91bcb8f6a268305f4a" + +[[package]] +name = "syn" +version = "2.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "text_io" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f0c8eb2ad70c12a6a69508f499b3051c924f4b1cfeae85bfad96e6bc5bba46" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Year 4/Artificial Intelligence/hw05/Cargo.toml b/Year 4/Artificial Intelligence/hw05/Cargo.toml new file mode 100644 index 0000000..15cec3d --- /dev/null +++ b/Year 4/Artificial Intelligence/hw05/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "hw05" +version = "0.1.0" +edition = "2021" + +[dependencies] +rand = "0.8.5" +struct_iterable = "0.1.1" +text_io = "0.1.12" diff --git a/Year 4/Artificial Intelligence/hw05/src/data.rs b/Year 4/Artificial Intelligence/hw05/src/data.rs new file mode 100644 index 0000000..7569b2c --- /dev/null +++ b/Year 4/Artificial Intelligence/hw05/src/data.rs @@ -0,0 +1,572 @@ +#![allow(non_upper_case_globals, non_camel_case_types)] +use rand::{thread_rng, prelude::SliceRandom}; +use struct_iterable::Iterable; +use std::ops::Index; + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub enum Party { + republican, + democrat, +} +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +pub enum Value { + y, + n, + q, +} + +use Party::{republican, democrat}; +use Value::{y, n, q}; + +#[derive(Clone, Debug, PartialEq, Iterable)] +pub struct Person { + pub party: Party, + pub handicapped_infants: Value, + pub water_project_cost_sharing: Value, + pub adoption_of_the_budget_resolution: Value, + pub physician_fee_freeze: Value, + pub el_salvador_aid: Value, + pub religious_groups_in_schools: Value, + pub anti_satellite_test_ban: Value, + pub aid_to_nicaraguan_contras: Value, + pub mx_missile: Value, + pub immigration: Value, + pub synfuels_corporation_cutback: Value, + pub education_spending: Value, + pub superfund_right_to_sue: Value, + pub crime: Value, + pub duty_free_exports: Value, + pub export_administration_act_south_africa: Value, +} + +impl Index<&'_ str> for Person { + type Output = Value; + fn index(&self, s: &str) -> &Value { + match s { + "handicapped_infants" => &self.handicapped_infants, + "water_project_cost_sharing" => &self.water_project_cost_sharing, + "adoption_of_the_budget_resolution" => &self.adoption_of_the_budget_resolution, + "physician_fee_freeze" => &self.physician_fee_freeze, + "el_salvador_aid" => &self.el_salvador_aid, + "religious_groups_in_schools" => &self.religious_groups_in_schools, + "anti_satellite_test_ban" => &self.anti_satellite_test_ban, + "aid_to_nicaraguan_contras" => &self.aid_to_nicaraguan_contras, + "mx_missile" => &self.mx_missile, + "immigration" => &self.immigration, + "synfuels_corporation_cutback" => &self.synfuels_corporation_cutback, + "education_spending" => &self.education_spending, + "superfund_right_to_sue" => &self.superfund_right_to_sue, + "crime" => &self.crime, + "duty_free_exports" => &self.duty_free_exports, + "export_administration_act_south_africa" => &self.export_administration_act_south_africa, + _ => panic!("unknown field: {}", s), + } + } +} + +impl Person { + const fn new( + party: Party, + handicapped_infants: Value, + water_project_cost_sharing: Value, + adoption_of_the_budget_resolution: Value, + physician_fee_freeze: Value, + el_salvador_aid: Value, + religious_groups_in_schools: Value, + anti_satellite_test_ban: Value, + aid_to_nicaraguan_contras: Value, + mx_missile: Value, + immigration: Value, + synfuels_corporation_cutback: Value, + education_spending: Value, + superfund_right_to_sue: Value, + crime: Value, + duty_free_exports: Value, + export_administration_act_south_africa: Value, + ) -> Person { + Person { + party, + handicapped_infants, + water_project_cost_sharing, + adoption_of_the_budget_resolution, + physician_fee_freeze, + el_salvador_aid, + religious_groups_in_schools, + anti_satellite_test_ban, + aid_to_nicaraguan_contras, + mx_missile, + immigration, + synfuels_corporation_cutback, + education_spending, + superfund_right_to_sue, + crime, + duty_free_exports, + export_administration_act_south_africa, + } + } +} + +/// Returns (training, testing) +pub fn get_data() -> (Vec<Person>, Vec<Person>) { + let mut vec = dataset.to_vec(); + assert_eq!((vec.len() as f64 * 0.8) as usize - 1, 347); + // We want 61.37931% to be democrats and the other to be republican + // We use 80% for training and 20% for testing + // Meaning, our training data is 348 elements, + // where 214 are democrats and 134 are republicans + vec.rotate_right(134); + let (a, b) = vec.split_at(348); + + assert_eq!(a.len(), 348); + assert_eq!( + a.into_iter() + .fold(0, |acc, person| if person.party == Party::republican { + acc + 1 + } else { + acc + }), + 134); + + let (mut a, mut b) = (a.to_vec(), b.to_vec()); + a.shuffle(&mut thread_rng()); + b.shuffle(&mut thread_rng()); + (a, b) +} + +static dataset: [Person; 435] = [ + Person::new(democrat,n,n,n,n,n,n,y,y,y,y,n,y,y,y,y,y), + Person::new(democrat,n,n,n,n,n,y,n,y,y,n,y,y,y,y,y,n), + Person::new(democrat,n,n,n,n,n,y,y,y,y,n,y,n,n,y,y,y), + Person::new(democrat,n,n,n,n,y,y,n,n,n,y,y,y,y,y,n,y), + Person::new(democrat,n,n,n,n,y,y,y,n,n,n,n,y,y,y,n,y), + Person::new(democrat,n,n,n,y,y,y,n,n,n,n,y,y,y,y,n,n), + Person::new(democrat,n,n,q,n,n,y,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,n,n,q,n,y,y,n,n,n,n,y,y,y,y,n,y), + Person::new(democrat,n,n,y,n,n,n,y,y,n,y,y,n,n,n,y,q), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,n,n,y,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,n,q,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,n,n,n,y,n,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,n,n,y,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,y,n,q,n,y,q), + Person::new(democrat,n,n,y,n,n,n,y,y,y,y,y,q,n,n,y,y), + Person::new(democrat,n,n,y,n,n,y,n,y,y,y,n,n,n,y,n,y), + Person::new(democrat,n,n,y,n,n,y,q,y,q,y,y,y,n,y,y,q), + Person::new(democrat,n,n,y,n,n,y,y,q,y,y,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,y,y,y,n,n,y,n,n,y,q,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,n,y,n,n,y,y,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,n,y,y,n,y,y,q), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,n,n,n,y,n,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,n,n,n,y,q,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,n,n,y,n,n,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,n,y,n,n,n,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,n,y,n,y,y,q), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,y,n,n,n,q,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,n,y,n,n,y,y,y,y,y,y,n,y,y,n,y), + Person::new(democrat,n,n,y,n,y,n,y,y,y,n,n,n,n,y,q,y), + Person::new(democrat,n,n,y,n,y,y,n,n,n,n,q,n,y,y,n,n), + Person::new(democrat,n,n,y,n,y,y,n,n,n,y,y,y,y,y,n,y), + Person::new(democrat,n,n,y,y,y,y,n,n,y,n,n,n,y,y,y,q), + Person::new(democrat,n,q,n,n,n,y,y,y,y,y,n,n,n,y,n,q), + Person::new(democrat,n,q,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,n,q,y,n,n,n,y,y,y,y,y,n,n,y,y,y), + Person::new(democrat,n,q,y,n,n,y,n,y,n,y,y,n,n,n,y,y), + Person::new(democrat,n,q,y,n,n,y,y,y,n,y,n,n,n,n,y,q), + Person::new(democrat,n,q,y,n,n,y,y,y,y,y,n,n,n,y,y,y), + Person::new(democrat,n,q,y,n,q,q,y,y,y,y,q,q,n,n,y,y), + Person::new(democrat,n,q,y,n,y,y,n,y,n,n,y,n,n,n,n,q), + Person::new(democrat,n,q,y,q,n,y,y,y,y,y,y,n,q,q,y,y), + Person::new(democrat,n,y,n,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,y,n,n,n,y,y,n,y,n,y,n,n,n,y,y), + Person::new(democrat,n,y,n,n,y,y,n,n,n,n,n,y,y,y,y,y), + Person::new(democrat,n,y,n,n,y,y,n,n,n,y,y,n,y,y,n,n), + Person::new(democrat,n,y,n,n,y,y,n,n,q,n,n,y,y,y,n,y), + Person::new(democrat,n,y,n,y,n,y,y,y,y,n,y,n,y,n,y,q), + Person::new(democrat,n,y,n,y,y,y,n,n,n,n,n,n,q,y,y,y), + Person::new(democrat,n,y,n,y,y,y,n,n,n,n,y,y,n,y,n,n), + Person::new(democrat,n,y,y,n,n,n,n,y,y,n,y,n,n,y,y,y), + Person::new(democrat,n,y,y,n,n,n,n,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,y,y,n,n,n,y,y,n,n,y,n,n,n,y,q), + Person::new(democrat,n,y,y,n,n,n,y,y,q,y,n,n,y,n,y,y), + Person::new(democrat,n,y,y,n,n,n,y,y,y,n,n,n,y,n,q,q), + Person::new(democrat,n,y,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,n,y,y,n,n,n,y,y,y,y,n,n,q,n,y,y), + Person::new(democrat,n,y,y,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,n,y,y,n,n,q,y,y,y,y,y,n,q,y,y,y), + Person::new(democrat,n,y,y,n,n,y,n,y,y,n,y,n,q,q,q,q), + Person::new(democrat,n,y,y,n,n,y,n,y,y,n,y,n,y,n,y,y), + Person::new(democrat,n,y,y,n,n,y,n,y,y,y,n,n,y,y,n,y), + Person::new(democrat,n,y,y,n,n,y,n,y,y,y,y,n,y,n,y,y), + Person::new(democrat,n,y,y,n,n,y,y,y,n,y,n,n,n,n,y,y), + Person::new(democrat,n,y,y,n,n,y,y,y,n,y,y,n,y,y,n,q), + Person::new(democrat,n,y,y,n,n,y,y,y,q,n,y,y,n,n,y,y), + Person::new(democrat,n,y,y,n,n,y,y,y,q,y,n,n,n,n,n,y), + Person::new(democrat,n,y,y,n,n,y,y,y,y,n,q,n,n,n,n,y), + Person::new(democrat,n,y,y,n,n,y,y,y,y,n,y,n,n,y,y,y), + Person::new(democrat,n,y,y,n,n,y,y,y,y,y,n,n,y,y,y,y), + Person::new(democrat,n,y,y,n,n,y,y,y,y,y,n,q,n,n,y,y), + Person::new(democrat,n,y,y,n,n,y,y,y,y,y,y,n,y,n,y,q), + Person::new(democrat,n,y,y,n,q,y,n,n,n,n,y,n,y,n,n,y), + Person::new(democrat,n,y,y,n,q,y,y,y,y,y,y,n,n,q,n,q), + Person::new(democrat,n,y,y,n,y,q,y,n,n,y,y,n,y,n,y,y), + Person::new(democrat,n,y,y,n,y,y,n,n,n,n,n,n,y,y,y,y), + Person::new(democrat,n,y,y,n,y,y,n,n,n,n,y,n,n,n,y,q), + Person::new(democrat,n,y,y,n,y,y,n,n,n,y,y,y,y,y,n,q), + Person::new(democrat,n,y,y,n,y,y,n,y,n,n,n,n,n,n,n,y), + Person::new(democrat,n,y,y,n,y,y,y,n,n,n,y,y,y,y,n,y), + Person::new(democrat,n,y,y,n,y,y,y,n,y,y,y,n,y,y,n,y), + Person::new(democrat,n,y,y,n,y,y,y,y,n,n,y,n,y,n,y,y), + Person::new(democrat,n,y,y,q,y,y,n,y,n,y,q,n,y,y,q,y), + Person::new(democrat,n,y,y,y,y,y,n,n,n,n,n,y,y,y,n,q), + Person::new(democrat,n,y,y,y,y,y,n,n,n,n,y,y,q,y,n,n), + Person::new(democrat,n,y,y,y,y,y,n,n,n,y,y,n,y,y,n,n), + Person::new(democrat,n,y,y,y,y,y,n,n,n,y,y,y,y,y,y,q), + Person::new(democrat,n,y,y,y,y,y,n,y,y,y,y,y,y,y,n,y), + Person::new(democrat,q,n,y,n,n,n,y,y,y,y,y,q,n,n,y,q), + Person::new(democrat,q,q,n,n,q,y,q,n,n,n,y,y,n,y,n,q), + Person::new(democrat,q,q,q,n,n,n,y,y,y,y,n,n,y,n,y,y), + Person::new(democrat,q,q,q,q,n,y,y,y,y,y,q,n,y,y,n,q), + Person::new(democrat,q,q,q,q,q,q,q,q,y,q,q,q,q,q,q,q), + Person::new(democrat,q,q,y,n,n,n,y,y,q,n,q,q,q,q,q,q), + Person::new(democrat,q,q,y,n,n,n,y,y,y,q,q,n,n,n,q,q), + Person::new(democrat,q,y,n,n,n,n,y,y,y,y,y,n,n,y,y,y), + Person::new(democrat,q,y,y,q,y,y,n,n,n,n,y,n,y,y,n,n), + Person::new(democrat,y,n,n,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,n,n,n,y,y,y,y,y,n,n,n,y,y,y), + Person::new(democrat,y,n,n,n,y,y,n,n,n,n,y,y,n,y,n,y), + Person::new(democrat,y,n,n,n,y,y,q,n,q,n,n,n,n,y,q,n), + Person::new(democrat,y,n,n,n,y,y,y,n,n,y,y,n,n,y,n,y), + Person::new(democrat,y,n,y,n,n,n,n,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,q,y,y,q,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,n,y,y,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,n,y,y,n,n,n,n,q), + Person::new(democrat,y,n,y,n,n,n,y,y,q,n,n,n,n,n,n,q), + Person::new(democrat,y,n,y,n,n,n,y,y,q,n,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,q,y,y,y,n,y,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,q,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,n,n,y,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,q,y,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,y,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,n,y,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,n,q,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,q,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,n,y,n,n,y,q), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,y,n,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,y,n,n,y,y,y), + Person::new(democrat,y,n,y,n,n,n,y,y,y,y,y,n,y,n,y,y), + Person::new(democrat,y,n,y,n,n,q,y,y,y,n,q,q,n,q,q,q), + Person::new(democrat,y,n,y,n,n,y,n,y,q,y,y,y,q,n,n,y), + Person::new(democrat,y,n,y,n,n,y,y,y,n,n,n,y,y,n,n,y), + Person::new(democrat,y,n,y,n,n,y,y,y,n,y,y,n,y,y,y,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,n,n,n,n,y,n,q), + Person::new(democrat,y,n,y,n,n,y,y,y,y,n,n,y,q,y,y,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,y,n,n,y,n,n,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,y,n,q,n,y,n,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,y,n,y,n,y,n,q), + Person::new(democrat,y,n,y,n,n,y,y,y,y,y,y,n,n,n,n,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,y,y,n,n,n,y,y), + Person::new(democrat,y,n,y,n,n,y,y,y,y,y,y,n,n,y,y,y), + Person::new(democrat,y,n,y,n,q,n,y,y,y,y,n,y,n,q,y,y), + Person::new(democrat,y,n,y,n,q,y,q,y,y,y,n,n,y,y,n,y), + Person::new(democrat,y,n,y,n,y,y,n,n,n,n,n,n,n,n,n,y), + Person::new(democrat,y,n,y,n,y,y,n,n,y,y,n,n,y,y,n,y), + Person::new(democrat,y,n,y,n,y,y,n,q,q,n,y,q,q,q,y,y), + Person::new(democrat,y,n,y,n,y,y,y,n,n,n,y,n,n,y,n,y), + Person::new(democrat,y,n,y,n,y,y,y,n,q,n,y,n,y,y,y,q), + Person::new(democrat,y,n,y,n,y,y,y,n,y,y,n,n,y,y,n,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,y,n,y,y), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,n,y,n,y,y), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,n,q,n,n,y,y), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,q,n,n,n,y,q), + Person::new(democrat,y,q,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,q,y,n,n,y,y,y,y,y,n,n,n,n,y,q), + Person::new(democrat,y,q,y,n,q,q,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,y,n,n,n,n,n,y,y,n,y,n,n,n,y,n), + Person::new(democrat,y,y,n,n,n,n,y,y,q,n,y,n,n,n,y,q), + Person::new(democrat,y,y,n,n,y,q,n,n,n,n,y,n,y,y,n,y), + Person::new(democrat,y,y,n,n,y,y,n,n,n,n,y,y,y,y,y,n), + Person::new(democrat,y,y,n,n,y,y,n,n,n,y,y,y,y,y,n,q), + Person::new(democrat,y,y,n,y,n,n,y,y,y,n,y,n,n,y,n,y), + Person::new(democrat,y,y,n,y,y,y,n,n,n,n,y,n,y,y,n,q), + Person::new(democrat,y,y,q,q,q,y,n,n,n,n,y,n,y,n,n,y), + Person::new(democrat,y,y,q,y,y,y,n,n,y,n,y,q,y,y,n,n), + Person::new(democrat,y,y,y,n,n,n,n,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,n,n,n,n,n,y,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,n,y,n,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,n,y,y,n,n,q,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,q,n,y,n,n,n,y,q), + Person::new(democrat,y,y,y,n,n,n,y,y,q,y,n,n,n,n,y,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,q,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,q,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,n,n,q,q,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,q,n,n,n,n,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,n,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,q), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,n,y,q,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,y,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,y,n,n,y,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,y,n,n,y,n,y,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,y,y,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,n,y,y,y,y,y,n,y,n,n,y), + Person::new(democrat,y,y,y,n,n,q,y,y,n,n,y,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,q,y,y,y,y,n,n,n,n,y,q), + Person::new(democrat,y,y,y,n,n,y,q,y,n,n,y,y,n,y,n,q), + Person::new(democrat,y,y,y,n,n,y,q,y,y,n,y,n,y,n,y,y), + Person::new(democrat,y,y,y,n,n,y,y,y,q,y,y,q,n,n,y,q), + Person::new(democrat,y,y,y,n,n,y,y,y,y,n,n,n,n,n,y,y), + Person::new(democrat,y,y,y,n,n,y,y,y,y,y,n,n,n,n,n,y), + Person::new(democrat,y,y,y,n,n,y,y,y,y,y,n,n,q,n,y,q), + Person::new(democrat,y,y,y,n,n,y,y,y,y,y,y,n,y,y,y,y), + Person::new(democrat,y,y,y,n,n,y,y,y,y,y,y,y,y,n,n,y), + Person::new(democrat,y,y,y,n,n,y,y,y,y,y,y,y,y,y,n,q), + Person::new(democrat,y,y,y,n,q,n,y,y,y,y,n,n,n,n,y,q), + Person::new(democrat,y,y,y,n,q,y,n,q,n,n,y,n,y,y,n,q), + Person::new(democrat,y,y,y,n,q,y,y,y,n,y,q,q,n,n,y,y), + Person::new(democrat,y,y,y,n,y,y,n,n,n,n,y,q,y,y,y,y), + Person::new(democrat,y,y,y,n,y,y,n,n,n,y,y,n,y,y,n,y), + Person::new(democrat,y,y,y,n,y,y,n,n,q,y,n,n,n,y,y,q), + Person::new(democrat,y,y,y,n,y,y,n,y,n,n,y,n,y,n,y,y), + Person::new(democrat,y,y,y,n,y,y,n,y,n,y,y,n,y,y,n,q), + Person::new(democrat,y,y,y,n,y,y,n,y,n,y,y,n,y,y,y,y), + Person::new(democrat,y,y,y,n,y,y,n,y,q,y,n,n,y,y,n,q), + Person::new(democrat,y,y,y,n,y,y,n,y,y,n,y,n,n,y,n,q), + Person::new(democrat,y,y,y,n,y,y,n,y,y,y,y,n,n,n,n,y), + Person::new(democrat,y,y,y,n,y,y,y,y,n,y,y,n,n,n,y,q), + Person::new(democrat,y,y,y,n,y,y,y,y,y,y,y,n,y,y,n,q), + Person::new(democrat,y,y,y,q,n,n,n,y,n,n,y,q,n,n,y,y), + Person::new(democrat,y,y,y,q,n,y,y,y,y,n,y,n,y,n,q,y), + Person::new(democrat,y,y,y,y,y,y,n,n,n,n,y,y,y,y,n,y), + Person::new(republican,n,n,n,n,y,y,y,n,n,n,n,q,n,y,y,y), + Person::new(republican,n,n,n,y,n,n,y,y,y,y,n,n,y,y,n,y), + Person::new(republican,n,n,n,y,n,y,y,q,y,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,n,n,n,n,n,n,y,n,y,n,n), + Person::new(republican,n,n,n,y,y,n,n,n,n,n,n,y,n,y,q,y), + Person::new(republican,n,n,n,y,y,n,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,n,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,n,y,n,y,y,n,n,n,y,n,y), + Person::new(republican,n,n,n,y,y,n,y,y,n,y,n,y,y,y,q,y), + Person::new(republican,n,n,n,y,y,n,y,y,y,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,q), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,q), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,n,y,y,y,y,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,n,y,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,q,y,y,n,q), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,n,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,q), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,n,y,y,y,y,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,q,y,y,y,n,n), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,q,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,y,y,n,y,n,y), + Person::new(republican,n,n,n,y,y,y,n,n,n,y,y,y,y,y,n,q), + Person::new(republican,n,n,n,y,y,y,q,q,q,q,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,y,n,n,y,n,n,n,y,y,y), + Person::new(republican,n,n,n,y,y,y,y,n,n,y,n,y,n,y,y,y), + Person::new(republican,n,n,n,y,y,y,y,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,y,y,n,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,y,y,y,y,n,y,y,y,n,y), + Person::new(republican,n,n,n,y,y,y,y,y,y,y,n,y,y,y,q,y), + Person::new(republican,n,n,y,y,n,n,y,y,y,y,n,n,n,y,y,y), + Person::new(republican,n,n,y,y,y,y,n,n,n,y,n,y,y,y,y,y), + Person::new(republican,n,n,y,y,y,y,n,n,y,y,n,y,y,y,n,y), + Person::new(republican,n,n,y,y,y,y,y,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,n,y,y,y,y,y,n,n,y,y,y,y,y,n,y), + Person::new(republican,n,n,y,y,y,y,y,y,n,y,n,n,n,y,n,y), + Person::new(republican,n,n,y,y,y,y,y,y,y,y,n,y,y,y,y,y), + Person::new(republican,n,q,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,q,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,q,n,y,y,y,n,n,n,n,n,y,y,y,n,q), + Person::new(republican,n,q,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,q,n,y,y,y,n,n,n,n,y,y,y,y,n,y), + Person::new(republican,n,q,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,q,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,q,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,q,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,q,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,q,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,q,q,q,q,q,q,q,q,q,q,q,q,y,q,q), + Person::new(republican,n,q,q,y,y,y,n,n,n,y,n,y,y,y,q,y), + Person::new(republican,n,q,y,y,y,y,n,n,n,y,n,n,n,y,n,y), + Person::new(republican,n,y,n,y,q,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,n,n,n,n,n,q,q,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,n,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,n,y,y,q,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,q,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,q,q,n,q), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,q,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,q), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,y,q,y,y,q,q), + Person::new(republican,n,y,n,y,y,y,n,n,n,n,y,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,q,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,q,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,q,n,q), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,q), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,q), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,n,y,y,y,q,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,q,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,y,y,y,n,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,n,y,y,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,n,y,y,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,q,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,n,q,n,n,q,q,q,y,n,q), + Person::new(republican,n,y,n,y,y,y,n,q,n,y,n,y,y,y,n,q), + Person::new(republican,n,y,n,y,y,y,q,n,n,n,n,q,y,y,n,n), + Person::new(republican,n,y,n,y,y,y,q,q,n,n,q,q,y,q,q,q), + Person::new(republican,n,y,n,y,y,y,q,q,n,y,n,y,q,q,q,q), + Person::new(republican,n,y,n,y,y,y,y,n,n,n,n,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,y,n,n,n,y,y,y,y,n,y), + Person::new(republican,n,y,n,y,y,y,y,y,n,n,y,y,y,y,y,y), + Person::new(republican,n,y,y,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,n,y,y,y,y,y,y,n,y,y,n,y,y,y,n,y), + Person::new(republican,n,y,y,y,y,y,y,q,n,n,n,n,q,q,y,q), + Person::new(republican,n,y,y,y,y,y,y,y,y,n,n,y,y,y,n,y), + Person::new(republican,q,n,y,y,n,y,y,y,y,y,n,y,n,y,n,y), + Person::new(republican,q,q,q,q,n,y,n,y,y,n,n,y,y,n,n,q), + Person::new(republican,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q), + Person::new(republican,y,n,n,n,n,n,y,y,y,y,n,n,n,y,n,y), + Person::new(republican,y,n,n,y,y,n,y,n,n,y,n,n,n,y,y,y), + Person::new(republican,y,n,n,y,y,n,y,y,y,n,n,y,y,y,n,y), + Person::new(republican,y,n,n,y,y,y,n,n,n,n,y,y,y,y,n,n), + Person::new(republican,y,n,n,y,y,y,n,n,n,y,n,q,y,y,n,n), + Person::new(republican,y,n,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,y,n,y,y,n,n,n,y,y,y,n,n,n,y,y,y), + Person::new(republican,y,n,y,y,y,n,y,n,y,y,n,n,y,y,n,y), + Person::new(republican,y,n,y,y,y,y,y,y,n,n,n,n,n,y,n,q), + Person::new(republican,y,n,y,y,y,y,y,y,n,y,n,y,n,y,y,y), + Person::new(republican,y,n,y,y,y,y,y,y,n,y,y,y,n,y,y,y), + Person::new(republican,y,q,n,y,y,y,n,n,n,y,n,y,q,y,n,y), + Person::new(republican,y,q,n,y,y,y,n,y,n,n,n,y,y,y,n,y), + Person::new(republican,y,q,n,y,y,y,y,n,n,y,n,y,y,y,n,y), + Person::new(republican,y,q,n,y,y,y,y,y,n,n,n,y,q,y,q,q), + Person::new(republican,y,y,n,y,y,y,n,n,n,n,n,n,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,n,y,n,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,n,y,y,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,y,n,n,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,n), + Person::new(republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,y,n,y,y,y,n,y), + Person::new(republican,y,y,n,y,y,y,n,n,n,y,y,n,y,n,n,n), + Person::new(republican,y,y,n,y,y,y,n,q,n,n,y,y,y,y,n,n), + Person::new(republican,y,y,n,y,y,y,y,n,n,n,n,y,y,y,n,n), + Person::new(republican,y,y,n,y,y,y,y,n,n,n,n,y,y,y,n,y), + Person::new(republican,y,y,y,y,n,n,y,y,y,y,y,n,n,y,n,y), + Person::new(republican,y,y,y,y,y,n,y,n,n,n,n,y,y,y,n,y), + Person::new(republican,y,y,y,y,y,y,y,y,n,y,n,n,y,y,n,y), + Person::new(republican,y,y,y,y,y,y,y,y,n,y,q,q,q,y,n,y), +]; diff --git a/Year 4/Artificial Intelligence/hw05/src/main.rs b/Year 4/Artificial Intelligence/hw05/src/main.rs new file mode 100644 index 0000000..6a53ee8 --- /dev/null +++ b/Year 4/Artificial Intelligence/hw05/src/main.rs @@ -0,0 +1,40 @@ +use text_io::read; + +mod data; +use data::{Person, Party::republican}; +mod probabilities; +use probabilities::PMaps; + +fn test_single(prob: &PMaps, person: &Person) -> bool { + let is_republican = P!(Party = republican | person, prob) >= 0.5; + is_republican == (person.party == republican) +} + +fn test(prob: &PMaps, people: &Vec<Person>) -> f64 { + let mut count_succ = 0.0; + for p in people { + if test_single(&prob, &p) { + count_succ += 1.0; + } + } + count_succ / people.len() as f64 +} + +fn main() { + let fill: u8 = read!(); + let fill = fill == 1; + + let (training, testing) = data::get_data(); + let prob = if fill { + probabilities::value_2_probabilities(&training) + } else { + probabilities::value_3_probabilities(&training) + }; + + // No laplace, so that's probably why it's not 92.80% + println!("1. Train Set Accuracy:"); + println!(" Accuracy: {:.2}%", test(&prob, &training) * 100.0); + + println!("2. Test Set Accuracy:"); + println!(" Accuracy: {:.2}%", test(&prob, &testing) * 100.0); +} diff --git a/Year 4/Artificial Intelligence/hw05/src/probabilities.rs b/Year 4/Artificial Intelligence/hw05/src/probabilities.rs new file mode 100644 index 0000000..bf696e3 --- /dev/null +++ b/Year 4/Artificial Intelligence/hw05/src/probabilities.rs @@ -0,0 +1,173 @@ +use crate::data::{Party, Person, Value}; +use std::collections::HashMap; +use struct_iterable::Iterable; + +pub fn party_probabilities(dataset: &Vec<Person>) +-> HashMap<Party, f64> { + let count_republicans = dataset + .into_iter() + .fold(0.0, |acc, person| if person.party == Party::republican { acc + 1.0 } else { acc }); + let p_republicans = count_republicans / dataset.len() as f64; + + let mut ret = HashMap::new(); + ret.insert(Party::republican, p_republicans); + ret.insert(Party::democrat, 1.0 - p_republicans); + ret +} + +pub type PMaps = (HashMap<Value, HashMap<String, f64>>, HashMap<Party, HashMap<Value, HashMap<String, f64>>>); + +#[macro_export] +macro_rules! P { + // P(Party=democrat|person) + // P(Party=democrat|"crime"=y,...) + ( Party = $party:tt | $person:ident , $prob:ident ) => { + { + use crate::data::Value; + use struct_iterable::Iterable; + + let mut prob = if $party == crate::data::Party::democrat { 0.61 } else { 0.39 }; + for (name, val) in $person.iter() { + if name == "party" { continue; } + let val = val.downcast_ref::<Value>().unwrap(); + prob *= P!(name = val | $party, $prob) / P!(name = val, $prob); + } + prob + } + }; + // P("crime"=y|democrat) + ( $attr:tt = $value:tt | $party:tt , $prob:ident ) => { + $prob.1[&$party][$value][$attr] + }; + // P("crime"=y) + ( $attr:tt = $value:tt , $prob:ident ) => { + $prob.0[$value][$attr] + }; +} + +/// Result: (P(Value[attr]), P(Value[attr]|Party)) +/// Use : .0[y]["crime"] +/// .1[democrat][y]["crime"] +pub fn value_3_probabilities(dataset: &Vec<Person>) -> PMaps { + let mut len = dataset.len() as f64; + + // P(Value[attr]) + let mut ret_y = HashMap::new(); + let mut ret_n = HashMap::new(); + let mut ret_q = HashMap::new(); + + for (name, _) in dataset[0].iter() { + if name == "party" { continue; } + + let (count_y, count_n, count_q) = dataset + .into_iter() + .fold((0.0, 0.0, 0.0), |mut acc, person| { + match person[name] { + Value::y => acc.0 += 1.0, + Value::n => acc.1 += 1.0, + Value::q => acc.2 += 1.0, + } + acc + }); + ret_y.insert(name.to_string(), count_y / len); + ret_n.insert(name.to_string(), count_n / len); + ret_q.insert(name.to_string(), count_q / len); + assert_eq!(count_y + count_n + count_q, len); + } + + let mut simple_p = HashMap::new(); + simple_p.insert(Value::y, ret_y); + simple_p.insert(Value::n, ret_n); + simple_p.insert(Value::q, ret_q); + + assert_eq!( + simple_p[&Value::y]["crime"] + + simple_p[&Value::n]["crime"] + + simple_p[&Value::q]["crime"], + 1.0, + ); + + // P(Value[attr]|Party) + let mut complex_p = HashMap::new(); + + // P(Value[attr]|democrat) + let mut ret_y = HashMap::new(); + let mut ret_n = HashMap::new(); + let mut ret_q = HashMap::new(); + len = 214.0; + + for (name, _) in dataset[0].iter() { + if name == "party" { continue; } + + let (count_y, count_n, count_q) = dataset + .into_iter() + .fold((0.0, 0.0, 0.0), |mut acc, person| { + if person.party == Party::democrat { + match person[name] { + Value::y => acc.0 += 1.0, + Value::n => acc.1 += 1.0, + Value::q => acc.2 += 1.0, + } + } + acc + }); + ret_y.insert(name.to_string(), count_y / len); + ret_n.insert(name.to_string(), count_n / len); + ret_q.insert(name.to_string(), count_q / len); + assert_eq!(count_y + count_n + count_q, 214.0); + } + + let mut party_p = HashMap::new(); + party_p.insert(Value::y, ret_y); + party_p.insert(Value::n, ret_n); + party_p.insert(Value::q, ret_q); + + complex_p.insert(Party::democrat, party_p); + + // P(Value[attr]|republican) + let mut ret_y = HashMap::new(); + let mut ret_n = HashMap::new(); + let mut ret_q = HashMap::new(); + len = 134.0; + + for (name, _) in dataset[0].iter() { + if name == "party" { continue; } + + let (count_y, count_n, count_q) = dataset + .into_iter() + .fold((0.0, 0.0, 0.0), |mut acc, person| { + if person.party == Party::republican { + match person[name] { + Value::y => acc.0 += 1.0, + Value::n => acc.1 += 1.0, + Value::q => acc.2 += 1.0, + } + } + acc + }); + ret_y.insert(name.to_string(), count_y / len); + ret_n.insert(name.to_string(), count_n / len); + ret_q.insert(name.to_string(), count_q / len); + assert_eq!(count_y + count_n + count_q, 134.0); + } + + let mut party_p = HashMap::new(); + party_p.insert(Value::y, ret_y); + party_p.insert(Value::n, ret_n); + party_p.insert(Value::q, ret_q); + + complex_p.insert(Party::republican, party_p); + + assert_eq!( + complex_p[&Party::republican][&Value::y]["crime"] + + complex_p[&Party::republican][&Value::n]["crime"] + + complex_p[&Party::republican][&Value::q]["crime"], + 1.0, + ); + + (simple_p, complex_p) +} + +pub fn value_2_probabilities(dataset: &Vec<Person>) -> PMaps { + todo!(); +} |
