1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//! Links to `graycode.h`
use libc;
#[repr(C)]
pub struct Code {
/// Array of Gray code entries
ord: *mut libc::c_int,
/// Increment
inc: *mut libc::c_int,
}
extern "C" {
/// Returns the ith Gray code entry for a gray code of length 2^l
///
/// i: index in the Gray code table
/// l: Length of the Gray code
///
/// Return: ith gray code entry
pub fn m4ri_gray_code(i: libc::c_int, l: libc::c_int) -> libc::c_int;
/// Fils var ord and var inc with Gray code dat afor a Gray
/// code of length 2^l
///
/// ord: Will hold gray code data, must be preallocated with correct size
/// inc: Will hold some increment data, must be preallocated with correct size
/// l: logarithm of the length of Gray code
pub fn m4ri_build_code(ord: *mut libc::c_int, inc: *mut libc::c_int, l: libc::c_int);
/// Generates global code book
///
/// This function is called automatically when the shared library is loaded
///
/// Not thread safe!
pub fn m4ri_build_all_codes();
/// Destroy global code book
///
/// This function is called automatically when the shared library is unloaded
///
/// Not thread safe
pub fn m4ri_destroy_all_codes();
/// Return the optimal var `k` for the given parameters
///
/// If var c != 0, then var k for multiplication is returned,
/// else var k for inversion. The optimal var k here means $0.75 log_2(n)$
/// where `n` is `min(a,b)` for inversion and
/// `b` for multiplication.
///
/// a: Number of rows of (first) matrix
/// b: Number of columns of (first) matrix
/// c: Number of columns of second matrix (may be 0)
///
/// Returns k
pub fn m4ri_opt_k(a: libc::c_int, b: libc::c_int, c: libc::c_int) -> libc::c_int;
}