From 8cc7dc96334f82c5f00317e9e4574145396fa4ad Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Wed, 9 Oct 2024 04:50:31 +0400 Subject: almost done --- graph-checker/src/compute.rs | 4 +++- graph-checker/src/main.rs | 50 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 45 insertions(+), 9 deletions(-) (limited to 'graph-checker') diff --git a/graph-checker/src/compute.rs b/graph-checker/src/compute.rs index 2d0ddcc..34d57a9 100644 --- a/graph-checker/src/compute.rs +++ b/graph-checker/src/compute.rs @@ -1,6 +1,8 @@ use crate::graph::Graph; -pub fn dominating_numbers(g: Graph) -> (String, Option, Option) { +pub async fn dominating_numbers( + g: Graph, +) -> (String, Option, Option) { let line = g.to_g6(); let mut independent_dominating = None; diff --git a/graph-checker/src/main.rs b/graph-checker/src/main.rs index 677e037..f738806 100644 --- a/graph-checker/src/main.rs +++ b/graph-checker/src/main.rs @@ -1,8 +1,8 @@ // use std::io::{self, BufRead}; -use rayon::prelude::*; +// use rayon::prelude::*; use sqlx::migrate::MigrateDatabase; // use std::sync::{Arc, Mutex}; -use std::time::Instant; +// use std::time::Instant; use tokio; mod graph; @@ -22,22 +22,56 @@ async fn main() -> Result<(), sqlx::Error> { } let db = sqlx::SqlitePool::connect(&database_url).await?; let _ = sqlx::query!( - "CREATE TABLE IF NOT EXISTS graphs (g6 VARCHAR NOT NULL);" + "CREATE TABLE IF NOT EXISTS graphs (g6 VARCHAR NOT NULL, ind_dom INT NOT NULL, forced_geod INT NOT NULL);" ) .execute(&db) .await; let gi = GengIterator::new(6); + let mut res = Vec::new(); + + const BATCH_SIZE: usize = 10000; + + loop { + let graphs = gi.take(BATCH_SIZE); + let tasks: Vec<_> = graphs + .map(|g| { + let db = db.clone(); + tokio::spawn(async move { + let (g6, ind_dom, fg) = compute::dominating_numbers(g).await; + let ind_dom = ind_dom.unwrap_or(0); + let fg = fg.unwrap_or(0); + let _ = sqlx::query!( + "INSERT INTO graphs (g6, ind_dom, forced_geod) VALUES (?, ?, ?);", + g6, ind_dom, fg + ).execute(&db).await; + }) + }) + .collect(); + let mut part = futures::future::join_all(tasks).await; + if part.len() < BATCH_SIZE { + res.append(&mut part); + break; + } + res.append(&mut part); + } + + // let elapsed = start.elapsed(); + // let time = elapsed.as_nanos(); + // let res = res.iter().map(|e| e.as_ref().unwrap()).collect::>(); + println!("len = {}", res.len()); + // println!("Time elapsed: {}s", time as f64 / 1e9); + // let res: Vec<_> = // gi.par_bridge().map(compute::dominating_numbers).collect(); // let res: Vec<_> = gi.map(compute::dominating_numbers).collect(); - for pair in &res { - if let Some(cardinality) = pair.1 { - println!("{} {:?} {:?}", pair.0, cardinality, pair.2); - } - } + // for pair in &res { + // if let Some(cardinality) = pair.1 { + // println!("{} {:?} {:?}", pair.0, cardinality, pair.2); + // } + // } // let start = Instant::now(); // let res = gi -- cgit v1.2.3