Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitf4c86d83629b282f39cc3750d42c8afe77d24fe9 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-01-12 22:33:48 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-01-12 22:33:48 +0200
Files0f0d810e52d5c0c80a3f548b8d304c46cbe41e9a
uni-projects-f4c86d83629b282f39cc3750d42c8afe77d24fe9.tar
uni-projects-f4c86d83629b282f39cc3750d42c8afe77d24fe9.tar.gz
uni-projects-f4c86d83629b282f39cc3750d42c8afe77d24fe9.zip
Parenta1295f15503548758be351b52b54874537483f6a (diff)
hw(AI/6): Progress
diff --git a/Year 4/Artificial Intelligence/hw06/src/data.rs b/Year 4/Artificial Intelligence/hw06/src/data.rs
new file mode 100644
index 0000000..8eff0fd
--- /dev/null
+++ b/Year 4/Artificial Intelligence/hw06/src/data.rs
@@ -0,0 +1,408 @@
+#![allow(non_camel_case_types)]
+use rand::{thread_rng, prelude::SliceRandom};
+
+#[derive(Clone, PartialEq)]
+pub enum Events {
+ no_recurrence_events, recurrence_events
+}
+use Events::*;
+
+#[derive(Clone)]
+pub enum Age {
+ a10_19, a20_29, a30_39, a40_49, a50_59, a60_69, a70_79, a80_89, a90_99
+}
+use Age::*;
+
+#[derive(Clone)]
+pub enum Menopause {
+ lt40, ge40, premeno
+}
+use Menopause::*;
+
+#[derive(Clone)]
+pub enum TumorSize {
+ t0_4, t5_9, t10_14, t15_19, t20_24, t25_29, t30_34, t35_39, t40_44, t45_49, t50_54, t55_59
+}
+use TumorSize::*;
+
+#[derive(Clone)]
+pub enum InvNodes {
+ i0_2, i3_5, i6_8, i9_11, i12_14, i15_17, i18_20, i21_23, i24_26, i27_29, i30_32, i33_35, i36_39
+}
+use InvNodes::*;
+
+#[derive(Clone)]
+pub enum Binary {
+ yes, no, q
+}
+use Binary::*;
+
+#[derive(Clone)]
+pub enum Breast {
+ left, right
+}
+use Breast::*;
+
+#[derive(Clone)]
+pub enum BreastQuad {
+ left_up, left_low, right_up, right_low, central, qbq
+}
+use BreastQuad::*;
+
+#[derive(Clone, Debug, PartialEq, Iterable)]
+struct Person {
+ events: Events,
+ age: Age,
+ menopause: Menopause,
+ tumor_size: TumorSize,
+ inv_nodes: InvNodes,
+ node_caps: Binary,
+ deg_malig: u8,
+ breast: Breast,
+ breast_quad: BreastQuad,
+ irradiat: Binary,
+}
+
+impl Person {
+ const fn new(
+ events: Events,
+ age: Age,
+ menopause: Menopause,
+ tumor_size: TumorSize,
+ inv_nodes: InvNodes,
+ node_caps: Binary,
+ deg_malig: u8,
+ breast: Breast,
+ breast_quad: BreastQuad,
+ irradiat: Binary,
+ ) -> Person {
+ Person {
+ events,
+ age,
+ menopause,
+ tumor_size,
+ inv_nodes,
+ node_caps,
+ deg_malig,
+ breast,
+ breast_quad,
+ irradiat,
+ }
+ }
+}
+
+/// Returns (training, testing)
+/// Replace q and qbq!
+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 70.27972% to be no_recurrence and the other to be recurrence
+ // We use 80% for training and 20% for testing
+ // Meaning, our training data is 229 elements,
+ // where 161 are no_recurrence and 68 are recurrence
+ vec.rotate_right(68);
+ let (a, b) = vec.split_at(229);
+
+ assert_eq!(
+ a.into_iter()
+ .fold(0, |acc, person| if person.events == recurrence_events {
+ acc + 1
+ } else {
+ acc
+ }),
+ 68);
+
+ 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; 286] = [
+ Person::new(no_recurrence_events,a30_39,premeno,t30_34,i0_2,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,right,right_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t0_4,i0_2,no,2,right,right_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t50_54,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t0_4,i0_2,no,3,left,central,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,lt40,t10_14,i0_2,no,1,left,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,3,left,right_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a60_69,lt40,t30_34,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t15_19,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t30_34,i0_2,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,right,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t25_29,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t40_44,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t35_39,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t20_24,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t40_44,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,3,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t15_19,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t10_14,i0_2,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,1,left,left_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t30_34,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t0_4,i0_2,no,2,left,central,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,1,right,central,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,1,right,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t5_9,i0_2,no,1,left,central,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t50_54,i0_2,no,1,right,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,left,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,1,right,right_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,1,right,left_low,no),
+ Person::new(no_recurrence_events,a50_59,lt40,t15_19,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t20_24,i0_2,no,2,left,right_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t15_19,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a70_79,ge40,t20_24,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a70_79,ge40,t40_44,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a70_79,ge40,t40_44,i0_2,no,1,right,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t0_4,i0_2,no,1,right,central,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t5_9,i0_2,no,2,right,right_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,1,left,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,central,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,1,right,right_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t0_4,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a20_29,premeno,t35_39,i0_2,no,2,right,right_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,1,left,right_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,1,right,right_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t35_39,i0_2,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t50_54,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t15_19,i0_2,no,2,right,right_low,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t5_9,i0_2,no,2,left,right_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t25_29,i0_2,no,1,left,central,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,central,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,left,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,1,left,right_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t35_39,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a70_79,ge40,t0_4,i0_2,no,1,left,right_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,3,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t40_44,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t0_4,i0_2,no,2,right,central,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t10_14,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,2,right,right_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,left,right_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t25_29,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,ge40,t20_24,i0_2,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,3,right,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,right,right_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,right_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t40_44,i0_2,no,2,right,right_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,3,right,right_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,1,right,central,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,no,2,right,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t15_19,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,ge40,t20_24,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t10_14,i0_2,no,1,right,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,1,left,right_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,2,right,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,3,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,right,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,right,left_low,no),
+ Person::new(no_recurrence_events,a70_79,ge40,t10_14,i0_2,no,2,left,central,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t30_34,i6_8,yes,2,right,right_up,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t25_29,i6_8,yes,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,yes,2,left,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t35_39,i9_11,yes,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t35_39,i9_11,yes,2,right,right_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t40_44,i3_5,yes,3,right,left_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i6_8,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,3,left,right_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,2,left,left_low,yes),
+ Person::new(no_recurrence_events,a30_39,premeno,t20_24,i3_5,no,2,right,central,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t40_44,i3_5,no,3,right,right_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t5_9,i0_2,no,1,left,left_low,yes),
+ Person::new(no_recurrence_events,a30_39,premeno,t40_44,i0_2,no,2,left,left_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,2,left,right_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t40_44,i3_5,yes,2,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t20_24,i3_5,yes,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,left,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t45_49,i0_2,no,2,left,left_low,yes),
+ Person::new(no_recurrence_events,a60_69,ge40,t45_49,i6_8,yes,3,left,central,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,q,2,left,right_low,yes),
+ Person::new(no_recurrence_events,a60_69,ge40,t50_54,i0_2,no,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,premeno,t30_34,i3_5,yes,2,left,left_low,yes),
+ Person::new(no_recurrence_events,a30_39,premeno,t20_24,i0_2,no,3,left,central,no),
+ Person::new(no_recurrence_events,a50_59,lt40,t30_34,i0_2,no,3,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i15_17,yes,3,right,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i3_5,yes,3,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t35_39,i15_17,no,3,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,3,right,left_up,yes),
+ Person::new(no_recurrence_events,a30_39,lt40,t15_19,i0_2,no,3,right,left_up,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t40_44,i3_5,no,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i3_5,yes,3,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t30_34,i0_2,no,1,left,central,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,right,central,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,3,right,left_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i3_5,yes,2,right,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a60_69,ge40,t25_29,i3_5,q,1,right,left_up,yes),
+ Person::new(no_recurrence_events,a60_69,ge40,t25_29,i3_5,q,1,right,left_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i3_5,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i3_5,no,2,right,left_low,no),
+ Person::new(no_recurrence_events,a40_49,ge40,t40_44,i15_17,yes,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,premeno,t10_14,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,ge40,t30_34,i0_2,no,2,left,left_up,yes),
+ Person::new(no_recurrence_events,a30_39,premeno,t20_24,i3_5,yes,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a30_39,premeno,t15_19,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t30_34,i6_8,yes,2,right,right_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i3_5,yes,2,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i3_5,yes,2,left,left_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,2,right,right_up,yes),
+ Person::new(no_recurrence_events,a40_49,ge40,t25_29,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,2,left,left_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i3_5,no,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,3,right,left_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,yes,3,right,left_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,yes,3,right,left_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,1,right,left_low,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i9_11,q,3,left,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i9_11,q,3,left,left_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t20_24,i6_8,no,2,right,left_low,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,1,left,right_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,left,left_up,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,right,left_up,no),
+ Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,yes,2,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t15_19,i12_14,no,3,right,right_low,yes),
+ Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,left,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t30_34,i6_8,yes,2,left,left_low,no),
+ Person::new(no_recurrence_events,a30_39,premeno,t10_14,i0_2,no,2,left,right_low,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t50_54,i0_2,yes,2,right,left_up,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t35_39,i0_2,no,2,left,left_up,no),
+ Person::new(no_recurrence_events,a50_59,premeno,t10_14,i3_5,no,1,right,left_up,no),
+ Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,left,left_low,yes),
+ Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,yes,2,left,central,yes),
+ Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,1,left,left_low,no),
+ Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,right,left_low,no),
+ Person::new(recurrence_events,a50_59,premeno,t15_19,i0_2,no,2,left,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t40_44,i0_2,no,1,left,left_low,no),
+ Person::new(recurrence_events,a50_59,ge40,t35_39,i0_2,no,2,left,left_low,no),
+ Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,right_up,no),
+ Person::new(recurrence_events,a30_39,premeno,t0_4,i0_2,no,2,right,central,no),
+ Person::new(recurrence_events,a50_59,ge40,t30_34,i0_2,no,3,left,qbq,no),
+ Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,right_up,no),
+ Person::new(recurrence_events,a50_59,premeno,t30_34,i0_2,no,3,left,right_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t35_39,i0_2,no,1,right,left_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,left_low,no),
+ Person::new(recurrence_events,a50_59,ge40,t20_24,i0_2,no,2,right,central,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i0_2,no,3,right,right_up,no),
+ Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,1,right,left_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t40_44,i0_2,no,2,right,left_low,no),
+ Person::new(recurrence_events,a40_49,ge40,t20_24,i0_2,no,2,right,left_up,no),
+ Person::new(recurrence_events,a50_59,ge40,t20_24,i0_2,no,2,left,left_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t15_19,i0_2,no,2,left,left_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t30_34,i0_2,no,3,right,central,no),
+ Person::new(recurrence_events,a30_39,premeno,t15_19,i0_2,no,1,right,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,3,left,right_up,no),
+ Person::new(recurrence_events,a30_39,premeno,t30_34,i0_2,no,1,right,left_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,left,right_low,yes),
+ Person::new(recurrence_events,a60_69,ge40,t20_24,i0_2,no,3,right,left_low,no),
+ Person::new(recurrence_events,a30_39,premeno,t25_29,i3_5,yes,3,left,left_low,yes),
+ Person::new(recurrence_events,a40_49,ge40,t20_24,i3_5,no,3,right,left_low,yes),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i15_17,yes,3,left,left_low,no),
+ Person::new(recurrence_events,a50_59,premeno,t30_34,i0_2,no,3,right,left_up,yes),
+ Person::new(recurrence_events,a60_69,ge40,t40_44,i3_5,yes,3,right,left_low,no),
+ Person::new(recurrence_events,a60_69,ge40,t45_49,i0_2,no,1,right,right_up,yes),
+ Person::new(recurrence_events,a50_59,premeno,t50_54,i9_11,yes,2,right,left_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i3_5,no,2,right,left_up,no),
+ Person::new(recurrence_events,a30_39,premeno,t30_34,i3_5,no,3,right,left_up,yes),
+ Person::new(recurrence_events,a70_79,ge40,t15_19,i9_11,q,1,left,left_low,yes),
+ Person::new(recurrence_events,a60_69,ge40,t30_34,i0_2,no,3,right,left_up,yes),
+ Person::new(recurrence_events,a50_59,premeno,t25_29,i3_5,yes,3,left,left_low,yes),
+ Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_low,no),
+ Person::new(recurrence_events,a30_39,premeno,t35_39,i0_2,no,3,left,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t20_24,i3_5,yes,2,right,right_up,yes),
+ Person::new(recurrence_events,a60_69,ge40,t20_24,i3_5,no,2,left,left_low,yes),
+ Person::new(recurrence_events,a40_49,premeno,t15_19,i15_17,yes,3,left,left_low,no),
+ Person::new(recurrence_events,a50_59,ge40,t25_29,i6_8,no,3,left,left_low,yes),
+ Person::new(recurrence_events,a50_59,ge40,t20_24,i3_5,yes,3,right,right_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i12_14,yes,3,left,left_up,yes),
+ Person::new(recurrence_events,a30_39,premeno,t30_34,i9_11,no,2,right,left_up,yes),
+ Person::new(recurrence_events,a30_39,premeno,t15_19,i6_8,yes,3,left,left_low,yes),
+ Person::new(recurrence_events,a50_59,ge40,t30_34,i9_11,yes,3,left,right_low,yes),
+ Person::new(recurrence_events,a60_69,ge40,t35_39,i6_8,yes,3,left,left_low,no),
+ Person::new(recurrence_events,a30_39,premeno,t20_24,i3_5,yes,2,left,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,3,left,left_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t50_54,i0_2,no,2,right,left_low,yes),
+ Person::new(recurrence_events,a30_39,premeno,t40_44,i0_2,no,1,left,left_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t50_54,i0_2,no,3,right,left_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i0_2,yes,3,right,right_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i6_8,yes,3,right,left_up,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,left,left_low,yes),
+ Person::new(recurrence_events,a40_49,premeno,t20_24,i3_5,yes,2,left,left_low,yes),
+ Person::new(recurrence_events,a50_59,ge40,t30_34,i6_8,yes,2,left,right_low,yes),
+ Person::new(recurrence_events,a50_59,ge40,t30_34,i3_5,no,3,right,left_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t25_29,i3_5,no,2,right,right_up,no),
+ Person::new(recurrence_events,a40_49,ge40,t25_29,i12_14,yes,3,left,right_low,yes),
+ Person::new(recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,left,left_up,no),
+ Person::new(recurrence_events,a50_59,lt40,t20_24,i0_2,q,1,left,left_up,no),
+ Person::new(recurrence_events,a50_59,lt40,t20_24,i0_2,q,1,left,left_low,no),
+ Person::new(recurrence_events,a30_39,premeno,t35_39,i9_11,yes,3,left,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t30_34,i3_5,yes,2,left,right_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t20_24,i24_26,yes,3,left,left_low,yes),
+ Person::new(recurrence_events,a30_39,premeno,t35_39,i0_2,no,3,left,left_low,no),
+ Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,left,left_low,yes),
+ Person::new(recurrence_events,a50_59,ge40,t30_34,i6_8,yes,3,left,right_low,no),
+ Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,3,right,left_low,yes),
+ Person::new(recurrence_events,a40_49,premeno,t15_19,i0_2,yes,3,right,left_up,no),
+ Person::new(recurrence_events,a60_69,ge40,t30_34,i0_2,yes,2,right,right_up,yes),
+ Person::new(recurrence_events,a60_69,ge40,t30_34,i3_5,yes,2,left,central,yes),
+ Person::new(recurrence_events,a40_49,premeno,t25_29,i9_11,yes,3,right,left_up,no),
+ Person::new(recurrence_events,a30_39,premeno,t25_29,i6_8,yes,3,left,right_low,yes),
+ Person::new(recurrence_events,a60_69,ge40,t10_14,i6_8,yes,3,left,left_up,yes),
+ Person::new(recurrence_events,a50_59,premeno,t35_39,i15_17,yes,3,right,right_up,no),
+ Person::new(recurrence_events,a50_59,ge40,t40_44,i6_8,yes,3,left,left_low,yes),
+ Person::new(recurrence_events,a50_59,ge40,t40_44,i6_8,yes,3,left,left_low,yes),
+ Person::new(recurrence_events,a30_39,premeno,t30_34,i0_2,no,2,left,left_up,no),
+ Person::new(recurrence_events,a30_39,premeno,t20_24,i0_2,no,3,left,left_up,yes),
+ Person::new(recurrence_events,a60_69,ge40,t20_24,i0_2,no,1,right,left_up,no),
+ Person::new(recurrence_events,a40_49,ge40,t30_34,i3_5,no,3,left,left_low,no),
+ Person::new(recurrence_events,a50_59,ge40,t30_34,i3_5,no,3,left,left_low,no),
+];
diff --git a/Year 4/Artificial Intelligence/hw06/src/main.rs b/Year 4/Artificial Intelligence/hw06/src/main.rs
new file mode 100644
index 0000000..c2de2b9
--- /dev/null
+++ b/Year 4/Artificial Intelligence/hw06/src/main.rs
@@ -0,0 +1,8 @@
+use text_io::read;
+
+mod data;
+
+fn main() {
+ // let pruning: u8 = read!();
+ let (training, testing) = data::get_data();
+}
diff --git a/Year 4/Artificial Intelligence/hw06/src/probabilities.rs b/Year 4/Artificial Intelligence/hw06/src/probabilities.rs
new file mode 100644
index 0000000..69d9671
--- /dev/null
+++ b/Year 4/Artificial Intelligence/hw06/src/probabilities.rs
@@ -0,0 +1,83 @@
+use crate::data::*;
+use crate::data::*::*;
+
+pub fn entropy(sample: Vec<Person>) -> f64 {
+ // Target is Person.events
+ let rec = 0.0;
+ for p in sample {
+ if p.events == Events::recurrence_events {
+ rec += 1.0;
+ }
+ }
+ let total = sample.size() as f64;
+ let no_rec = total - rec;
+
+ - (rec / total) * (rec / total).log2()
+ - (no_rec / total) * (no_rec / total).log2()
+}
+
+macro_rules! gain_impl{
+ // Single value: entropy(Sv) * |Sv| / |S|
+ ($sample:ident, $attr:tt, $val:tt) => {
+ {
+ let sample_v = sample
+ .clone()
+ .into_iter()
+ .filter(|p| p.$attr == $val)
+ .collect();
+ entropy(sample_v) * sample_v.len() as f64 / $sample.len() as f64
+ }
+ }
+ // All value: entropy(S) - Sum(single value)
+ ($sample:ident, $attr:tt; $($val:tt),+) => {
+ {
+ let sum = 0;
+ $(
+ sum += gain_impl!($sample, $attr, $val);
+ )*
+ entropy($sample) - sum
+ }
+ };
+}
+
+pub fn gain(sample: &Vec<Person>, feature: string) -> f64 {
+ match feature {
+ "age" => gain_impl!(
+ sample, age;
+ a10_19, a20_29, a30_39, a40_49, a50_59, a60_69, a70_79, a80_89, a90_99
+ ),
+ "menopause" => gain_impl!(
+ sample, menopause;
+ lt40, ge40, premeno
+ ),
+ "tumor_size" => gain_impl!(
+ sample, tumor_size;
+ t0_4, t5_9, t10_14, t15_19, t20_24, t25_29, t30_34, t35_39, t40_44, t45_49, t50_54, t55_59
+ ),
+ "inv_nodes" => gain_impl!(
+ sample, inv_nodes;
+ i0_2, i3_5, i6_8, i9_11, i12_14, i15_17, i18_20, i21_23, i24_26, i27_29, i30_32, i33_35, i36_39
+ ),
+ "node_caps" => gain_impl!(
+ sample, node_caps;
+ yes, no, q
+ ),
+ "deg_malig" => gain_impl!(
+ sample, deg_malig;
+ 1, 2, 3
+ ),
+ "breast" => gain_impl!(
+ sample, breast;
+ left, right
+ ),
+ "breast_quad" => gain_impl!(
+ sample, breast_quad;
+ left_up, left_low, right_up, right_low, central, qbq
+ ),
+ "irradiat" => gain_impl!(
+ sample, irradiat;
+ yes, no, q
+ ),
+ _ => unreachable!("Feature {feature} doesn't exit!"),
+ }
+}
diff --git a/Year 4/Artificial Intelligence/hw06/src/tree.rs b/Year 4/Artificial Intelligence/hw06/src/tree.rs
new file mode 100644
index 0000000..86982a3
--- /dev/null
+++ b/Year 4/Artificial Intelligence/hw06/src/tree.rs
@@ -0,0 +1,36 @@
+use crate::probabilities::*;
+use crate::data::*;
+
+pub struct Node<T> {
+ decision: HashMap<T, Node>,
+ leaf: Option<Events>,
+}
+
+impl Node {
+ fn new_leaf(value: Events) -> Node {
+ Node {
+ decision: HashMap::new(),
+ leaf: Some(value),
+ }
+ }
+
+ fn new_node() -> Node {
+ Node {
+ decision: HashMap::new(),
+ leaf: None,
+ }
+ }
+}
+
+pub struct Tree {
+ root: Node,
+}
+
+impl Tree {
+ pub fn new(sample: Vec<Person>, features: Vec<string>) -> Tree {
+ let max_feature = features
+ .into_iter()
+ .max_by(|x, y| gain(sample, x).cmp(gain(sample, y)));
+ let root = Node::new_node();
+ }
+}