1use num::Complex;
2use std::fmt::Error as FmtError;
3use std::fmt::{Display, Formatter};
4
5#[cfg(feature = "afserde")]
6use serde::{Deserialize, Serialize};
7
8#[repr(u32)]
10#[derive(Clone, Copy, Debug, PartialEq)]
11#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
12pub enum AfError {
13 SUCCESS = 0,
15 ERR_NO_MEM = 101,
18 ERR_DRIVER = 102,
20 ERR_RUNTIME = 103,
22 ERR_INVALID_ARRAY = 201,
25 ERR_ARG = 202,
27 ERR_SIZE = 203,
29 ERR_TYPE = 204,
31 ERR_DIFF_TYPE = 205,
33 ERR_BATCH = 207,
35 ERR_DEVICE = 208,
37 ERR_NOT_SUPPORTED = 301,
40 ERR_NOT_CONFIGURED = 302,
42 ERR_NO_DBL = 401,
45 ERR_NO_GFX = 402,
48 ERR_INTERNAL = 998,
52 ERR_UNKNOWN = 999,
54}
55
56#[repr(u32)]
58#[derive(Clone, Copy, Debug, PartialEq)]
59#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
60pub enum Backend {
61 DEFAULT = 0,
63 CPU = 1,
65 CUDA = 2,
67 OPENCL = 4,
69}
70
71impl Display for Backend {
72 fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
73 let text = match *self {
74 Backend::OPENCL => "OpenCL",
75 Backend::CUDA => "Cuda",
76 Backend::CPU => "CPU",
77 Backend::DEFAULT => "Default",
78 };
79 write!(f, "{}", text)
80 }
81}
82
83impl Display for AfError {
84 fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
85 let text = match *self {
86 AfError::SUCCESS => "Function returned successfully",
87 AfError::ERR_NO_MEM => "System or Device ran out of memory",
88 AfError::ERR_DRIVER => "Error in the device driver",
89 AfError::ERR_RUNTIME => "Error with the runtime environment",
90 AfError::ERR_INVALID_ARRAY => "Iput Array is not a valid object",
91 AfError::ERR_ARG => "One of the function arguments is incorrect",
92 AfError::ERR_SIZE => "Size is incorrect",
93 AfError::ERR_TYPE => "Type is not suppported by this function",
94 AfError::ERR_DIFF_TYPE => "Type of the input arrays are not compatible",
95 AfError::ERR_BATCH => "Function does not support GFOR / batch mode",
96 AfError::ERR_DEVICE => "Input does not belong to the current device",
97 AfError::ERR_NOT_SUPPORTED => "Unsupported operation/parameter option",
98 AfError::ERR_NOT_CONFIGURED => "This build of ArrayFire does not support this feature",
99 AfError::ERR_NO_DBL => "This device does not support double",
100 AfError::ERR_NO_GFX => "This build of ArrayFire has no graphics support",
101 AfError::ERR_INTERNAL => "Error either in ArrayFire or in a project upstream",
102 AfError::ERR_UNKNOWN => "Unknown Error",
103 };
104 write!(f, "{}", text)
105 }
106}
107
108#[repr(u32)]
110#[derive(Clone, Copy, Debug, PartialEq)]
111#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
112pub enum DType {
113 F32 = 0,
115 C32 = 1,
117 F64 = 2,
119 C64 = 3,
121 B8 = 4,
123 S32 = 5,
125 U32 = 6,
127 U8 = 7,
129 S64 = 8,
131 U64 = 9,
133 S16 = 10,
135 U16 = 11,
137 F16 = 12,
139}
140
141#[repr(u32)]
143#[derive(Clone, Copy, Debug, PartialEq)]
144#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
145pub enum InterpType {
146 NEAREST = 0,
148 LINEAR = 1,
150 BILINEAR = 2,
152 CUBIC = 3,
154 LOWER = 4,
156 LINEAR_COSINE = 5,
158 BILINEAR_COSINE = 6,
160 BICUBIC = 7,
162 CUBIC_SPLINE = 8,
164 BICUBIC_SPLINE = 9,
166}
167
168#[repr(u32)]
170#[derive(Clone, Copy, Debug, PartialEq)]
171#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
172pub enum BorderType {
173 ZERO = 0,
175 SYMMETRIC = 1,
177
178 CLAMP_TO_EDGE,
180
181 PERIODIC,
183}
184
185#[repr(u32)]
187#[derive(Clone, Copy, Debug, PartialEq)]
188#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
189pub enum Connectivity {
190 FOUR = 4,
192 EIGHT = 8,
194}
195
196#[repr(u32)]
198#[derive(Clone, Copy, Debug, PartialEq)]
199#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
200pub enum ConvMode {
201 DEFAULT = 0,
203 EXPAND = 1,
205}
206
207#[repr(u32)]
209#[derive(Clone, Copy, Debug, PartialEq)]
210#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
211pub enum ConvDomain {
212 AUTO = 0,
214 SPATIAL = 1,
216 FREQUENCY = 2,
218}
219
220#[repr(u32)]
222#[derive(Clone, Copy, Debug, PartialEq)]
223#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
224pub enum MatchType {
225 SAD = 0,
227 ZSAD = 1,
229 LSAD = 2,
231 SSD = 3,
233 ZSSD = 4,
235 LSSD = 5,
237 NCC = 6,
239 ZNCC = 7,
241 SHD = 8,
243}
244
245#[repr(u32)]
247#[derive(Clone, Copy, Debug, PartialEq)]
248#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
249pub enum ColorSpace {
250 GRAY = 0,
252 RGB = 1,
254 HSV = 2,
256}
257
258#[repr(u32)]
260#[derive(Clone, Copy, Debug, PartialEq)]
261#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
262pub enum MatProp {
263 NONE = 0,
265 TRANS = 1,
267 CTRANS = 2,
269 CONJ = 4,
271 UPPER = 32,
273 LOWER = 64,
275 DIAGUNIT = 128,
277 SYM = 512,
279 POSDEF = 1024,
281 ORTHOG = 2048,
283 TRIDIAG = 4096,
285 BLOCKDIAG = 8192,
287}
288
289#[allow(non_camel_case_types)]
291#[repr(u32)]
292#[derive(Clone, Copy, Debug, PartialEq)]
293#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
294pub enum NormType {
295 VECTOR_1 = 0,
297 VECTOR_INF = 1,
299 VECTOR_2 = 2,
301 VECTOR_P = 3,
303 MATRIX_1 = 4,
305 MATRIX_INF = 5,
307 MATRIX_2 = 6,
309 MATRIX_L_PQ = 7,
311}
312
313#[repr(u32)]
315#[derive(Clone, Copy, Debug, PartialEq)]
316#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
317pub enum ColorMap {
318 DEFAULT = 0,
320 SPECTRUM = 1,
322 COLORS = 2,
324 RED = 3,
326 MOOD = 4,
328 HEAT = 5,
330 BLUE = 6,
332}
333
334#[repr(u32)]
336#[derive(Clone, Copy, Debug, PartialEq)]
337#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
338pub enum YCCStd {
339 YCC_601 = 601,
341 YCC_709 = 709,
343 YCC_2020 = 2020,
345}
346
347#[repr(u32)]
349#[derive(Clone, Copy, Debug, PartialEq)]
350#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
351pub enum HomographyType {
352 RANSAC = 0,
354 LMEDS = 1,
356}
357
358#[repr(u32)]
360#[derive(Clone, Copy, Debug, PartialEq)]
361#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
362pub enum MarkerType {
363 NONE = 0,
365 POINT = 1,
367 CIRCLE = 2,
369 SQUARE = 3,
371 TRIANGLE = 4,
373 CROSS = 5,
375 PLUS = 6,
377 STAR = 7,
379}
380
381#[repr(u32)]
383#[derive(Clone, Copy, Debug, PartialEq)]
384#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
385pub enum MomentType {
386 M00 = 1, M01 = 2, M10 = 4, M11 = 8, FIRST_ORDER = 1 | 1 << 1 | 1 << 2 | 1 << 3,
396}
397
398#[repr(u32)]
400#[derive(Clone, Copy, Debug, PartialEq)]
401#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
402pub enum SparseFormat {
403 DENSE = 0,
405 CSR = 1,
407 CSC = 2,
409 COO = 3,
411}
412
413#[repr(u32)]
415#[derive(Clone, Copy, Debug, PartialEq)]
416#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
417pub enum BinaryOp {
418 ADD = 0,
420 MUL = 1,
422 MIN = 2,
424 MAX = 3,
426}
427
428#[repr(u32)]
430#[derive(Clone, Copy, Debug, PartialEq)]
431#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
432pub enum RandomEngineType {
433 PHILOX_4X32_10 = 100,
435 THREEFRY_2X32_16 = 200,
437 MERSENNE_GP11213 = 300,
439}
440
441pub const PHILOX: RandomEngineType = RandomEngineType::PHILOX_4X32_10;
443pub const THREEFRY: RandomEngineType = RandomEngineType::THREEFRY_2X32_16;
445pub const MERSENNE: RandomEngineType = RandomEngineType::MERSENNE_GP11213;
447pub const DEFAULT_RANDOM_ENGINE: RandomEngineType = PHILOX;
449
450#[cfg(feature = "afserde")]
451#[derive(Serialize, Deserialize)]
452#[serde(remote = "Complex")]
453struct ComplexDef<T> {
454 re: T,
455 im: T,
456}
457
458#[derive(Clone, Copy, Debug, PartialEq)]
460#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
461pub enum Scalar {
462 F32(f32),
464 #[cfg_attr(feature = "afserde", serde(with = "ComplexDef"))]
466 C32(Complex<f32>),
467 F64(f64),
469 #[cfg_attr(feature = "afserde", serde(with = "ComplexDef"))]
471 C64(Complex<f64>),
472 B8(bool),
474 S32(i32),
476 U32(u32),
478 U8(u8),
480 S64(i64),
482 U64(u64),
484 S16(i16),
486 U16(u16),
488}
489
490#[repr(u32)]
492#[derive(Clone, Copy, Debug, PartialEq)]
493#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
494pub enum CannyThresholdType {
495 MANUAL = 0,
497 OTSU = 1,
499}
500
501#[repr(u32)]
503#[derive(Clone, Copy, Debug, PartialEq)]
504#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
505pub enum DiffusionEq {
506 QUADRATIC = 1,
508 EXPONENTIAL = 2,
510 DEFAULT = 0,
512}
513
514#[repr(u32)]
516#[derive(Clone, Copy, Debug, PartialEq)]
517#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
518pub enum FluxFn {
519 GRADIENT = 1,
521 MCDE = 2,
523 DEFAULT = 0,
525}
526
527#[repr(u32)]
529#[derive(Clone, Copy, Debug, PartialEq)]
530#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
531pub enum TopkFn {
532 MIN = 1,
534 MAX = 2,
536 DEFAULT = 0,
538}
539
540#[repr(u32)]
542#[derive(Clone, Copy, Debug, PartialEq)]
543#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
544pub enum IterativeDeconvAlgo {
545 LANDWEBER = 1,
547 RICHARDSONLUCY = 2,
549 DEFAULT = 0,
551}
552
553#[repr(u32)]
555#[derive(Clone, Copy, Debug, PartialEq)]
556#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
557pub enum InverseDeconvAlgo {
558 TIKHONOV = 1,
560 DEFAULT = 0,
562}
563
564#[repr(u32)]
566#[derive(Clone, Copy, Debug, PartialEq)]
567#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
568pub enum ConvGradientType {
569 FILTER = 1,
571 DATA = 2,
573 BIAS = 3,
575 DEFAULT = 0,
577}
578
579#[repr(u32)]
581#[derive(Clone, Copy, Debug, PartialEq)]
582#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
583pub enum VarianceBias {
584 SAMPLE = 1,
586 POPULATION = 2,
588 DEFAULT = 0,
590}
591
592#[repr(u32)]
594#[derive(Clone, Copy, Debug, PartialEq)]
595#[cfg_attr(feature = "afserde", derive(Serialize, Deserialize))]
596pub enum CublasMathMode {
597 TENSOR_OP = 1,
599 DEFAULT = 0,
601}
602
603#[cfg(test)]
604mod tests {
605 #[cfg(feature = "afserde")]
606 mod serde_tests {
607 #[test]
608 fn test_enum_serde() {
609 use super::super::AfError;
610
611 let err_code = AfError::ERR_NO_MEM;
612 let serd = match serde_json::to_string(&err_code) {
613 Ok(serialized_str) => serialized_str,
614 Err(e) => e.to_string(),
615 };
616 assert_eq!(serd, "\"ERR_NO_MEM\"");
617
618 let deserd: AfError = serde_json::from_str(&serd).unwrap();
619 assert_eq!(deserd, AfError::ERR_NO_MEM);
620 }
621
622 #[test]
623 fn test_scalar_serde() {
624 use super::super::Scalar;
625 use num::Complex;
626
627 let scalar = Scalar::C32(Complex {
628 re: 1.0f32,
629 im: 1.0f32,
630 });
631 let serd = match serde_json::to_string(&scalar) {
632 Ok(serialized_str) => serialized_str,
633 Err(e) => e.to_string(),
634 };
635
636 let deserd: Scalar = serde_json::from_str(&serd).unwrap();
637 assert_eq!(deserd, scalar);
638 }
639 }
640}