optimization_engine 0.4.0-alpha

A pure Rust framework for embedded nonconvex optimization. Ideal for robotics!
Documentation
    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)
            }
        };