1#ifndef LMMC_STD_STDLIB_INTERNAL_H
2#define LMMC_STD_STDLIB_INTERNAL_H
15static inline int lmmc_std_vec_is_empty(
const lmmc_vec_t* out)
20static inline int lmmc_std_mat_is_empty(
const lmmc_mat_t* out)
22 return out && out->
rows == 0 && out->
cols == 0 && out->
stride == 0 &&
33 return out && out->
rows == 0 && out->
cols == 0 && out->
stride == 0 &&
53static inline int lmmc_std_real_is_finite(
lmmc_real_t value)
55 return isfinite((
double)value);
58static inline int lmmc_std_real_array_is_finite(
const lmmc_real_t* values,
61 for (
size_t i = 0; i < count; ++i) {
62 if (!lmmc_std_real_is_finite(values[i])) {
return 0; }
67static inline int lmmc_std_complex_is_finite(
const lmmc_complex_t* z)
69 return z && lmmc_std_real_is_finite(z->
real) &&
70 lmmc_std_real_is_finite(z->
imag);
73static inline uint64_t lmmc_std_hash_mix64(uint64_t value)
76 value *= UINT64_C(0xbf58476d1ce4e5b9);
78 value *= UINT64_C(0x94d049bb133111eb);
83static inline uint64_t lmmc_std_real_hash_bits(
lmmc_real_t value)
89 memcpy(&bits, &value,
sizeof(value));
90 return lmmc_std_hash_mix64(bits);
93static inline int lmmc_std_bool_is_valid(
int value)
95 return value == 0 || value == 1;
98static inline uint64_t lmmc_std_text_hash_bytes(
const char* value)
100 uint64_t hash = UINT64_C(1469598103934665603);
101 const unsigned char* cursor = (
const unsigned char*)value;
103 hash ^= (uint64_t)(*cursor);
104 hash *= UINT64_C(1099511628211);
107 return lmmc_std_hash_mix64(hash);
113 for (
size_t i = 0; i < a->
rows; ++i) {
114 for (
size_t j = 0; j < a->
cols; ++j) {
115 if (!lmmc_std_real_is_finite(a->
data[i * a->
stride + j])) {
125 if (!lmmc_vec_descriptor_is_valid(v)) {
132static inline int lmmc_std_compare_eval(
lmmc_real_t lhs,
137 if (!out) {
return 0; }
140 *out = (uint8_t)(lhs == rhs);
144 *out = (uint8_t)(lhs != rhs);
148 *out = (uint8_t)(lhs < rhs);
152 *out = (uint8_t)(lhs <= rhs);
156 *out = (uint8_t)(lhs > rhs);
160 *out = (uint8_t)(lhs >= rhs);
167static inline lmmc_status_t lmmc_std_bool_vec_create(
size_t size,
172 if (!lmmc_safe_mul_size(size,
sizeof(uint8_t), &bytes)) {
177 memset(out->
data, 0, bytes);
183static inline lmmc_status_t lmmc_std_bool_mat_create(
size_t rows,
190 if (!lmmc_safe_mul_size(rows, cols, &count) ||
191 !lmmc_safe_mul_size(count,
sizeof(uint8_t), &bytes)) {
196 memset(out->
data, 0, bytes);
204static inline lmmc_status_t lmmc_std_require_finite_eig_result(
209 status = lmmc_std_require_finite_vec(&result->
real_parts);
211 status = lmmc_std_require_finite_vec(&result->
imag_parts);
213 status = lmmc_std_require_finite_mat(&result->
vectors_real);
215 return lmmc_std_require_finite_mat(&result->
vectors_imag);
218static inline lmmc_status_t lmmc_std_require_finite_svd_result(
223 status = lmmc_std_require_finite_mat(&result->
U);
225 status = lmmc_std_require_finite_vec(&result->
sigma);
227 return lmmc_std_require_finite_mat(&result->
Vt);
234 status = lmmc_std_require_finite_mat(src);
249 status = lmmc_std_require_finite_vec(src);
260static inline int lmmc_std_real_is_integer(
lmmc_real_t value)
262 double as_double = (double)value;
263 return isfinite(as_double) && floor(as_double) == as_double;
272 if (!lmmc_std_real_is_finite(base) ||
273 !lmmc_std_real_is_finite(exponent)) {
279 if (base < (
lmmc_real_t)0 && !lmmc_std_real_is_integer(exponent)) {
282 value = pow((
double)base, (
double)exponent);
295 if (!src || !src->
data || src->
size == 0 || rows == 0 || cols == 0 ||
302 for (
size_t i = 0; i < src->
size; ++i) {
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
lmmc_status_t lmmc_mat_copy(const lmmc_mat_t *src, lmmc_mat_t *dst)
逐元素复制矩阵内容:dst = src。
lmmc_status_t lmmc_mat_create(size_t rows, size_t cols, lmmc_mat_t *out_mat)
创建 rows x cols 的零矩阵。
lmmc_status_t lmmc_vec_create(size_t size, lmmc_vec_t *out_vec)
创建长度为 size 的零向量。
lmmc_status_t lmmc_vec_copy(const lmmc_vec_t *src, lmmc_vec_t *dst)
逐元素复制向量内容:dst = src。
void lmmc_mat_destroy(lmmc_mat_t *mat)
销毁矩阵,释放其拥有的缓冲区并清零结构体字段。
void lmmc_vec_destroy(lmmc_vec_t *vec)
销毁向量,释放其拥有的缓冲区并清零字段。
一般实矩阵完整特征分解结果(特征值 + 特征向量).
void * lmmc_memory_alloc(size_t size)
Private recoverable allocator for persistent LMMC ownership.
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_OUT_OF_RANGE