Skip to content

Commit 30c0b33

Browse files
feat(ffi): expose configuration
1 parent f3ce238 commit 30c0b33

5 files changed

Lines changed: 86 additions & 4 deletions

File tree

bindings/kotlin/src/main/kotlin/de/softvare/ddnnife/java-utils.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,28 @@ fun getSample(result: SamplingResult): Sample {
7575
}
7676
}
7777
}
78+
79+
class DdnnifeConfig {
80+
companion object {
81+
@JvmStatic
82+
fun setDeterministic(enable: Boolean) {
83+
return de.softvare.ddnnife.setDeterministic(enable)
84+
}
85+
86+
@JvmStatic
87+
fun isDeterministic(): Boolean {
88+
return de.softvare.ddnnife.isDeterministic()
89+
}
90+
91+
@JvmStatic
92+
fun setSeed(seed: Long) {
93+
require(seed >= 0) { "Seed must be positive." }
94+
return de.softvare.ddnnife.setSeed(seed.toULong())
95+
}
96+
97+
@JvmStatic
98+
fun getSeed(): Long? {
99+
return de.softvare.ddnnife.getSeed()?.toLong()
100+
}
101+
}
102+
}

bindings/kotlin/src/test/java/de/softvare/ddnnife/JavaTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ class JavaTest {
1616
);
1717
private final Integer features = 854;
1818

19+
@Test
20+
void config() {
21+
DdnnifeConfig.setSeed(42);
22+
assertEquals(42, DdnnifeConfig.getSeed());
23+
24+
DdnnifeConfig.setDeterministic(true);
25+
assertTrue(DdnnifeConfig.isDeterministic());
26+
}
27+
1928
@Test
2029
void sat() {
2130
DdnnfMut ddnnfMut = ddnnf.asMut();

bindings/kotlin/src/test/kotlin/de/softvare/ddnnife/DdnnfTest.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,22 @@ package de.softvare.ddnnife
33
import java.math.BigInteger
44
import kotlin.test.Test
55
import kotlin.test.assertEquals
6+
import kotlin.test.assertNull
67
import kotlin.test.fail
78

89
internal class DdnnfTest {
910
private val ddnnf = Ddnnf.fromFile("../../example_input/busybox-1.18.0_c2d.nnf", null)
1011
private val features = 854
1112

13+
@Test
14+
fun config() {
15+
setSeed(42U);
16+
assertEquals(42U, getSeed());
17+
18+
setDeterministic(true);
19+
assert(isDeterministic());
20+
}
21+
1222
@Test
1323
fun sat() {
1424
val ddnnf = ddnnf.asMut()
@@ -66,11 +76,12 @@ internal class DdnnfTest {
6676
@Test
6777
fun tWise() {
6878
val result = ddnnf.sampleTWise(1u, null)
69-
when(result) {
79+
when (result) {
7080
is SamplingResult.ResultWithSample -> {
7181
val sample = result.v1
7282
assertEquals(features, sample.vars.size)
7383
}
84+
7485
else -> {
7586
fail("T-wise sample is invalid.")
7687
}
@@ -88,12 +99,12 @@ internal class DdnnfTest {
8899

89100
@Test
90101
fun trivial() {
91-
val trivialDdnnf = Ddnnf.fromFile("../../ddnnife/tests/data/stub_true.nnf", null)
92-
assert(trivialDdnnf.isTrivial())
102+
val trivialDdnnf = Ddnnf.fromFile("../../ddnnife/tests/data/stub_true.nnf", null)
103+
assert(trivialDdnnf.isTrivial())
93104
}
94105

95106
@Test
96107
fun nonTrivial() {
97-
assert(!ddnnf.isTrivial())
108+
assert(!ddnnf.isTrivial())
98109
}
99110
}

ddnnife_ffi/src/config.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use ddnnife::config;
2+
3+
/// Enables or disables deterministic operations.
4+
///
5+
/// Actually using deterministic operations requires a seed to be set.
6+
#[uniffi::export]
7+
pub fn set_deterministic(enable: bool) {
8+
config::set_deterministic(enable);
9+
}
10+
11+
/// Returns whether deterministic mode is currently enabled.
12+
#[uniffi::export]
13+
pub fn is_deterministic() -> bool {
14+
config::is_deterministic()
15+
}
16+
17+
/// Sets the seed to use for deterministic operations.
18+
/// Does **not** implicitly enable determinism.
19+
///
20+
/// Can only be called once.
21+
///
22+
/// # Panics
23+
///
24+
/// Panics when called more than once.
25+
#[uniffi::export]
26+
pub fn set_seed(seed: u64) {
27+
config::set_seed(seed);
28+
}
29+
30+
/// Returns the seed to use for random number generators.
31+
///
32+
/// Not valid when no seed has been set yet.
33+
#[uniffi::export]
34+
pub fn get_seed() -> Option<u64> {
35+
config::get_seed()
36+
}

ddnnife_ffi/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
uniffi::setup_scaffolding!();
22

33
mod cnf;
4+
pub mod config;
45
mod ddnnf;
56
mod ddnnf_mut;
67
mod statistics;

0 commit comments

Comments
 (0)