This library requires JDK 25 or later.
clarabel4j (Clarabel Solver for Java) is a Java library that provides an interface from the Java programming language to the native open source mathematical programming solver Clarabel. It invokes the solver through Java's Foreign Function and Memory (FFM) API.
Add the latest version from Maven Central to
your pom.xml
<dependency>
<groupId>com.ustermetrics</groupId>
<artifactId>clarabel4j</artifactId>
<version>x.y.z</version>
</dependency>
Either add the latest version of clarabel4j-native
from Maven Central to your pom.xml
<dependency>
<groupId>com.ustermetrics</groupId>
<artifactId>clarabel4j-native</artifactId>
<version>x.y.z</version>
<classifier>platform</classifier>
<scope>runtime</scope>
</dependency>
where x.y.z is the version of the library and platform is one of linux_64, windows_64, or osx_arm64. If no
classifier is specified, binaries for all platforms are included.
Or alternatively install the native solver on the machine and add the location to the java.library.path. clarabel4j
dynamically loads the native solver.
Since clarabel4j invokes some restricted methods of the FFM API,
use --enable-native-access=com.ustermetrics.clarabel4j --enable-native-access=org.scijava.nativelib or
--enable-native-access=ALL-UNNAMED (if you are not using the Java Platform Module System) to avoid warnings from the
Java runtime.
The directory ./bindings contains the Bash script generate.sh needed to generate the Java bindings. The actual
bindings are under ./src/main/java in the package com.ustermetrics.clarabel4j.bindings.
The script depends on the jextract tool, which mechanically generates the bindings from native library headers.
The bindings are generated in two steps: First, ./bindings/generate.sh --dump-includes generates the dump of the
included symbols in the includes.txt file. Second, ./bindings/generate.sh generates the actual bindings. After
generating the bindings, update the code to load the native library using NativeLoader.loadLibrary and remove any
platform-specific binding code.
Update the version in the pom.xml, create a tag, and push it by running
export VERSION=X.Y.Z
git checkout --detach HEAD
sed -i -E "s/<version>[0-9]+\-SNAPSHOT<\/version>/<version>$VERSION<\/version>/g" pom.xml
git commit -m "v$VERSION" pom.xml
git tag v$VERSION
git push origin v$VERSION
This will trigger the upload of the package to Maven Central via GitHub Actions.
Then, go to the GitHub repository releases page and update the release.
This project is based on the native open source mathematical programming solver Clarabel, which is developed and maintained by Paul Goulart (main development, maths and algorithms) and Yuwen Chen (maths and algorithms) from the Oxford Control Group of the Department of Engineering Science at the University of Oxford, and other contributors. For details see https://clarabel.org, https://github.com/oxfordcontrol/Clarabel.rs, and https://github.com/oxfordcontrol/Clarabel.cpp.