1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use num::Float;
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
pub struct Operator<'a, T> {
pub repr: &'a str,
pub bin_op: Option<BinOp<T>>,
pub unary_op: Option<fn(T) -> T>,
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug)]
pub struct BinOp<T> {
pub op: fn(T, T) -> T,
pub prio: i32,
}
pub fn make_default_operators<'a, T: Float>() -> Vec<Operator<'a, T>> {
vec![
Operator {
repr: "^",
bin_op: Some(BinOp {
op: |a: T, b| a.powf(b),
prio: 2,
}),
unary_op: None,
},
Operator {
repr: "*",
bin_op: Some(BinOp {
op: |a, b| a * b,
prio: 1,
}),
unary_op: None,
},
Operator {
repr: "/",
bin_op: Some(BinOp {
op: |a, b| a / b,
prio: 1,
}),
unary_op: None,
},
Operator {
repr: "+",
bin_op: Some(BinOp {
op: |a, b| a + b,
prio: 0,
}),
unary_op: Some(|a: T| a),
},
Operator {
repr: "-",
bin_op: Some(BinOp {
op: |a, b| a - b,
prio: 0,
}),
unary_op: Some(|a: T| (-a)),
},
Operator {
repr: "sin",
bin_op: None,
unary_op: Some(|a: T| a.sin()),
},
Operator {
repr: "cos",
bin_op: None,
unary_op: Some(|a: T| a.cos()),
},
Operator {
repr: "tan",
bin_op: None,
unary_op: Some(|a: T| a.tan()),
},
Operator {
repr: "exp",
bin_op: None,
unary_op: Some(|a: T| a.exp()),
},
Operator {
repr: "log",
bin_op: None,
unary_op: Some(|a: T| a.ln()),
},
Operator {
repr: "log2",
bin_op: None,
unary_op: Some(|a: T| a.log2()),
},
]
}