Commit 40a0f0f2 by dongshufeng

little change

parent c656429d
...@@ -58,9 +58,9 @@ dependencies = [ ...@@ -58,9 +58,9 @@ dependencies = [
[[package]] [[package]]
name = "arrow-schema" name = "arrow-schema"
version = "52.1.0" version = "52.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dab1c12b40e29d9f3b699e0203c2a73ba558444c05e388a4377208f8f9c97eee" checksum = "9e972cd1ff4a4ccd22f86d3e53e835c2ed92e0eea6a3e8eadb72b4f1ac802cf8"
dependencies = [ dependencies = [
"serde", "serde",
] ]
...@@ -114,9 +114,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" ...@@ -114,9 +114,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.16.1" version = "1.16.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
...@@ -126,9 +126,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" ...@@ -126,9 +126,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.6.1" version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
[[package]] [[package]]
name = "calamine" name = "calamine"
...@@ -147,9 +147,9 @@ dependencies = [ ...@@ -147,9 +147,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.1.6" version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
...@@ -453,7 +453,7 @@ dependencies = [ ...@@ -453,7 +453,7 @@ dependencies = [
"serde_json", "serde_json",
"tempfile", "tempfile",
"walkdir", "walkdir",
"zip 2.1.5", "zip 2.1.6",
] ]
[[package]] [[package]]
...@@ -498,7 +498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -498,7 +498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
...@@ -536,9 +536,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" ...@@ -536,9 +536,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.30" version = "1.0.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"miniz_oxide", "miniz_oxide",
...@@ -578,7 +578,7 @@ version = "0.5.9" ...@@ -578,7 +578,7 @@ version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
dependencies = [ dependencies = [
"windows-sys", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
...@@ -606,9 +606,9 @@ dependencies = [ ...@@ -606,9 +606,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.2.6" version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown",
...@@ -661,9 +661,9 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" ...@@ -661,9 +661,9 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]] [[package]]
name = "matrixmultiply" name = "matrixmultiply"
version = "0.3.8" version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"rawpointer", "rawpointer",
...@@ -816,18 +816,18 @@ dependencies = [ ...@@ -816,18 +816,18 @@ dependencies = [
[[package]] [[package]]
name = "num_enum" name = "num_enum"
version = "0.7.2" version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
dependencies = [ dependencies = [
"num_enum_derive", "num_enum_derive",
] ]
[[package]] [[package]]
name = "num_enum_derive" name = "num_enum_derive"
version = "0.7.2" version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro2", "proc-macro2",
...@@ -986,9 +986,9 @@ dependencies = [ ...@@ -986,9 +986,9 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.10.5" version = "1.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
...@@ -1029,7 +1029,7 @@ dependencies = [ ...@@ -1029,7 +1029,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
...@@ -1078,11 +1078,12 @@ dependencies = [ ...@@ -1078,11 +1078,12 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.120" version = "1.0.122"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr",
"ryu", "ryu",
"serde", "serde",
] ]
...@@ -1119,14 +1120,15 @@ dependencies = [ ...@@ -1119,14 +1120,15 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.10.1" version = "3.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand", "fastrand",
"once_cell",
"rustix", "rustix",
"windows-sys", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
...@@ -1151,9 +1153,9 @@ dependencies = [ ...@@ -1151,9 +1153,9 @@ dependencies = [
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "0.6.7" version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
[[package]] [[package]]
name = "toml_edit" name = "toml_edit"
...@@ -1266,11 +1268,11 @@ dependencies = [ ...@@ -1266,11 +1268,11 @@ dependencies = [
[[package]] [[package]]
name = "winapi-util" name = "winapi-util"
version = "0.1.8" version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
...@@ -1292,6 +1294,15 @@ dependencies = [ ...@@ -1292,6 +1294,15 @@ dependencies = [
] ]
[[package]] [[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets" name = "windows-targets"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
...@@ -1382,9 +1393,9 @@ dependencies = [ ...@@ -1382,9 +1393,9 @@ dependencies = [
[[package]] [[package]]
name = "zip" name = "zip"
version = "2.1.5" version = "2.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b895748a3ebcb69b9d38dcfdf21760859a4b0d0b0015277640c2ef4c69640e6f" checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e"
dependencies = [ dependencies = [
"arbitrary", "arbitrary",
"crc32fast", "crc32fast",
......
// flowing should as same as in sparrowzz
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt; use std::fmt;
use std::fmt::Display; use std::fmt::Display;
...@@ -391,3 +392,4 @@ pub struct Aoe { ...@@ -391,3 +392,4 @@ pub struct Aoe {
// 上面定义变量相互之间的关系 // 上面定义变量相互之间的关系
pub(crate) expr_graph: Option<ExprGraph>, pub(crate) expr_graph: Option<ExprGraph>,
} }
// above should as same as in sparrowzz
\ No newline at end of file
// flowing should as same as in sparrowzz
pub mod aoe;
pub mod solvers;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::collections::hash_map::Iter; use std::collections::hash_map::Iter;
use log::error; use log::error;
...@@ -8,9 +12,6 @@ use petgraph::graphmap::DiGraphMap; ...@@ -8,9 +12,6 @@ use petgraph::graphmap::DiGraphMap;
use eig_domain::{Measurement, MeasureValue}; use eig_domain::{Measurement, MeasureValue};
use eig_expr::{Expr, Token}; use eig_expr::{Expr, Token};
pub mod aoe;
pub mod solvers;
pub const AOE_RESULT_BUF: usize = 100; pub const AOE_RESULT_BUF: usize = 100;
const ERR_SUFFIX: &str = "_err"; const ERR_SUFFIX: &str = "_err";
...@@ -213,6 +214,10 @@ impl MeasureBuf { ...@@ -213,6 +214,10 @@ impl MeasureBuf {
} }
pub fn copy_sub(&self, ids: &HashSet<u64>, is_copy_alias: bool) -> MeasureBuf { pub fn copy_sub(&self, ids: &HashSet<u64>, is_copy_alias: bool) -> MeasureBuf {
// means all
if ids.contains(&0) {
return self.clone();
}
let v: Vec<(Option<MeasureValue>, Option<MeasureValue>, Option<MeasureValue>)> = ids.iter().map(|id| { let v: Vec<(Option<MeasureValue>, Option<MeasureValue>, Option<MeasureValue>)> = ids.iter().map(|id| {
let mv = self.current_mvs.get(id).cloned(); let mv = self.current_mvs.get(id).cloned();
let last_mv = self.last_mvs.get(id).cloned(); let last_mv = self.last_mvs.get(id).cloned();
...@@ -355,3 +360,4 @@ impl MeasureBuf { ...@@ -355,3 +360,4 @@ impl MeasureBuf {
status.is_some() && status.unwrap().discrete_value > 0 status.is_some() && status.unwrap().discrete_value > 0
} }
} }
// above should as same as in sparrowzz
\ No newline at end of file
pub use model::*; pub use model::*;
#[cfg(feature = "nlp")]
pub use nlp::*;
#[cfg(feature = "solvers")]
pub use solver::*;
pub use utils::*; pub use utils::*;
pub mod model; pub mod model;
......
// above should as same as in sparrowzz
use std::collections::HashMap; use std::collections::HashMap;
use log::{trace, warn}; use log::{trace, warn};
...@@ -1707,136 +1708,4 @@ impl SparseSolver { ...@@ -1707,136 +1708,4 @@ impl SparseSolver {
} }
} }
} }
// above should as same as in sparrowzz
#[cfg(test)] \ No newline at end of file
mod tests {
use crate::solvers::{MILP, NewtonSolver, NLP, SparseMILP, SparseSolver};
#[test]
fn test_parse() {
let x = "1";
let y: Vec<&str> = x.split('/').collect();
assert_eq!(1, y.len());
let x = "1//";
let y: Vec<&str> = x.split('/').collect();
assert_eq!(3, y.len());
let x = "3/-4/";
let y: Vec<&str> = x.split('/').collect();
assert_eq!(3, y.len());
let x = "1/";
let y: Vec<&str> = x.split('/').collect();
assert_eq!(2, y.len());
}
#[test]
fn test_solve_to_str() {
let s = "+224.7319*x1-35.5872*x2-32.8947*x4-156.25*x5=2.1;\n
-35.5872*x1+128.1798*x2-92.5926*x3=-3;\n
-92.5926*x2+126.2626*x3-33.67*x4=0.2349;\n
x4=0;\n
-156.25*x1-33.67*x4+3*x4-2*(x1+x2)=4.6651;\n
x1,x2,x3,x4,x5";
let expr_str: Vec<&str> = s.split(';').collect();
let model = SparseSolver::from_str(&expr_str).unwrap();
let to_str_temp = model.to_str();
let to_str = format!("{}\n{}", to_str_temp.0, to_str_temp.1);
// println!("{}",to_str);
let expr_str2: Vec<&str> = to_str.split(';').collect();
let str_to_model = SparseSolver::from_str(&expr_str2).unwrap();
assert_eq!(model, str_to_model);
let to_latex_temp = model.to_latex();
let to_latex = format!("{}{}", to_latex_temp.0, to_latex_temp.1);
println!("{}", to_latex)
}
#[test]
fn test_nlsolve_to_str() {
let s = "2.10000000-0.00000000-V1*(V1*(22.25068569)+V2*(-3.52348402*cos(THETA1-THETA2)+35.23484021*sin(THETA1-THETA2))+V4*(-3.25690464*cos(THETA1-THETA4)+32.56904638*sin(THETA1-THETA4))+V5*(-15.47029703*cos(THETA1-THETA5)+154.70297030*sin(THETA1-THETA5)));
0.00000000-3.00000000-V2*(V1*(-3.52348402*cos(THETA2-THETA1)+35.23484021*sin(THETA2-THETA1))+V2*(12.69106745)+V3*(-9.16758343*cos(THETA2-THETA3)+91.67583425*sin(THETA2-THETA3)));
3.23490000-3.00000000-V3*(V2*(-9.16758343*cos(THETA3-THETA2)+91.67583425*sin(THETA3-THETA2))+V3*(12.50125013)+V4*(-3.33366670*cos(THETA3-THETA4)+33.33666700*sin(THETA3-THETA4)));
PG_balancenode-4.00000000-V4*(V1*(-3.25690464*cos(THETA4-THETA1)+32.56904638*sin(THETA4-THETA1))+V3*(-3.33366670*cos(THETA4-THETA3)+33.33666700*sin(THETA4-THETA3))+V4*(9.92423804)+V5*(-3.33366670*cos(THETA4-THETA5)+33.33666700*sin(THETA4-THETA5)));
4.66510000-0.00000000-V5*(V1*(-15.47029703*cos(THETA5-THETA1)+154.70297030*sin(THETA5-THETA1))+V4*(-3.33366670*cos(THETA5-THETA4)+33.33666700*sin(THETA5-THETA4))+V5*(18.80396373));
QG1+QG2-0.00000000-V1*(V1*(--222.48437689)+V2*(-3.52348402*sin(THETA1-THETA2)-35.23484021*cos(THETA1-THETA2))+V4*(-3.25690464*sin(THETA1-THETA4)-32.56904638*cos(THETA1-THETA4))+V5*(-15.47029703*sin(THETA1-THETA5)-154.70297030*cos(THETA1-THETA5)));
-0.98610000-V2*(V1*(-3.52348402*sin(THETA2-THETA1)-35.23484021*cos(THETA2-THETA1))+V2*(--126.89785446)+V3*(-9.16758343*sin(THETA2-THETA3)-91.67583425*cos(THETA2-THETA3)));
QG3-0.98610000-V3*(V2*(-9.16758343*sin(THETA3-THETA2)-91.67583425*cos(THETA3-THETA2))+V3*(--124.99987125)+V4*(-3.33366670*sin(THETA3-THETA4)-33.33666700*cos(THETA3-THETA4)));
QG4-1.31470000-V4*(V1*(-3.25690464*sin(THETA4-THETA1)-32.56904638*cos(THETA4-THETA1))+V3*(-3.33366670*sin(THETA4-THETA3)-33.33666700*cos(THETA4-THETA3))+V4*(--99.23235038)+V5*(-3.33366670*sin(THETA4-THETA5)-33.33666700*cos(THETA4-THETA5)));
QG5-0.00000000-V5*(V1*(-15.47029703*sin(THETA5-THETA1)-154.70297030*cos(THETA5-THETA1))+V4*(-3.33366670*sin(THETA5-THETA4)-33.33666700*cos(THETA5-THETA4))+V5*(--188.02063730));
V1-1.00000000;
V3-1.00000000;
V4-1.00000000;
V5-1.00000000;
THETA4;
QG1/0.40000000-QG2/1.70000000;
V1:1,V2:1,V3:1,V4:1,V5:1,THETA1,THETA2,THETA3,THETA4,THETA5,QG1,QG2,QG3,QG4,QG5,PG_balancenode";
let expr_str: Vec<&str> = s.split(';').collect();
let model = NewtonSolver::from_str(&expr_str).unwrap();
let to_str_temp = model.to_str();
let to_str = format!("{}\n{}", to_str_temp.0, to_str_temp.1);
println!("{}", to_str);
let expr_str2: Vec<&str> = to_str.split(';').collect();
let str_to_model = NewtonSolver::from_str(&expr_str2).unwrap();
assert_eq!(model, str_to_model);
let to_latex_temp = model.to_latex();
let to_latex = format!("{}\n{}", to_latex_temp.0, to_latex_temp.1);
println!("{}", to_latex);
}
#[test]
fn test_simple_milp_to_str() {
let s = "max( 3*x2+5*x1+2*x3+(10-3)*x4+4*x5);
2*x1+(2*4)*x2+4*x3+2*x4+max(1,5)*x5 <= 5*2;
2 + x1 >= 3;
x1:1,x2:1,x3:1,x4:1,x5:1";
let expr_str: Vec<&str> = s.split(';').collect();
let model = SparseMILP::from_str(&expr_str).unwrap();
let to_str_temp = model.to_str();
let to_str = format!("{}\n{}{}", to_str_temp.0, to_str_temp.1, to_str_temp.2);
// println!("{}",to_str);
let expr_str2: Vec<&str> = to_str.split(';').collect();
let str_to_model = SparseMILP::from_str(&expr_str2).unwrap();
assert_eq!(model, str_to_model);
let to_latex_temp = model.to_latex();
let to_latex = format!("{}{}{}", to_latex_temp.0, to_latex_temp.1, to_latex_temp.2);
println!("{}", to_latex);
}
#[test]
fn test_milp_to_str() {
let expr_str = [
"max(4+1,3,0,10-3,4)", // 目标函数
"g(2, 2*4, 4, 2, max(1,5)) <= 5*2", // 约束
"g(2, 2*4, 0, 0, 3) <= 5*2", // 约束
"t(1,2,3,4,5) <= 8",
"x1:1,x2:1,x3:1,x4:1,x5:1", // 变量的名称、顺序及其类型
]
.to_vec();
let model = MILP::from_str(&expr_str).unwrap();
let to_str_temp = model.to_str();
let to_str = format!("{}\n{}{}", to_str_temp.0, to_str_temp.1, to_str_temp.2);
let expr_str2: Vec<&str> = to_str.split(';').collect();
// println!("{}",to_str);
let str_to_model = MILP::from_str(&expr_str2).unwrap();
assert_eq!(model, str_to_model);
}
#[test]
fn test_nlp_to_str() {
let s = "x1*x4*(x1+x2+x3)+x3;
x1*x2*x3*x4:[25/2e19];
x1^2+x2^2+x3^2+x4^2:[40/40];
x1:[/],x2:[1/1/3],x3:[/5],x4:[1/]";
let expr_str: Vec<&str> = s.split(';').collect();
let model = NLP::from_str(&expr_str).unwrap();
let to_str_temp = model.to_str();
let to_str = format!("{}\n{}{}", to_str_temp.0, to_str_temp.1, to_str_temp.2);
let expr_str2: Vec<&str> = to_str.split(';').collect();
let str_to_model = NLP::from_str(&expr_str2).unwrap();
assert_eq!(model, str_to_model);
let to_latex_temp = model.to_latex();
let to_latex = format!("{}{}{}", to_latex_temp.0, to_latex_temp.1, to_latex_temp.2);
println!("{}", to_latex);
}
}
// flowing should as same as in sparrowzz
use std::collections::{HashMap, VecDeque}; use std::collections::{HashMap, VecDeque};
use log::warn; use log::warn;
...@@ -767,281 +768,4 @@ pub fn read_parameters_from_str(parameters_str: &[&str]) -> Result<HashMap<Strin ...@@ -767,281 +768,4 @@ pub fn read_parameters_from_str(parameters_str: &[&str]) -> Result<HashMap<Strin
} }
Ok(parameters) Ok(parameters)
} }
// above should as same as in sparrowzz
#[cfg(test)] \ No newline at end of file
mod tests {
use std::collections::HashMap;
use eig_expr::Expr;
use eig_expr::{Operation, Token::*};
use crate::solvers::utils::merge_two_linear_expr;
use crate::solvers::{get_expr_from_fun, split_linear_expr};
#[test]
fn test_split_expr() {
let expr: Expr = "x1+x2 == x3+x4".parse().unwrap();
assert_eq!(Binary(Operation::Equal), expr.rpn[expr.rpn.len() - 1]);
let r = get_expr_from_fun(expr.rpn);
assert!(r.is_some());
let v = r.unwrap();
assert_eq!(2, v.len());
assert_eq!(3, v[0].rpn.len());
assert_eq!(3, v[1].rpn.len());
let expr: Expr = "-x1-(1.0+ 2.0)*x2 == x3+x4".parse().unwrap();
assert_eq!(Binary(Operation::Equal), expr.rpn[expr.rpn.len() - 1]);
let r = get_expr_from_fun(expr.rpn);
assert!(r.is_some());
let v = r.unwrap();
assert_eq!(2, v.len());
assert_eq!(3, v[1].rpn.len());
}
#[test]
fn test_merge_exprs() {
let expr1: Expr = "-x1-(1.0+ 2.0)*x2".parse().unwrap();
let expr2: Expr = " x3+x4".parse().unwrap();
let mut right = expr2.rpn.into();
let b = merge_two_linear_expr(expr1.rpn.into(), &mut right, Operation::Plus);
assert!(b);
let r = Expr::from_vec(right.into());
let f = r.bind4("x1", "x2", "x3", "x4").unwrap();
assert_eq!(f(2., 1., 4., 5.), 4.);
let expr1: Expr = "-x1-(1.0+ 2.0)*x2".parse().unwrap();
let expr2: Expr = " x3+x4".parse().unwrap();
let mut right = expr2.rpn.into();
let b = merge_two_linear_expr(expr1.rpn.into(), &mut right, Operation::LtOrEqual);
assert!(b);
let r = Expr::from_vec(right.into());
let f = r.bind4("x1", "x2", "x3", "x4").unwrap();
assert_eq!(f(2., 1., 4., 5.), 1.);
}
#[test]
fn test_sparse_from_str() {
use rayon::prelude::*;
let mut x_pos = HashMap::new();
x_pos.insert("x1".to_string(), 0);
x_pos.insert("x2".to_string(), 1);
x_pos.insert("x3".to_string(), 2);
x_pos.insert("x4".to_string(), 3);
x_pos.insert("x5".to_string(), 4);
let expr: Expr = "x1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(1, a.first().unwrap().0);
assert_eq!(Expr::from_vec(vec![Number(1.0)]), a.first().unwrap().1);
let expr: Expr = "x1+x2".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(1, a.first().unwrap().0);
assert_eq!(Expr::from_vec(vec![Number(1.0)]), a.first().unwrap().1);
assert_eq!(2, a.get(1).unwrap().0);
assert_eq!(Expr::from_vec(vec![Number(1.0)]), a.get(1).unwrap().1);
let expr: Expr = "x1-x2".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(1, a.first().unwrap().0);
assert_eq!(Expr::from_vec(vec![Number(1.0)]), a.first().unwrap().1);
assert_eq!(2, a.get(1).unwrap().0);
assert_eq!(Expr::from_vec(vec![Number(-1.0)]), a.get(1).unwrap().1);
let expr: Expr = "-x1-(1.0+ 2.0)*x2".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(2, a.len());
assert_eq!(1, a.first().unwrap().0);
assert_eq!(Expr::from_vec(vec![Number(-1.0)]), a.first().unwrap().1);
assert_eq!(2, a.get(1).unwrap().0);
assert_eq!(-3.0, a.get(1).unwrap().1.eval().unwrap());
let expr: Expr = "(5*1)*x1+3*x2+2*x3+(10-3)*x4+4*x5".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(5, a.len());
let c_vec: Vec<f64> = a.par_iter().map(|x| x.1.eval().unwrap()).collect();
assert_eq!(vec![5.0, 3.0, 2.0, 7.0, 4.0], c_vec);
let expr: Expr = "10*x4 + x5 + (5*1)*x1+3*x2+2*x3-3*x4+(1 + 2*1)*x5"
.parse()
.unwrap();
let r = split_linear_expr(expr.rpn, &x_pos).unwrap();
let c_vec: Vec<f64> = r.par_iter().map(|x| x.1.eval().unwrap()).collect();
assert_eq!(vec![5.0, 3.0, 2.0, 7.0, 4.0], c_vec);
let expr: Expr = "3*x2+ (5*1)*x1 + (10-3)*x4+4*x5 + 2*x3".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos).unwrap();
let c_vec: Vec<f64> = r.par_iter().map(|x| x.1.eval().unwrap()).collect();
assert_eq!(vec![5.0, 3.0, 2.0, 7.0, 4.0], c_vec);
let expr: Expr = "-(5*1)*x1-3*x2 -x3+(10-3)*x4+4*x5".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(5, a.len());
let c_vec: Vec<f64> = a.par_iter().map(|x| x.1.eval().unwrap()).collect();
assert_eq!(vec![-5.0, -3.0, -1.0, 7.0, 4.0], c_vec);
let expr: Expr = "-(5*1)*x1-3*x2 -x3+(10-3)*x4-max(1,3)*x5".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let a = r.unwrap();
assert_eq!(5, a.len());
let c_vec: Vec<f64> = a.par_iter().map(|x| x.1.eval().unwrap()).collect();
assert_eq!(vec![-5.0, -3.0, -1.0, 7.0, -3.0], c_vec);
let expr: Expr = "4513.391895-5.000000*x1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let expr: Expr = "6>=x1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_none());
let expr: Expr = "6".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let expr: Expr = "6+x1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let expr: Expr =
"36000.000000 * x2-(1-0.000000)*x1*36000.000000-(1.000000*x3-x4/1.000000)*0.250000"
.parse()
.unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_some());
let expr: Expr = "x1*x2".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert!(r.is_none());
let expr: Expr = "6-x1+ var1 * x2".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![
(0, Expr::from_vec(vec![Number(6.)])),
(1, Expr::from_vec(vec![Number(-1.)])),
(
2,
Expr::from_vec(vec![
Var("var1".into()),
Number(1.0),
Binary(Operation::Times)
])
)
],
r.unwrap()
);
let expr: Expr = "6-x1+ x2/var1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![
(0, Expr::from_vec(vec![Number(6.)])),
(1, Expr::from_vec(vec![Number(-1.)])),
(
2,
Expr::from_vec(vec![
Number(1.0),
Var("var1".into()),
Binary(Operation::Div)
])
)
],
r.unwrap()
);
let expr: Expr = "6-x1+ x2/!2".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![
(0, Expr::from_vec(vec![Number(6.)])),
(1, Expr::from_vec(vec![Number(-1.)])),
(2, Expr::from_vec(vec![Number(0.5)]))
],
r.unwrap()
);
let expr: Expr = "6-x1+ x2/!var1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![
(0, Expr::from_vec(vec![Number(6.)])),
(1, Expr::from_vec(vec![Number(-1.)])),
(
2,
Expr::from_vec(vec![
Number(1.0),
Var("var1".into()),
Unary(Operation::Fact),
Binary(Operation::Div)
])
)
],
r.unwrap()
);
let expr: Expr = "-6-x1-(5>=4)*3*x2/!var1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![
(0, Expr::from_vec(vec![Number(-6.)])),
(1, Expr::from_vec(vec![Number(-1.)])),
(
2,
Expr::from_vec(vec![
Number(-1.0),
Number(3.0),
Var("var1".into()),
Unary(Operation::Fact),
Binary(Operation::Div),
Binary(Operation::Times)
])
)
],
r.unwrap()
);
let expr: Expr = "-6-x1-((5>=4)*3*x2/!2 + (4<=1))*4".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![
(0, Expr::from_vec(vec![Number(-6.)])),
(1, Expr::from_vec(vec![Number(-1.)])),
(2, Expr::from_vec(vec![Number(-6.)]))
],
r.unwrap()
);
let expr: Expr = "log10(30-20)*x1".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(vec![(1, Expr::from_vec(vec![Number(1.)]))], r.unwrap());
let expr: Expr = "some_func(30, var1 + 1., var2)".parse().unwrap();
let r = split_linear_expr(expr.rpn, &x_pos);
assert_eq!(
vec![(
0,
Expr::from_vec(vec![
Number(30.),
Var("var1".into()),
Number(1.),
Binary(Operation::Plus),
Var("var2".into()),
Func("some_func".into(), Some(3))
])
)],
r.unwrap()
);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论