use crate::ffi;
pub struct Node {
pub(crate) raw: *mut ffi::SCIP_NODE,
}
impl Node {
#[cfg(feature = "raw")]
pub fn inner(&self) -> *mut ffi::SCIP_NODE {
self.raw
}
pub fn number(&self) -> usize {
unsafe { ffi::SCIPnodeGetNumber(self.raw) as usize }
}
pub fn depth(&self) -> usize {
unsafe { ffi::SCIPnodeGetDepth(self.raw) as usize }
}
pub fn lower_bound(&self) -> f64 {
unsafe { ffi::SCIPnodeGetLowerbound(self.raw) }
}
}
#[cfg(test)]
mod tests {
use crate::{
branchrule::{BranchRule, BranchingResult},
model::{Model, ModelRef},
};
struct NodeDataBranchRule {
model: ModelRef,
}
impl BranchRule for NodeDataBranchRule {
fn execute(
&mut self,
_candidates: Vec<crate::branchrule::BranchingCandidate>,
) -> BranchingResult {
let node = self.model.get_focus_node();
assert_eq!(node.number(), 1);
assert_eq!(node.depth(), 0);
assert!(node.lower_bound() < 6777.0);
BranchingResult::DidNotRun
}
}
#[test]
fn node_after_solving() {
let mut model = Model::new()
.hide_output()
.set_longint_param("limits/nodes", 1)
.unwrap() .include_default_plugins()
.read_prob("data/test/gen-ip054.mps")
.unwrap();
let mut br = NodeDataBranchRule {
model: ModelRef::new(&mut model),
};
model
.include_branch_rule("", "", 100000, 1000, 1., &mut br)
.solve();
}
}