Oakfield API Documentation 1.0.0
Numerical core APIs
Loading...
Searching...
No Matches
field.h
Go to the documentation of this file.
1
12#ifndef OAKFIELD_FIELD_H
13#define OAKFIELD_FIELD_H
14
15#include <complex.h>
16#include <stdbool.h>
17#include <stddef.h>
18#include <stdint.h>
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24#ifndef OAKFIELD_SIM_RESULT_DEFINED
25#define OAKFIELD_SIM_RESULT_DEFINED
39#endif /* OAKFIELD_SIM_RESULT_DEFINED */
40
47
57
70
78
92
109
122
123struct SimField;
124
128typedef void *(*SimFieldAllocFn)(void *userdata, size_t size);
129
133typedef void (*SimFieldFreeFn)(void *userdata, void *ptr);
134
143
147typedef struct SimFieldLayout {
148 size_t rank;
149 size_t *shape;
150 size_t *strides;
153
169
175typedef struct SimComplexDouble {
176 double re;
177 double im;
179
180#ifndef SIM_HAVE_SIMCOMPLEXDOUBLE
181#define SIM_HAVE_SIMCOMPLEXDOUBLE 1
182#endif
183
191
203SimResult sim_field_init(SimField *field, size_t rank, const size_t *shape, size_t element_size,
204 SimFieldStorage storage, const SimFieldAllocator *allocator);
205
219SimResult sim_field_init_typed(SimField *field, size_t rank, const size_t *shape,
220 SimScalarDomain scalar_domain, SimFieldStorage storage,
221 const SimFieldAllocator *allocator);
222
233SimResult sim_field_wrap(SimField *field, const SimFieldLayout *layout, size_t element_size,
234 SimFieldStorage storage, void *data);
235
249 SimScalarDomain scalar_domain, SimFieldStorage storage, void *data);
250
257
266SimResult sim_field_index_offset(const SimField *field, const size_t *indices, size_t *out_offset);
267
277SimResult sim_field_element_index(const SimField *field, const size_t *indices, size_t rank,
278 size_t *out_index);
279
287
294const void *sim_field_data_const(const SimField *field);
295
300
307size_t sim_field_bytes(const SimField *field);
308
315size_t sim_field_rank(const SimField *field);
316
323const size_t *sim_field_shape(const SimField *field);
324
331const size_t *sim_field_strides(const SimField *field);
332
338size_t sim_field_width(const SimField *field);
339
345size_t sim_field_height(const SimField *field);
346
353SimResult sim_field_index_to_xy(const SimField *field, size_t index, size_t *out_x, size_t *out_y);
354
361SimResult sim_field_xy_to_index(const SimField *field, size_t x, size_t y, size_t *out_index);
362
370
378
386
394
400size_t sim_field_components(const SimField *field);
401
409const double *sim_field_real_data_const(const SimField *field);
410int8_t *sim_field_i8_data(SimField *field);
411const int8_t *sim_field_i8_data_const(const SimField *field);
412int32_t *sim_field_i32_data(SimField *field);
413const int32_t *sim_field_i32_data_const(const SimField *field);
414int64_t *sim_field_i64_data(SimField *field);
415const int64_t *sim_field_i64_data_const(const SimField *field);
416uint8_t *sim_field_u8_data(SimField *field);
417const uint8_t *sim_field_u8_data_const(const SimField *field);
418uint32_t *sim_field_u32_data(SimField *field);
419const uint32_t *sim_field_u32_data_const(const SimField *field);
420uint64_t *sim_field_u64_data(SimField *field);
421const uint64_t *sim_field_u64_data_const(const SimField *field);
422
430const SimComplexDouble *sim_field_complex_data_const(const SimField *field);
431
432SimResult sim_field_promote_inplace_to_complex(SimField *field);
433
440SimFieldRepresentation sim_field_representation(const SimField *field);
441SimScalarDomain sim_field_scalar_domain(const SimField *field);
442SimResult sim_field_set_scalar_domain(SimField *field, SimScalarDomain domain);
443bool sim_field_storage_matches_scalar_domain(size_t element_size, SimScalarDomain domain);
444SimScalarDomain sim_scalar_domain_unknown(void);
445SimScalarDomain sim_scalar_domain_f64(void);
446SimScalarDomain sim_scalar_domain_c64(void);
447SimScalarDomain sim_scalar_domain_i8(void);
448SimScalarDomain sim_scalar_domain_i32(void);
449SimScalarDomain sim_scalar_domain_i64(void);
450SimScalarDomain sim_scalar_domain_u8(void);
451SimScalarDomain sim_scalar_domain_u32(void);
452SimScalarDomain sim_scalar_domain_u64(void);
453SimScalarDomain sim_scalar_domain_from_legacy_complex_flag(bool is_complex);
454SimScalarDomain sim_scalar_domain_from_field_representation(SimFieldRepresentation repr);
455SimScalarDomain sim_scalar_domain_from_field(const SimField *field);
456const char *sim_scalar_domain_kind_name(SimScalarDomainKind kind);
457bool sim_scalar_domain_kind_from_name(const char *text, SimScalarDomainKind *out_kind);
458const char *sim_scalar_domain_name(SimScalarDomain domain);
459bool sim_scalar_domain_from_name(const char *text, SimScalarDomain *out_domain);
460bool sim_scalar_domain_equal(SimScalarDomain lhs, SimScalarDomain rhs);
461bool sim_scalar_domain_validate(SimScalarDomain domain);
462bool sim_scalar_domain_is_complex(SimScalarDomain domain);
463bool sim_scalar_domain_is_integer(SimScalarDomain domain);
464uint32_t sim_scalar_domain_capabilities(SimScalarDomain domain);
465bool sim_scalar_domain_supports(SimScalarDomain domain, uint32_t capability_mask);
466const char *sim_field_domain_name(SimFieldDomain domain);
467const char *sim_field_value_kind_name(SimFieldValueKind kind);
468bool sim_field_domain_from_name(const char *text, SimFieldDomain *out_domain);
469bool sim_field_value_kind_from_name(const char *text, SimFieldValueKind *out_kind);
470bool sim_field_value_kind_is_complex_valued(SimFieldValueKind kind);
471bool sim_field_value_kind_has_imag_zero_constraint(SimFieldValueKind kind);
472bool sim_field_value_kind_has_spectral_real_constraint(SimFieldValueKind kind);
473bool sim_field_representation_requires_complex_storage(SimFieldRepresentation repr);
474bool sim_field_representation_has_imag_zero_constraint(SimFieldRepresentation repr);
475bool sim_field_representation_has_spectral_real_constraint(SimFieldRepresentation repr);
476SimResult sim_field_validate_representation(const SimField *field, SimFieldRepresentation repr);
477SimResult sim_field_set_representation(SimField *field, SimFieldRepresentation repr);
478#ifdef __cplusplus
479}
480#endif
481
482#endif /* OAKFIELD_FIELD_H */
size_t sim_field_bytes(const SimField *field)
Compute the total number of bytes occupied by the field.
SimResult sim_field_xy_to_index(const SimField *field, size_t x, size_t y, size_t *out_index)
Convert 2D coordinates into a linear element index.
bool sim_field_is_complex(const SimField *field)
Legacy compatibility alias for complex-storage checks.
SimScalarCapability
Bitmask describing operations supported by a scalar domain.
Definition field.h:96
@ SIM_SCALAR_CAP_NONE
Definition field.h:97
@ SIM_SCALAR_CAP_MODULO
Definition field.h:103
@ SIM_SCALAR_CAP_MULTIPLICATIVE_ARITHMETIC
Definition field.h:99
@ SIM_SCALAR_CAP_FLOOR
Definition field.h:102
@ SIM_SCALAR_CAP_CONJUGATION
Definition field.h:105
@ SIM_SCALAR_CAP_ANALYTIC_CALL
Definition field.h:104
@ SIM_SCALAR_CAP_COMPLEX_ROTATION
Definition field.h:106
@ SIM_SCALAR_CAP_ADDITIVE_ARITHMETIC
Definition field.h:98
@ SIM_SCALAR_CAP_ORDERING
Definition field.h:101
@ SIM_SCALAR_CAP_DIVISION
Definition field.h:100
@ SIM_SCALAR_CAP_POWER
Definition field.h:107
bool sim_field_storage_is_complex(const SimField *field)
Returns whether the field storage is complex (SimComplexDouble).
SimComplexDouble * sim_field_complex_data(SimField *field)
Convenience accessor for fields with complex double elements.
size_t sim_field_rank(const SimField *field)
Access the field rank.
SimResult sim_field_index_offset(const SimField *field, const size_t *indices, size_t *out_offset)
Compute the linear offset for provided indices.
const size_t * sim_field_shape(const SimField *field)
Access the shape array.
const void * sim_field_data_const(const SimField *field)
Obtain the raw data pointer (const-qualified).
double * sim_field_real_data(SimField *field)
Convenience accessor for fields with scalar double elements.
SimResult sim_field_element_index(const SimField *field, const size_t *indices, size_t rank, size_t *out_index)
Compute the linear element index for the provided indices.
void * sim_field_data(SimField *field)
Obtain the raw data pointer.
SimResult sim_field_require_complex(SimField *field)
Force a field into complex storage if it is not already using it.
size_t sim_field_components(const SimField *field)
Returns the number of scalar components per logical element.
SimScalarDomainKind
Scalar algebra domain used by IR typing and legality rules.
Definition field.h:85
@ SIM_SCALAR_DOMAIN_COMPLEX
Definition field.h:88
@ SIM_SCALAR_DOMAIN_MODULAR
Definition field.h:90
@ SIM_SCALAR_DOMAIN_UNKNOWN
Definition field.h:86
@ SIM_SCALAR_DOMAIN_INTEGER
Definition field.h:89
@ SIM_SCALAR_DOMAIN_REAL
Definition field.h:87
size_t sim_field_width(const SimField *field)
Convenience width accessor for the fastest-varying axis.
SimResult sim_field_index_to_xy(const SimField *field, size_t index, size_t *out_x, size_t *out_y)
Convert a linear element index into 2D coordinates.
void(* SimFieldFreeFn)(void *userdata, void *ptr)
Deallocation callback used by fields.
Definition field.h:133
struct SimComplexDouble SimComplexDouble
Explicit in-memory representation for a complex double scalar (re, im)
SimResult sim_field_init(SimField *field, size_t rank, const size_t *shape, size_t element_size, SimFieldStorage storage, const SimFieldAllocator *allocator)
Initialize an owning field and allocate storage.
SimFieldDomain
Domain for field representation (physical vs spectral).
Definition field.h:51
@ SIM_FIELD_DOMAIN_PHYSICAL
Definition field.h:53
@ SIM_FIELD_DOMAIN_SPECTRAL
Definition field.h:54
@ SIM_FIELD_DOMAIN_HYBRID
Definition field.h:55
@ SIM_FIELD_DOMAIN_UNKNOWN
Definition field.h:52
const size_t * sim_field_strides(const SimField *field)
Access the stride array.
size_t sim_field_height(const SimField *field)
Convenience height accessor for the next-to-fastest axis.
bool sim_field_complex_mode(const SimField *field)
Returns true if the field must behave as complex.
SimFieldStorage
Supported field storage ordering schemes.
Definition field.h:44
@ SIM_FIELD_STORAGE_ROW_MAJOR
Definition field.h:45
size_t sim_field_element_count(const SimFieldLayout *layout)
Returns the total number of scalar elements in the field layout.
SimFieldValueKind
Value kind for field scalars.
Definition field.h:61
@ SIM_FIELD_VALUE_REAL_SCALAR
Definition field.h:62
@ SIM_FIELD_VALUE_COMPLEX_SCALAR
Definition field.h:63
@ SIM_FIELD_VALUE_COMPLEX_IMAG_ZERO_CONSTRAINT
Definition field.h:66
@ SIM_FIELD_VALUE_UNKNOWN
Definition field.h:68
@ SIM_FIELD_VALUE_COMPLEX_REAL_CONSTRAINT
Definition field.h:64
SimResult sim_field_wrap(SimField *field, const SimFieldLayout *layout, size_t element_size, SimFieldStorage storage, void *data)
Initialize a non-owning view over existing data.
SimResult sim_field_allocator_default(SimFieldAllocator *allocator)
Populate allocator with libc malloc/free.
void sim_field_destroy(SimField *field)
Release all resources held by a field.
SimResult sim_field_init_typed(SimField *field, size_t rank, const size_t *shape, SimScalarDomain scalar_domain, SimFieldStorage storage, const SimFieldAllocator *allocator)
Initialize an owning field with an explicit scalar domain.
SimResult
Return codes shared by libsimcore modules.
Definition field.h:29
@ SIM_RESULT_OK
Definition field.h:30
@ SIM_RESULT_NOT_SUPPORTED
Definition field.h:35
@ SIM_RESULT_DEPENDENCY_ERROR
Definition field.h:36
@ SIM_RESULT_INVALID_STATE
Definition field.h:32
@ SIM_RESULT_TYPE_MISMATCH
Definition field.h:37
@ SIM_RESULT_NOT_FOUND
Definition field.h:34
@ SIM_RESULT_INVALID_ARGUMENT
Definition field.h:31
@ SIM_RESULT_OUT_OF_MEMORY
Definition field.h:33
void *(* SimFieldAllocFn)(void *userdata, size_t size)
Allocation callbacks used by fields.
Definition field.h:128
bool sim_field_domain_is_complex(const SimField *field)
Returns whether the field scalar-domain semantics are complex.
SimResult sim_field_wrap_typed(SimField *field, const SimFieldLayout *layout, SimScalarDomain scalar_domain, SimFieldStorage storage, void *data)
Initialize a non-owning view with an explicit scalar domain.
Explicit in-memory representation for a complex double scalar (re, im)
Definition field.h:175
double im
Definition field.h:177
double re
Definition field.h:176
Custom allocator description for field memory.
Definition field.h:138
SimFieldFreeFn release
Definition field.h:140
void * userdata
Definition field.h:141
SimFieldAllocFn allocate
Definition field.h:139
Layout description for a field.
Definition field.h:147
size_t * strides
Definition field.h:150
bool contiguous
Definition field.h:151
size_t * shape
Definition field.h:149
size_t rank
Definition field.h:148
Authoritative representation description for a field.
Definition field.h:74
SimFieldDomain domain
Definition field.h:75
SimFieldValueKind value_kind
Definition field.h:76
Owning multidimensional field.
Definition field.h:157
uint64_t magic
Definition field.h:167
SimFieldRepresentation repr
Definition field.h:165
bool owns_data
Definition field.h:163
size_t element_size
Definition field.h:159
SimFieldLayout layout
Definition field.h:158
SimFieldAllocator allocator
Definition field.h:162
SimFieldStorage storage
Definition field.h:161
void * data
Definition field.h:160
SimScalarDomain scalar_domain
Definition field.h:166
bool complex_mode
Definition field.h:164
Unified scalar-domain descriptor.
Definition field.h:116
uint64_t modulus
Definition field.h:120
bool is_signed
Definition field.h:119
uint16_t bit_width
Definition field.h:118
SimScalarDomainKind kind
Definition field.h:117