Initial MT and div improvements #30
5 changed files with 71 additions and 36 deletions
|
|
@ -12,6 +12,8 @@ serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
num = "0.4"
|
num = "0.4"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
threadpool = "1.8"
|
||||||
|
num_cpus = "1.16.0"
|
||||||
|
|
||||||
[source.crates-io]
|
[source.crates-io]
|
||||||
replace-with = "vendored-sources"
|
replace-with = "vendored-sources"
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ fn main() -> Result<()> {
|
||||||
let json = fs::read_to_string(path_to_workload).unwrap();
|
let json = fs::read_to_string(path_to_workload).unwrap();
|
||||||
let workload = kauma::utils::parse::parse_json(json)?;
|
let workload = kauma::utils::parse::parse_json(json)?;
|
||||||
|
|
||||||
let response = kauma::tasks::task_distrubute(&workload)?;
|
let response = kauma::tasks::task_distribute(&workload)?;
|
||||||
println!("{}", serde_json::to_string(&response)?);
|
println!("{}", serde_json::to_string(&response)?);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -185,16 +185,61 @@ pub fn task_deploy(testcase: &Testcase) -> Result<Value> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_distrubute(testcases: &Testcases) -> Result<Responses> {
|
fn task_distribute_mt(testcases: &Testcases) -> Result<Responses> {
|
||||||
|
eprintln!("USING MULTITHREADED");
|
||||||
|
let mut responses: HashMap<String, Value> = HashMap::new();
|
||||||
|
let pool = threadpool::ThreadPool::default();
|
||||||
|
let (tx, rx) = std::sync::mpsc::channel();
|
||||||
|
for (key, testcase) in testcases.testcases.clone() {
|
||||||
|
let tx = tx.clone();
|
||||||
|
let testcase = testcase.clone();
|
||||||
|
pool.execute(move || {
|
||||||
|
tx.send((key, task_deploy(&testcase)))
|
||||||
|
.expect("could not send return value of thread to main thread")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for _ in 0..testcases.testcases.len() {
|
||||||
|
let result = match rx.recv_timeout(std::time::Duration::from_secs(60 * 5)) {
|
||||||
|
Ok(r) => r,
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("! Job timed out: {e}");
|
||||||
|
return Err(e.into());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
match result.1 {
|
||||||
|
Ok(v) => {
|
||||||
|
let _ = responses.insert(result.0, v);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("! failed to solve a challenge: {e:#}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Responses { responses })
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn task_distribute_st(testcases: &Testcases) -> Result<Responses> {
|
||||||
|
//eprintln!("USING SINGLETHREADED");
|
||||||
let mut responses: HashMap<String, Value> = HashMap::new();
|
let mut responses: HashMap<String, Value> = HashMap::new();
|
||||||
|
|
||||||
for (id, testcase) in &testcases.testcases {
|
for (id, testcase) in &testcases.testcases {
|
||||||
responses.insert(id.to_owned(), task_deploy(testcase).unwrap());
|
responses.insert(id.to_owned(), task_deploy(testcase).unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Responses {
|
Ok(Responses { responses })
|
||||||
responses: responses,
|
}
|
||||||
})
|
|
||||||
|
pub fn task_distribute(testcases: &Testcases) -> Result<Responses> {
|
||||||
|
let cpus = num_cpus::get();
|
||||||
|
//TODO: Deactivate MT for now
|
||||||
|
if cpus > 10000000000 {
|
||||||
|
task_distribute_mt(testcases)
|
||||||
|
} else {
|
||||||
|
task_distribute_st(testcases)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
@ -227,7 +272,7 @@ mod tests {
|
||||||
let expected = json!({ "responses": { "b856d760-023d-4b00-bad2-15d2b6da22fe": {"block": "ARIAAAAAAAAAAAAAAAAAgA=="}}});
|
let expected = json!({ "responses": { "b856d760-023d-4b00-bad2-15d2b6da22fe": {"block": "ARIAAAAAAAAAAAAAAAAAgA=="}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -251,7 +296,7 @@ mod tests {
|
||||||
});
|
});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -266,7 +311,7 @@ mod tests {
|
||||||
let expected = json!({ "responses": { "b856d760-023d-4b00-bad2-15d2b6da22fe": {"product": "hSQAAAAAAAAAAAAAAAAAAA=="}}});
|
let expected = json!({ "responses": { "b856d760-023d-4b00-bad2-15d2b6da22fe": {"product": "hSQAAAAAAAAAAAAAAAAAAA=="}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -284,7 +329,7 @@ mod tests {
|
||||||
}});
|
}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -304,7 +349,7 @@ mod tests {
|
||||||
}}});
|
}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -324,7 +369,7 @@ mod tests {
|
||||||
}}});
|
}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -342,7 +387,7 @@ mod tests {
|
||||||
}}});
|
}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -360,7 +405,7 @@ mod tests {
|
||||||
}}});
|
}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -378,7 +423,7 @@ mod tests {
|
||||||
}}});
|
}}});
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
serde_json::to_value(task_distrubute(&parsed)?).unwrap(),
|
serde_json::to_value(task_distribute(&parsed)?).unwrap(),
|
||||||
serde_json::to_value(expected).unwrap()
|
serde_json::to_value(expected).unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,13 @@ pub struct Testcases {
|
||||||
pub testcases: HashMap<String, Testcase>,
|
pub testcases: HashMap<String, Testcase>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Testcase {
|
pub struct Testcase {
|
||||||
pub action: String,
|
pub action: String,
|
||||||
pub arguments: Value,
|
pub arguments: Value,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Responses {
|
pub struct Responses {
|
||||||
pub responses: HashMap<String, Value>,
|
pub responses: HashMap<String, Value>,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -247,12 +247,7 @@ impl Polynomial {
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns (quotient, remainder)
|
|
||||||
pub fn div(&self, rhs: &Self) -> (Self, Self) {
|
pub fn div(&self, rhs: &Self) -> (Self, Self) {
|
||||||
// Div by zero check ommitted since data is guaranteed to be non 0
|
|
||||||
|
|
||||||
//eprintln!("{:?}, {:?}", self.polynomial.len(), rhs.polynomial.len());
|
|
||||||
|
|
||||||
if self.polynomial.len() < rhs.polynomial.len() {
|
if self.polynomial.len() < rhs.polynomial.len() {
|
||||||
return (Polynomial::new(vec![FieldElement::zero()]), self.clone());
|
return (Polynomial::new(vec![FieldElement::zero()]), self.clone());
|
||||||
}
|
}
|
||||||
|
|
@ -270,24 +265,20 @@ impl Polynomial {
|
||||||
|
|
||||||
while remainder.polynomial.len() >= divisor.polynomial.len() {
|
while remainder.polynomial.len() >= divisor.polynomial.len() {
|
||||||
let deg_diff = remainder.polynomial.len() - divisor.polynomial.len();
|
let deg_diff = remainder.polynomial.len() - divisor.polynomial.len();
|
||||||
|
|
||||||
let leading_dividend = remainder.polynomial.last().unwrap();
|
let leading_dividend = remainder.polynomial.last().unwrap();
|
||||||
let leading_divisor = divisor.polynomial.last().unwrap();
|
let leading_divisor = divisor.polynomial.last().unwrap();
|
||||||
let quot_coeff = leading_dividend / leading_divisor;
|
let quot_coeff = leading_dividend / leading_divisor;
|
||||||
|
|
||||||
quotient_coeffs[deg_diff] = quot_coeff.clone();
|
quotient_coeffs[deg_diff] = quot_coeff.clone();
|
||||||
|
|
||||||
let mut subtrahend = vec![FieldElement::zero(); deg_diff];
|
let mut pos;
|
||||||
subtrahend.extend(
|
for (i, divisor_coeff) in divisor.polynomial.iter().enumerate() {
|
||||||
divisor
|
pos = deg_diff + i;
|
||||||
.polynomial
|
let a: &FieldElement = &remainder.polynomial[pos];
|
||||||
.iter()
|
let c: &FieldElement = "_coeff;
|
||||||
.map(|x| x.clone() * quot_coeff.clone()),
|
remainder.polynomial[pos] = a + &(divisor_coeff * c);
|
||||||
);
|
}
|
||||||
let subtrahend_poly = Polynomial::new(subtrahend);
|
|
||||||
|
|
||||||
remainder = remainder + subtrahend_poly;
|
|
||||||
|
|
||||||
|
// Remove trailing zeros
|
||||||
while !remainder.polynomial.is_empty()
|
while !remainder.polynomial.is_empty()
|
||||||
&& remainder
|
&& remainder
|
||||||
.polynomial
|
.polynomial
|
||||||
|
|
@ -301,9 +292,6 @@ impl Polynomial {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if remainder.is_empty() {
|
|
||||||
remainder = Polynomial::new(vec![FieldElement::zero()]);
|
|
||||||
}
|
|
||||||
(Polynomial::new(quotient_coeffs), remainder)
|
(Polynomial::new(quotient_coeffs), remainder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue