summaryrefslogtreecommitdiff
path: root/graph-checker/src/compute.rs
diff options
context:
space:
mode:
authorAndrew Guschin <guschin@altlinux.org>2024-09-11 13:35:26 +0400
committerAndrew Guschin <guschin@altlinux.org>2024-09-11 13:35:26 +0400
commitaa372ee41dff36de5cb94fbb677464658eef2e46 (patch)
tree7171459bd61f224c243dd56c0bb9ed0daba35dfe /graph-checker/src/compute.rs
parent8fb4ba6c422c6941189791a5cc4bfa08d16cb6f9 (diff)
chore: extracted theorem checks to separate function
Diffstat (limited to 'graph-checker/src/compute.rs')
-rw-r--r--graph-checker/src/compute.rs252
1 files changed, 252 insertions, 0 deletions
diff --git a/graph-checker/src/compute.rs b/graph-checker/src/compute.rs
new file mode 100644
index 0000000..b43d64c
--- /dev/null
+++ b/graph-checker/src/compute.rs
@@ -0,0 +1,252 @@
+use crate::graph::{Graph, GraphProfile};
+use crate::theorems::{basic, forbidden, toughness};
+
+pub fn apply_theorems(g: Graph) -> GraphProfile {
+ // let db = db.clone();
+ // counters.graphs += 1;
+ let line = g.to_g6();
+ let mut profile = GraphProfile::new(&line);
+
+ let closure = g.get_closure();
+ let is_complete = closure.is_complete();
+
+ let toughness = if g.is_complete() {
+ f64::MAX
+ } else {
+ g.get_toughness()
+ };
+
+ if toughness >= 1.0 {
+ profile.insert("tough_1".to_string(), true);
+ }
+ if toughness >= 2.0 {
+ profile.insert("tough_2".to_string(), true);
+ }
+ let min_degree = g.min_degree() as f64;
+
+ if forbidden::theorem3_1(&g) {
+ profile.insert("t3_1".to_string(), true);
+ // println!("g6:t3_1:{}", line);
+ }
+
+ if forbidden::theorem3_2(&g) {
+ profile.insert("t3_2".to_string(), true);
+ // println!("g6:t3_2:{}", line);
+ }
+
+ if forbidden::corollary3_5(&g) {
+ profile.insert("c3_5".to_string(), true);
+ // println!("g6:c3_5:{}", line);
+ }
+ if forbidden::theorem85(&g) {
+ profile.insert("t85".to_string(), true);
+ // println!("g6:t85:{}", line);
+ }
+ if forbidden::theorem86(&g) {
+ profile.insert("t86".to_string(), true);
+ // println!("g6:t86:{}", line);
+ }
+ if forbidden::theorem87(&g) {
+ profile.insert("t87".to_string(), true);
+ // println!("g6:t87:{}", line);
+ }
+ if forbidden::theorem88(&g) {
+ profile.insert("t88".to_string(), true);
+ // println!("g6:t88:{}", line);
+ }
+ if forbidden::theorem96(&g) {
+ profile.insert("t96".to_string(), true);
+ // println!("g6:t96:{}", line);
+ }
+ if forbidden::conjecture17(&g) {
+ profile.insert("conj17".to_string(), true);
+ // println!("g6:conj17:{}", line);
+ }
+ if forbidden::theorem_all_2con(&g) {
+ profile.insert("all_2c".to_string(), true);
+ // println!("g6:all_2c:{}", line);
+ }
+ if toughness::theorem15(&g, toughness, min_degree) {
+ profile.insert("t15_hamiltonian".to_string(), true);
+ // println!("g6:bigalke-jung:{}", line);
+ }
+ if toughness::theorem25(&g, toughness, min_degree) {
+ profile.insert("t25_hamiltonian".to_string(), true);
+ // println!("g6:bauer:{}", line);
+ }
+ if basic::dirac_theorem(&g) {
+ profile.insert("dirac_hamiltonian".to_string(), true);
+ // println!("g6:dirac:{}", line);
+ }
+ if basic::ore_theorem(&g) {
+ profile.insert("ore_hamiltonian".to_string(), true);
+ // println!("g6:ore:{}", line);
+ }
+ if basic::posa_theorem(&g) {
+ profile.insert("posa_hamiltonian".to_string(), true);
+ // println!("g6:posa:{}", line);
+ }
+ if is_complete {
+ profile.insert("bch_hamiltonian".to_string(), true);
+ // println!("g6:bondy-chvatal:{}", line);
+ }
+
+ if is_complete && false {
+ // println!("Graph: {line}\n{g}");
+
+ let components_count = g.count_components();
+ // println!("Components count: {components_count}");
+ let min_degree = g.min_degree();
+ // println!("Minimal degree: {min_degree}");
+
+ let cutset = g.max_independent_cutset();
+ // println!("Maximal independent cutset:\n{}", cutset.graph);
+ // println!("Included vertices: {:?}", cutset.vertices);
+ // println!("Cutset cardinality: {}", cutset.cardinality);
+
+ let cycle = basic::bondy_chvatal_hamiltonian_cycle(&g);
+ print!("Hamiltonian cycle: ");
+ let start = 0;
+ let mut current = start;
+ loop {
+ print!("{}", current + 1);
+ print!(" -> ");
+ current = cycle[current];
+ if current == start {
+ // println!("{}", current + 1);
+ break;
+ }
+ }
+ }
+
+ // let _ = sqlx::query!("INSERT INTO graphs (g6) VALUES (?);", line)
+ // .execute(&db)
+ // .await;
+
+ profile
+}
+
+pub async fn async_theorems1(g: Graph) -> GraphProfile {
+ // counters.graphs += 1;
+ let line = g.to_g6();
+ let mut profile = GraphProfile::new(&line);
+
+ let closure = g.get_closure();
+ let is_complete = closure.is_complete();
+
+ let toughness = if g.is_complete() {
+ f64::MAX
+ } else {
+ g.get_toughness()
+ };
+
+ if toughness >= 1.0 {
+ profile.insert("tough_1".to_string(), true);
+ }
+ if toughness >= 2.0 {
+ profile.insert("tough_2".to_string(), true);
+ }
+ let min_degree = g.min_degree() as f64;
+
+ if forbidden::theorem3_1(&g) {
+ profile.insert("t3_1".to_string(), true);
+ // println!("g6:t3_1:{}", line);
+ }
+
+ if forbidden::theorem3_2(&g) {
+ profile.insert("t3_2".to_string(), true);
+ // println!("g6:t3_2:{}", line);
+ }
+
+ if forbidden::corollary3_5(&g) {
+ profile.insert("c3_5".to_string(), true);
+ // println!("g6:c3_5:{}", line);
+ }
+ if forbidden::theorem85(&g) {
+ profile.insert("t85".to_string(), true);
+ // println!("g6:t85:{}", line);
+ }
+ if forbidden::theorem86(&g) {
+ profile.insert("t86".to_string(), true);
+ // println!("g6:t86:{}", line);
+ }
+ if forbidden::theorem87(&g) {
+ profile.insert("t87".to_string(), true);
+ // println!("g6:t87:{}", line);
+ }
+ if forbidden::theorem88(&g) {
+ profile.insert("t88".to_string(), true);
+ // println!("g6:t88:{}", line);
+ }
+ if forbidden::theorem96(&g) {
+ profile.insert("t96".to_string(), true);
+ // println!("g6:t96:{}", line);
+ }
+ if forbidden::conjecture17(&g) {
+ profile.insert("conj17".to_string(), true);
+ // println!("g6:conj17:{}", line);
+ }
+ if forbidden::theorem_all_2con(&g) {
+ profile.insert("all_2c".to_string(), true);
+ // println!("g6:all_2c:{}", line);
+ }
+ if toughness::theorem15(&g, toughness, min_degree) {
+ profile.insert("t15_hamiltonian".to_string(), true);
+ // println!("g6:bigalke-jung:{}", line);
+ }
+ if toughness::theorem25(&g, toughness, min_degree) {
+ profile.insert("t25_hamiltonian".to_string(), true);
+ // println!("g6:bauer:{}", line);
+ }
+ if basic::dirac_theorem(&g) {
+ profile.insert("dirac_hamiltonian".to_string(), true);
+ // println!("g6:dirac:{}", line);
+ }
+ if basic::ore_theorem(&g) {
+ profile.insert("ore_hamiltonian".to_string(), true);
+ // println!("g6:ore:{}", line);
+ }
+ if basic::posa_theorem(&g) {
+ profile.insert("posa_hamiltonian".to_string(), true);
+ // println!("g6:posa:{}", line);
+ }
+ if is_complete {
+ profile.insert("bch_hamiltonian".to_string(), true);
+ // println!("g6:bondy-chvatal:{}", line);
+ }
+
+ if is_complete && false {
+ // println!("Graph: {line}\n{g}");
+
+ let components_count = g.count_components();
+ // println!("Components count: {components_count}");
+ let min_degree = g.min_degree();
+ // println!("Minimal degree: {min_degree}");
+
+ let cutset = g.max_independent_cutset();
+ // println!("Maximal independent cutset:\n{}", cutset.graph);
+ // println!("Included vertices: {:?}", cutset.vertices);
+ // println!("Cutset cardinality: {}", cutset.cardinality);
+
+ let cycle = basic::bondy_chvatal_hamiltonian_cycle(&g);
+ print!("Hamiltonian cycle: ");
+ let start = 0;
+ let mut current = start;
+ loop {
+ print!("{}", current + 1);
+ print!(" -> ");
+ current = cycle[current];
+ if current == start {
+ // println!("{}", current + 1);
+ break;
+ }
+ }
+ }
+
+ // let _ =
+ // sqlx::query!("INSERT INTO graphs (g6) VALUES (?);", line)
+ // .execute(&db)
+ // .await;
+
+ profile
+}