pub use libc;
use core::ffi::{c_int, c_long, c_void};
use libc::FILE;
pub type Evaluate = Option<
unsafe extern "C" fn(
data: *mut c_void,
samples: c_int,
x: *const f64,
p: *const f64,
fx: *mut f64,
dfdx: *mut f64,
dfdp: *mut f64,
),
>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Mode {
#[default]
None = 0,
Diagonal = 1,
BlockDiagonal = 2,
Diagonals = 3,
Full = 4,
}
#[derive(Debug, Clone, Copy, Default)]
#[non_exhaustive]
pub enum Criterion {
RelP = 0,
RelPOrAbsP = 1,
RelX = 2,
RelXOrAbsX = 3,
RelPAndRelX = 4,
#[default]
RelPOrAbsPAndRelXOrAbsX = 5,
ChiSquared = 6,
}
#[derive(Debug, Clone, Copy, Default)]
pub enum Verbosity {
#[default]
Silent = 0,
ParameterMean = 1,
ParameterCovariance = 2,
IndividualSteps = 3,
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dcdchi(chisq: f64, nu: f64, p: *mut f64, q: *mut f64, ierr: *mut c_long) {
unsafe {
dgami(0.5 * nu, 0.5 * chisq, p, q, ierr);
}
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dgami(a: f64, x: f64, pans: *mut f64, qans: *mut f64, ierr: *mut c_long) {
unsafe {
(*pans, *ierr) = if x >= 0.0 && a > 0.0 {
(special::Gamma::inc_gamma(x, a), false.into())
} else {
(f64::NAN, true.into())
};
*qans = 1.0 - *pans;
}
}
unsafe extern "C" {
pub safe fn stdin_file() -> *mut FILE;
pub safe fn stdout_file() -> *mut FILE;
pub safe fn stderr_file() -> *mut FILE;
#[doc(hidden)]
pub unsafe fn dpotrf(uplo: *const i8, n: c_int, a: *mut f64, lda: c_int, info: *mut c_int);
#[doc(hidden)]
pub unsafe fn dtrmv(
uplo: *const i8,
transa: *const i8,
diag: *const i8,
n: c_int,
a: *const f64,
lda: c_int,
x: *mut f64,
incx: c_int,
);
pub safe fn oefpil_tilemap_diagtiles_new(variables: c_int) -> *mut c_int;
pub unsafe fn oefpil_tcm_diag_new(
samples: c_int,
variables: c_int,
map: *mut c_int,
) -> *mut f64;
pub unsafe fn oefpil_tcm_diag_set_tile_diag(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row_column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil_tcm_blockdiag_new(
samples: c_int,
variables: c_int,
map: *mut c_int,
) -> *mut f64;
pub unsafe fn oefpil_tcm_blockdiag_set_tile_diag(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row_column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil_tcm_blockdiag_set_tile_half(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row_column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil_tcm_blockdiag_set_tile_full(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row_column: c_int,
fields: *const f64,
);
pub safe fn oefpil_tilemap_alltiles_new(bn: c_int) -> *mut c_int;
pub unsafe fn oefpil_tcm_diags_new(
samples: c_int,
variables: c_int,
map: *mut c_int,
) -> *mut f64;
pub unsafe fn oefpil_tcm_diags_set_tile_diag(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row: c_int,
column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil_tcm_full_new(
samples: c_int,
variables: c_int,
map: *mut c_int,
) -> *mut f64;
pub unsafe fn oefpil_tcm_full_set_tile_diag(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row: c_int,
column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil_tcm_full_set_tile_half(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row: c_int,
column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil_tcm_full_set_tile_full(
samples: c_int,
variables: c_int,
tcm: *mut f64,
map: *mut c_int,
row: c_int,
column: c_int,
fields: *const f64,
);
pub unsafe fn oefpil(
evaluate: Evaluate,
data: *mut c_void,
is_implicit: c_int,
parameters: c_int,
parameter_mean: *mut f64,
parameter_covariance: *mut f64,
samples: c_int,
x_variables: c_int,
x_sample: *const f64,
y_sample: *const f64,
x_mean: *mut f64,
y_mean: *mut f64,
covariance: *const f64,
covariance_mode: c_int,
covariance_map: *const c_int,
iteration_limit: c_int,
tolerance: f64,
verbosity: c_int,
logfile: *mut FILE,
chi_squared: *mut f64,
criterion: c_int,
info: *mut c_int,
iterations: *mut c_int,
chi_squared_reduced: *mut f64,
relative: bool,
chi_squared_p_value: *mut f64,
);
}