let mut buf = [0; COMMUNICATION_BUFFER];
let mut u = [0.0; NU];
loop {
let (number_of_bytes, src_addr) = socket.recv_from(&mut buf).expect("didn't receive data");
let filled_buf = &mut buf[..number_of_bytes];
let mut data = std::str::from_utf8(filled_buf).unwrap();
let received_request: serde_json::Result<OptimizationRequest> = serde_json::from_str(data);
if !received_request.is_ok() {
if data.ends_with("\n") {
data = &data[..data.len() - 1];
}
if data == "x" {
let _result = socket.send_to(
"{{\"msg\":\"Received quit command\"}}".as_bytes(),
&src_addr,
);
break;
}
continue;
}
let p: Vec<f64> = received_request.unwrap().parameter;
if p.len() != NP {
let msg = format!(
"{{\"error\":\"wrong param size (np={}, len(p)={})\"}}",
NP,
p.len()
);
let _result = socket.send_to(msg.as_bytes(), &src_addr);
continue;
}
let df = |u: &[f64], grad: &mut [f64]| -> Result<(), SolverError> {
icasadi::icasadi_grad(u, &p, grad);
Ok(())
};
let f = |u: &[f64], c: &mut f64| -> Result<(), SolverError> {
if icasadi::icasadi_cost(u, &p, c) == 0 {
Ok(())
} else {
Err(SolverError::Cost)
}
};