#pragma once
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#define SPIR_ORDER_ROW_MAJOR 0
#define SPIR_ORDER_COLUMN_MAJOR 1
#define SPIR_STATISTICS_BOSONIC 0
#define SPIR_STATISTICS_FERMIONIC 1
#define SPIR_TWORK_FLOAT64 0
#define SPIR_TWORK_FLOAT64X2 1
#define SPIR_TWORK_AUTO -1
#define SPIR_SVDSTRAT_FAST 0
#define SPIR_SVDSTRAT_ACCURATE 1
#define SPIR_SVDSTRAT_AUTO -1
typedef struct spir_basis {
const void *_private;
} spir_basis;
typedef struct spir_kernel {
const void *_private;
} spir_kernel;
typedef struct spir_sve_result {
const void *_private;
} spir_sve_result;
typedef int StatusCode;
typedef struct spir_funcs {
const void *_private;
double beta;
} spir_funcs;
typedef struct spir_gemm_backend {
const void *_private;
} spir_gemm_backend;
typedef struct Complex64 {
double re;
double im;
} Complex64;
typedef struct spir_sampling {
const void *_private;
} spir_sampling;
#define SPIR_COMPUTATION_SUCCESS 0
#define SPIR_GET_IMPL_FAILED -1
#define SPIR_INVALID_DIMENSION -2
#define SPIR_INPUT_DIMENSION_MISMATCH -3
#define SPIR_OUTPUT_DIMENSION_MISMATCH -4
#define SPIR_NOT_SUPPORTED -5
#define SPIR_INVALID_ARGUMENT -6
#define SPIR_INTERNAL_ERROR -7
#ifdef __cplusplus
extern "C" {
#endif
void spir_basis_release(struct spir_basis *basis);
struct spir_basis *spir_basis_clone(const struct spir_basis *src);
int32_t spir_basis_is_assigned(const struct spir_basis *obj);
struct spir_basis *spir_basis_new(int statistics,
double beta,
double omega_max,
double epsilon,
const struct spir_kernel *k,
const struct spir_sve_result *sve,
int max_size,
StatusCode *status);
struct spir_basis *spir_basis_new_from_sve_and_regularizer(int statistics,
double beta,
double omega_max,
double epsilon,
double lambda,
int ypower,
double _conv_radius,
const struct spir_sve_result *sve,
const struct spir_funcs *regularizer_funcs,
int max_size,
StatusCode *status);
StatusCode spir_basis_get_size(const struct spir_basis *b, int *size);
StatusCode spir_basis_get_svals(const struct spir_basis *b, double *svals);
StatusCode spir_basis_get_stats(const struct spir_basis *b, int *statistics);
StatusCode spir_basis_get_singular_values(const struct spir_basis *b, double *svals);
StatusCode spir_basis_get_n_default_taus(const struct spir_basis *b, int *num_points);
StatusCode spir_basis_get_default_taus(const struct spir_basis *b, double *points);
StatusCode spir_basis_get_n_default_matsus(const struct spir_basis *b,
bool positive_only,
int *num_points);
StatusCode spir_basis_get_default_matsus(const struct spir_basis *b,
bool positive_only,
int64_t *points);
struct spir_funcs *spir_basis_get_u(const struct spir_basis *b, StatusCode *status);
struct spir_funcs *spir_basis_get_v(const struct spir_basis *b, StatusCode *status);
StatusCode spir_basis_get_n_default_ws(const struct spir_basis *b, int *num_points);
StatusCode spir_basis_get_default_ws(const struct spir_basis *b, double *points);
struct spir_funcs *spir_basis_get_uhat(const struct spir_basis *b, StatusCode *status);
struct spir_funcs *spir_basis_get_uhat_full(const struct spir_basis *b, StatusCode *status);
StatusCode spir_basis_get_default_taus_ext(const struct spir_basis *b,
int n_points,
double *points,
int *n_points_returned);
StatusCode spir_basis_get_n_default_matsus_ext(const struct spir_basis *b,
bool positive_only,
bool mitigate,
int L,
int *num_points_returned);
StatusCode spir_basis_get_default_matsus_ext(const struct spir_basis *b,
bool positive_only,
bool mitigate,
int n_points,
int64_t *points,
int *n_points_returned);
struct spir_basis *spir_dlr_new(const struct spir_basis *b, StatusCode *status);
struct spir_basis *spir_dlr_new_with_poles(const struct spir_basis *b,
int npoles,
const double *poles,
StatusCode *status);
StatusCode spir_dlr_get_npoles(const struct spir_basis *dlr, int *num_poles);
StatusCode spir_dlr_get_poles(const struct spir_basis *dlr, double *poles);
StatusCode spir_ir2dlr_dd(const struct spir_basis *dlr,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const double *input,
double *out);
StatusCode spir_ir2dlr_zz(const struct spir_basis *dlr,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const struct Complex64 *input,
struct Complex64 *out);
StatusCode spir_dlr2ir_dd(const struct spir_basis *dlr,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const double *input,
double *out);
StatusCode spir_dlr2ir_zz(const struct spir_basis *dlr,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const struct Complex64 *input,
struct Complex64 *out);
void spir_funcs_release(struct spir_funcs *funcs);
struct spir_funcs *spir_funcs_clone(const struct spir_funcs *src);
int32_t spir_funcs_is_assigned(const struct spir_funcs *obj);
struct spir_funcs *spir_funcs_deriv(const struct spir_funcs *funcs, int n, StatusCode *status);
struct spir_funcs *spir_funcs_from_piecewise_legendre(const double *segments,
int n_segments,
const double *coeffs,
int nfuncs,
int _order,
StatusCode *status);
struct spir_funcs *spir_funcs_get_slice(const struct spir_funcs *funcs,
int32_t nslice,
const int32_t *indices,
StatusCode *status);
StatusCode spir_funcs_get_size(const struct spir_funcs *funcs, int *size);
StatusCode spir_funcs_get_n_knots(const struct spir_funcs *funcs, int *n_knots);
StatusCode spir_funcs_get_knots(const struct spir_funcs *funcs, double *knots);
StatusCode spir_funcs_eval(const struct spir_funcs *funcs, double x, double *out);
StatusCode spir_funcs_eval_matsu(const struct spir_funcs *funcs, int64_t n, struct Complex64 *out);
StatusCode spir_funcs_batch_eval(const struct spir_funcs *funcs,
int order,
int num_points,
const double *xs,
double *out);
StatusCode spir_funcs_batch_eval_matsu(const struct spir_funcs *funcs,
int order,
int num_freqs,
const int64_t *ns,
struct Complex64 *out);
StatusCode spir_uhat_get_default_matsus(const struct spir_funcs *uhat,
int l,
bool positive_only,
bool mitigate,
int64_t *points,
int *n_points_returned);
struct spir_gemm_backend *spir_gemm_backend_new_from_fblas_lp64(const void *dgemm,
const void *zgemm);
struct spir_gemm_backend *spir_gemm_backend_new_from_fblas_ilp64(const void *dgemm64,
const void *zgemm64);
void spir_gemm_backend_release(struct spir_gemm_backend *backend);
struct spir_kernel *spir_logistic_kernel_new(double lambda, StatusCode *status);
struct spir_kernel *spir_reg_bose_kernel_new(double lambda, StatusCode *status);
StatusCode spir_kernel_get_lambda(const struct spir_kernel *kernel, double *lambda_out);
StatusCode spir_kernel_compute(const struct spir_kernel *kernel, double x, double y, double *out);
void spir_kernel_release(struct spir_kernel *kernel);
struct spir_kernel *spir_kernel_clone(const struct spir_kernel *src);
int32_t spir_kernel_is_assigned(const struct spir_kernel *obj);
StatusCode spir_kernel_get_domain(const struct spir_kernel *k,
double *xmin,
double *xmax,
double *ymin,
double *ymax);
StatusCode spir_kernel_get_sve_hints_segments_x(const struct spir_kernel *k,
double epsilon,
double *segments,
int *n_segments);
StatusCode spir_kernel_get_sve_hints_segments_y(const struct spir_kernel *k,
double epsilon,
double *segments,
int *n_segments);
StatusCode spir_kernel_get_sve_hints_nsvals(const struct spir_kernel *k,
double epsilon,
int *nsvals);
StatusCode spir_kernel_get_sve_hints_ngauss(const struct spir_kernel *k,
double epsilon,
int *ngauss);
void spir_sampling_release(struct spir_sampling *sampling);
struct spir_sampling *spir_sampling_clone(const struct spir_sampling *src);
int32_t spir_sampling_is_assigned(const struct spir_sampling *obj);
struct spir_sampling *spir_tau_sampling_new(const struct spir_basis *b,
int num_points,
const double *points,
StatusCode *status);
struct spir_sampling *spir_matsu_sampling_new(const struct spir_basis *b,
bool positive_only,
int num_points,
const int64_t *points,
StatusCode *status);
struct spir_sampling *spir_tau_sampling_new_with_matrix(int order,
int statistics,
int basis_size,
int num_points,
const double *points,
const double *matrix,
StatusCode *status);
struct spir_sampling *spir_matsu_sampling_new_with_matrix(int order,
int statistics,
int basis_size,
bool positive_only,
int num_points,
const int64_t *points,
const struct Complex64 *matrix,
StatusCode *status);
StatusCode spir_sampling_get_npoints(const struct spir_sampling *s, int *num_points);
StatusCode spir_sampling_get_taus(const struct spir_sampling *s,
double *points);
StatusCode spir_sampling_get_matsus(const struct spir_sampling *s, int64_t *points);
StatusCode spir_sampling_get_cond_num(const struct spir_sampling *s, double *cond_num);
StatusCode spir_sampling_eval_dd(const struct spir_sampling *s,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const double *input,
double *out);
StatusCode spir_sampling_eval_dz(const struct spir_sampling *s,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const double *input,
struct Complex64 *out);
StatusCode spir_sampling_eval_zz(const struct spir_sampling *s,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const struct Complex64 *input,
struct Complex64 *out);
StatusCode spir_sampling_fit_dd(const struct spir_sampling *s,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const double *input,
double *out);
StatusCode spir_sampling_fit_zz(const struct spir_sampling *s,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const struct Complex64 *input,
struct Complex64 *out);
StatusCode spir_sampling_fit_zd(const struct spir_sampling *s,
const struct spir_gemm_backend *backend,
int order,
int ndim,
const int *input_dims,
int target_dim,
const struct Complex64 *input,
double *out);
void spir_sve_result_release(struct spir_sve_result *sve);
struct spir_sve_result *spir_sve_result_clone(const struct spir_sve_result *src);
int32_t spir_sve_result_is_assigned(const struct spir_sve_result *obj);
struct spir_sve_result *spir_sve_result_new(const struct spir_kernel *k,
double epsilon,
int _lmax,
int _n_gauss,
int twork,
StatusCode *status);
StatusCode spir_sve_result_get_size(const struct spir_sve_result *sve, int *size);
struct spir_sve_result *spir_sve_result_truncate(const struct spir_sve_result *sve,
double epsilon,
int max_size,
StatusCode *status);
StatusCode spir_sve_result_get_svals(const struct spir_sve_result *sve, double *svals);
struct spir_sve_result *spir_sve_result_from_matrix(const double *K_high,
const double *K_low,
int nx,
int ny,
int order,
const double *segments_x,
int n_segments_x,
const double *segments_y,
int n_segments_y,
int n_gauss,
double epsilon,
StatusCode *status);
struct spir_sve_result *spir_sve_result_from_matrix_centrosymmetric(const double *K_even_high,
const double *K_even_low,
const double *K_odd_high,
const double *K_odd_low,
int nx,
int ny,
int order,
const double *segments_x,
int n_segments_x,
const double *segments_y,
int n_segments_y,
int n_gauss,
double epsilon,
StatusCode *status);
int spir_choose_working_type(double epsilon);
StatusCode spir_gauss_legendre_rule_piecewise_double(int n,
const double *segments,
int n_segments,
double *x,
double *w,
StatusCode *status);
StatusCode spir_gauss_legendre_rule_piecewise_ddouble(int n,
const double *segments,
int n_segments,
double *x_high,
double *x_low,
double *w_high,
double *w_low,
StatusCode *status);
#ifdef __cplusplus
} #endif