pounce-cinterface 0.2.0

C ABI for POUNCE (port of Ipopt's Interfaces/IpStdCInterface.{h,cpp}). Provides IpoptCreate / IpoptSolve / IpoptFreeProblem so existing PyIpopt / cyipopt / JuMP / AMPL clients link without source changes. Phase 11 — scaffolded; full implementation lands when the algorithm-side optimizer is solving.
Documentation
# pounce-cinterface

C ABI for POUNCE. Port of Ipopt's `Interfaces/IpStdCInterface.{h,cpp}`.

Provides the `IpoptCreate` / `IpoptSolve` / `IpoptFreeProblem` entry
points so existing PyIpopt, cyipopt, JuMP, and AMPL wrappers can link
against POUNCE without source changes. Function names and signatures
match upstream exactly: consumers swap `libipopt.{dylib,so}` for
`libpounce_cinterface.{dylib,so}`.

## Crate type

```toml
[lib]
crate-type = ["lib", "cdylib"]
```

The `cdylib` is what wrappers link against. The `make install` target
in the workspace root drops `libpounce_cinterface.{dylib,so}` into
`$PREFIX/lib` (default `$HOME/.local/lib`).

## Surface

- `IpoptCreate(n, x_L, x_U, m, g_L, g_U, nele_jac, nele_hess,
  index_style, eval_f, eval_grad_f, eval_g, eval_jac_g, eval_h)`  `IpoptProblem` handle.
- `IpoptSolve(problem, x, g, obj_val, mult_g, mult_x_L, mult_x_U,
  user_data)``ApplicationReturnStatus`.
- `IpoptFreeProblem(problem)`.
- `AddIpoptStrOption` / `AddIpoptIntOption` / `AddIpoptNumOption`  forward to the application's `OptionsList`.
- `SetIntermediateCallback`.

All entry points are `extern "C"` and `#[no_mangle]`. Pointers are raw
and the caller owns lifetimes; the `IpoptProblem` handle is opaque
(`void*` from C).

## Status

Phase 11 of the port. The FFI surface, option setters, and
`FreeIpoptProblem` / `SetIntermediateCallback` are working. `IpoptSolve`
currently returns `InternalError`; end-to-end solve through the C ABI
lands when the algorithm-side optimizer is fully driving real TNLPs
through the option-table path (it already solves real problems through
the native Rust `optimize_tnlp` entry point — see
[`pounce-nlp`](../pounce-nlp)).

## License

EPL-2.0.