diff options
| author | Andrew Guschin <guschin@altlinux.org> | 2024-09-11 13:35:26 +0400 |
|---|---|---|
| committer | Andrew Guschin <guschin@altlinux.org> | 2024-09-11 13:35:26 +0400 |
| commit | aa372ee41dff36de5cb94fbb677464658eef2e46 (patch) | |
| tree | 7171459bd61f224c243dd56c0bb9ed0daba35dfe /graph-checker/src/compute.rs | |
| parent | 8fb4ba6c422c6941189791a5cc4bfa08d16cb6f9 (diff) | |
chore: extracted theorem checks to separate function
Diffstat (limited to 'graph-checker/src/compute.rs')
| -rw-r--r-- | graph-checker/src/compute.rs | 252 |
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 +} |