176static inline struct CoppJet3 copp_constant(double x)
178 struct CoppJet3 out = {x, 0.0, 0.0, 0.0};
187 struct CoppJet3 out = {a.v + b.v, a.d1 + b.d1, a.d2 + b.d2, a.d3 + b.d3};
196 struct CoppJet3 out = {a.v + b, a.d1, a.d2, a.d3};
205 struct CoppJet3 out = {a.v - b.v, a.d1 - b.d1, a.d2 - b.d2, a.d3 - b.d3};
214 struct CoppJet3 out = {a.v - b, a.d1, a.d2, a.d3};
223 struct CoppJet3 out = {a - b.v, -b.d1, -b.d2, -b.d3};
232 struct CoppJet3 out = {-x.v, -x.d1, -x.d2, -x.d3};
241 struct CoppJet3 out = {
243 a.d1 * b.v + a.v * b.d1,
244 a.d2 * b.v + 2.0 * a.d1 * b.d1 + a.v * b.d2,
245 a.d3 * b.v + 3.0 * (a.d2 * b.d1 + a.d1 * b.d2) + a.v * b.d3};
254 struct CoppJet3 out = {a.v * b, a.d1 * b, a.d2 * b, a.d3 * b};
263 const double inv = 1.0 / b.
v;
264 const double inv2 = inv * inv;
265 const double inv3 = inv2 * inv;
266 const double inv4 = inv3 * inv;
267 const double d1sq = b.d1 * b.d1;
268 struct CoppJet3 out = {
271 a * (2.0 * inv3 * d1sq - inv2 * b.d2),
272 a * (-6.0 * inv4 * d1sq * b.d1 + 6.0 * inv3 * b.d1 * b.d2 - inv2 * b.d3)};
281 return copp_mul_f64(a, 1.0 / b);
289 return copp_mul(a, copp_f64_div(1.0, b));
297 const double sv = sin(x.v);
298 const double cv = cos(x.v);
299 const double d1sq = x.d1 * x.d1;
300 struct CoppJet3 out = {
303 -sv * d1sq + cv * x.d2,
304 -cv * d1sq * x.d1 - 3.0 * sv * x.d1 * x.d2 + cv * x.d3};
313 const double sv = sin(x.v);
314 const double cv = cos(x.v);
315 const double d1sq = x.d1 * x.d1;
316 struct CoppJet3 out = {
319 -cv * d1sq - sv * x.d2,
320 sv * d1sq * x.d1 - 3.0 * cv * x.d1 * x.d2 - sv * x.d3};
329 const double ev = exp(x.v);
330 const double d1sq = x.d1 * x.d1;
331 struct CoppJet3 out = {
335 ev * (d1sq * x.d1 + 3.0 * x.d1 * x.d2 + x.d3)};
344 const double inv = 1.0 / x.
v;
345 const double inv2 = inv * inv;
346 const double inv3 = inv2 * inv;
347 const double d1sq = x.d1 * x.d1;
348 struct CoppJet3 out = {
351 -inv2 * d1sq + inv * x.d2,
352 2.0 * inv3 * d1sq * x.d1 - 3.0 * inv2 * x.d1 * x.d2 + inv * x.d3};
361 const double sqrtv = sqrt(x.v);
362 const double inv_sqrt = 1.0 / sqrtv;
363 const double inv_v_sqrt = inv_sqrt / x.v;
364 const double inv_v2_sqrt = inv_v_sqrt / x.v;
365 const double d1sq = x.d1 * x.d1;
366 struct CoppJet3 out = {
368 0.5 * inv_sqrt * x.d1,
369 -0.25 * inv_v_sqrt * d1sq + 0.5 * inv_sqrt * x.d2,
370 0.375 * inv_v2_sqrt * d1sq * x.d1 - 0.75 * inv_v_sqrt * x.d1 * x.d2 + 0.5 * inv_sqrt * x.d3};
380 return copp_constant(1.0);
383 const double nf = (double)n;
384 const double coeff2 = nf * (nf - 1.0);
385 const double coeff3 = coeff2 * (nf - 2.0);
386 const double dv = nf * pow(x.v, nf - 1.0);
387 const double ddv = coeff2 == 0.0 ? 0.0 : coeff2 * pow(x.v, nf - 2.0);
388 const double dddv = coeff3 == 0.0 ? 0.0 : coeff3 * pow(x.v, nf - 3.0);
389 const double d1sq = x.d1 * x.d1;
390 struct CoppJet3 out = {
393 ddv * d1sq + dv * x.d2,
394 dddv * d1sq * x.d1 + 3.0 * ddv * x.d1 * x.d2 + dv * x.d3};
Core status, memory, matrix, and shared solver option types.
CoppStatus
C ABI status code returned by COPP FFI functions.
struct CoppPath CoppPath
Opaque C handle for a library-owned Path.
enum CoppStatus copp_path_evaluate_up_to_3rd(const struct CoppPath *path, struct CoppSliceF64 s, struct CoppMatrixF64 *out_q, struct CoppMatrixF64 *out_dq, struct CoppMatrixF64 *out_ddq, struct CoppMatrixF64 *out_dddq)
Evaluate q, dq, ddq, and dddq at the supplied path parameters.
enum CoppStatus copp_path_from_waypoints(struct CoppMatrixViewF64 waypoints, struct CoppPathOptions options, struct CoppPath **out_path)
Build a waypoint spline path.
enum CoppStatus copp_path_dim(const struct CoppPath *path, size_t *out_dim)
Return the path dimension.
enum CoppStatus(* CoppPathEvaluate2ndFn)(void *user_data, size_t dim, size_t n, const double *s, double *q, double *dq, double *ddq)
C callback for evaluating q, dq, and ddq.
CoppPathOutOfRangeMode
C ABI path out-of-range behavior.
enum CoppStatus copp_path_s_range(const struct CoppPath *path, double *out_s_min, double *out_s_max)
Return the valid path parameter range.
enum CoppStatus copp_path_from_evaluator_2nd(size_t dim, double s_min, double s_max, CoppPathEvaluate2ndFn evaluate_2nd, void *user_data, struct CoppPath **out_path)
Build a path from a C callback that provides derivatives up to 2nd order.
enum CoppStatus(* CoppPathEvaluate3rdFn)(void *user_data, size_t dim, size_t n, const double *s, double *q, double *dq, double *ddq, double *dddq)
C callback for evaluating q, dq, ddq, and dddq.
void copp_path_free(struct CoppPath *path)
Release a path handle created by this module.
enum CoppStatus copp_path_from_parametric(size_t dim, double s_min, double s_max, CoppPathParametricFn evaluate, void *user_data, struct CoppPath **out_path)
Build a path from a scalar-parametric C callback.
enum CoppStatus copp_path_evaluate_up_to_2nd(const struct CoppPath *path, struct CoppSliceF64 s, struct CoppMatrixF64 *out_q, struct CoppMatrixF64 *out_dq, struct CoppMatrixF64 *out_ddq)
Evaluate q, dq, and ddq at the supplied path parameters.
enum CoppStatus copp_path_from_evaluator_3rd(size_t dim, double s_min, double s_max, CoppPathEvaluate2ndFn evaluate_2nd, CoppPathEvaluate3rdFn evaluate_3rd, void *user_data, struct CoppPath **out_path)
Build a path from C callbacks that provide derivatives up to 3rd order.
CoppPathParametrization
C ABI waypoint-spline parametrization.
enum CoppStatus copp_path_default_options(double s_min, double s_max, struct CoppPathOptions *out_options)
Write default waypoint spline options into out_options.
enum CoppStatus(* CoppPathParametricFn)(void *user_data, size_t dim, struct CoppJet3 s, struct CoppJet3 *q)
C callback for evaluating a scalar-parametric path with automatic derivatives.
@ COPP_PATH_OUT_OF_RANGE_MODE_CLAMP
Clamp query parameters into [s_min, s_max].
@ COPP_PATH_OUT_OF_RANGE_MODE_ERROR
Return an error when a query parameter is outside [s_min, s_max].
@ COPP_PATH_PARAMETRIZATION_UNIFORM
Uniform parameter spacing between waypoints.
C-compatible third-order automatic-differentiation scalar.
double d1
First derivative with respect to s.
double d3
Third derivative with respect to s.
double d2
Second derivative with respect to s.
Library-owned column-major f64 matrix returned to C.
Borrowed immutable f64 matrix passed from C to COPP.
Options for waypoint spline path construction.
size_t order
Spline order.
enum CoppPathParametrization parametrization
Waypoint parametrization mode.
struct CoppMatrixViewF64 end_state
Boundary derivatives at s_max, or empty for zero boundary derivatives.
enum CoppPathOutOfRangeMode out_of_range_mode
Behavior for out-of-range path evaluation.
struct CoppMatrixViewF64 start_state
Boundary derivatives at s_min, or empty for zero boundary derivatives.
double s_min
Lower bound of the path parameter range.
double s_max
Upper bound of the path parameter range.
Borrowed immutable f64 slice passed from C to COPP.