1 | package problems |
---|
2 | |
---|
3 | import ( |
---|
4 | // "fmt" |
---|
5 | expr "github.com_del/verdverm/go-symexpr" |
---|
6 | "math" |
---|
7 | "math/rand" |
---|
8 | ) |
---|
9 | |
---|
10 | type RangeType int |
---|
11 | |
---|
12 | const ( |
---|
13 | _ RangeType = iota |
---|
14 | Uniform |
---|
15 | Equal |
---|
16 | ) |
---|
17 | |
---|
18 | type BenchmarkVar struct { |
---|
19 | Name string |
---|
20 | Index int |
---|
21 | Rtype RangeType |
---|
22 | L, H, S float64 // low,high,step of range |
---|
23 | } |
---|
24 | |
---|
25 | type Benchmark struct { |
---|
26 | Name string |
---|
27 | TrainVars []BenchmarkVar |
---|
28 | TrainSamples int |
---|
29 | TestVars []BenchmarkVar |
---|
30 | TestSamples int |
---|
31 | |
---|
32 | Functions []string |
---|
33 | NonTrig []string |
---|
34 | FuncText string // function as text |
---|
35 | |
---|
36 | } |
---|
37 | |
---|
38 | func GenBenchmark(b Benchmark) (p *ExprProblem) { |
---|
39 | p = new(ExprProblem) |
---|
40 | p.Name = b.Name |
---|
41 | |
---|
42 | // set the function |
---|
43 | varNames := make([]string, 0) |
---|
44 | for _, v := range b.TrainVars { |
---|
45 | // fmt.Printf(" %v\n", v) |
---|
46 | varNames = append(varNames, v.Name) |
---|
47 | } |
---|
48 | eqn := expr.ParseFunc(b.FuncText, varNames) |
---|
49 | sort := eqn.Clone() |
---|
50 | rules := expr.DefaultRules() |
---|
51 | rules.GroupAddTerms = false |
---|
52 | sort = sort.Simplify(rules) |
---|
53 | p.VarNames = varNames |
---|
54 | p.FuncTree = sort |
---|
55 | |
---|
56 | trn := new(PointSet) |
---|
57 | trn.SetFN(b.Name + "_train") |
---|
58 | trn.SetID(0) |
---|
59 | trn.SetNumDim(len(varNames)) |
---|
60 | trn.SetIndepNames(varNames) |
---|
61 | trn.SetDepndNames([]string{"f(xs)"}) |
---|
62 | trn.SetPoints(GenBenchData(eqn, b.TrainVars, b.TrainSamples)) |
---|
63 | p.Train = make([]*PointSet, 1) |
---|
64 | p.Train[0] = trn |
---|
65 | |
---|
66 | tst := new(PointSet) |
---|
67 | tst.SetFN(b.Name + "_test") |
---|
68 | tst.SetID(0) |
---|
69 | tst.SetNumDim(len(varNames)) |
---|
70 | tst.SetIndepNames(varNames) |
---|
71 | tst.SetDepndNames([]string{"f(xs)"}) |
---|
72 | tst.SetPoints(GenBenchData(eqn, b.TestVars, b.TestSamples)) |
---|
73 | p.Test = make([]*PointSet, 1) |
---|
74 | p.Test[0] = tst |
---|
75 | |
---|
76 | return p |
---|
77 | } |
---|
78 | |
---|
79 | func GenBenchData(e expr.Expr, vars []BenchmarkVar, samples int) (pts []Point) { |
---|
80 | pts = make([]Point, 0) |
---|
81 | if vars[0].Rtype == Uniform { |
---|
82 | for i := 0; i < samples; i++ { |
---|
83 | input := make([]float64, len(vars)) |
---|
84 | retry: |
---|
85 | for j, v := range vars { |
---|
86 | r := rand.Float64() |
---|
87 | input[j] = (r * (v.H - v.L)) + v.L |
---|
88 | } |
---|
89 | out := e.Eval(0, input, nil, nil) |
---|
90 | |
---|
91 | if math.IsNaN(out) || math.IsInf(out, 0) || math.Abs(out) > 100000.0 { |
---|
92 | goto retry |
---|
93 | } |
---|
94 | |
---|
95 | var pnt Point |
---|
96 | pnt.SetIndeps(input) |
---|
97 | pnt.SetDepnds([]float64{out}) |
---|
98 | pts = append(pts, pnt) |
---|
99 | } |
---|
100 | } else { // RangeType == Equal |
---|
101 | counter := make([]float64, len(vars)) |
---|
102 | for j, v := range vars { |
---|
103 | counter[j] = v.L |
---|
104 | } |
---|
105 | L1, L2 := len(vars)-1, vars[len(vars)-1].L |
---|
106 | |
---|
107 | for counter[L1] <= L2 { |
---|
108 | input := make([]float64, len(vars)) |
---|
109 | copy(input, counter) |
---|
110 | |
---|
111 | out := e.Eval(0, input, nil, nil) |
---|
112 | var pnt Point |
---|
113 | pnt.SetIndeps(input) |
---|
114 | pnt.SetDepnds([]float64{out}) |
---|
115 | pts = append(pts, pnt) |
---|
116 | |
---|
117 | // increment counter |
---|
118 | for j, v := range vars { |
---|
119 | counter[j] += v.S |
---|
120 | if counter[j] > v.H { |
---|
121 | counter[j] = v.L |
---|
122 | } else { |
---|
123 | break |
---|
124 | } |
---|
125 | } |
---|
126 | } |
---|
127 | |
---|
128 | } |
---|
129 | |
---|
130 | return |
---|
131 | } |
---|
132 | |
---|
133 | var xU11 = BenchmarkVar{"x", 0, Uniform, -1.0, 1.0, 0.0} |
---|
134 | var xU22 = BenchmarkVar{"x", 0, Uniform, -2.0, 2.0, 0.0} |
---|
135 | var xU33 = BenchmarkVar{"x", 0, Uniform, -3.0, 3.0, 0.0} |
---|
136 | var xU01 = BenchmarkVar{"x", 0, Uniform, 0.0, 1.0, 0.0} |
---|
137 | var xU02 = BenchmarkVar{"x", 0, Uniform, 0.0, 2.0, 0.0} |
---|
138 | var xU04 = BenchmarkVar{"x", 0, Uniform, 0.0, 4.0, 0.0} |
---|
139 | var yU01 = BenchmarkVar{"y", 1, Uniform, 0.0, 1.0, 0.0} |
---|
140 | |
---|
141 | var xU5050 = BenchmarkVar{"x", 0, Uniform, -50.0, 50.0, 0.0} |
---|
142 | var yU5050 = BenchmarkVar{"y", 1, Uniform, -50.0, 50.0, 0.0} |
---|
143 | var zU5050 = BenchmarkVar{"z", 2, Uniform, -50.0, 50.0, 0.0} |
---|
144 | var vU5050 = BenchmarkVar{"v", 3, Uniform, -50.0, 50.0, 0.0} |
---|
145 | var wU5050 = BenchmarkVar{"w", 4, Uniform, -50.0, 50.0, 0.0} |
---|
146 | |
---|
147 | var korns5 = []BenchmarkVar{xU5050, yU5050, zU5050, vU5050, wU5050} |
---|
148 | var xyU01 = []BenchmarkVar{xU01, yU01} |
---|
149 | |
---|
150 | var xE11_01 = BenchmarkVar{"x", 0, Equal, -1.0, 1.0, 0.01} |
---|
151 | var xE22_01 = BenchmarkVar{"x", 0, Equal, -2.0, 2.0, 0.01} |
---|
152 | var xE33_01 = BenchmarkVar{"x", 0, Equal, -3.0, 3.0, 0.01} |
---|
153 | var xE11_001 = BenchmarkVar{"x", 0, Equal, -1.0, 1.0, 0.001} |
---|
154 | var xE22_001 = BenchmarkVar{"x", 0, Equal, -2.0, 2.0, 0.001} |
---|
155 | var xE33_001 = BenchmarkVar{"x", 0, Equal, -3.0, 3.0, 0.001} |
---|
156 | |
---|
157 | var xE55_4 = BenchmarkVar{"x", 0, Equal, -5.0, 5.0, 0.4} |
---|
158 | var yE55_4 = BenchmarkVar{"y", 1, Equal, -5.0, 5.0, 0.4} |
---|
159 | var xyE55_4 = []BenchmarkVar{xE55_4, yE55_4} |
---|
160 | |
---|
161 | var kozaFuncs = []string{"Add", "Mul", "Div", "Sin", "Cos", "Exp", "Log"} |
---|
162 | var kornsFuncs = []string{"Add", "Mul", "Div", "Sin", "Cos", "Exp", "Log", "Sqrt"} |
---|
163 | var vladiFuncsA = []string{"Add", "Mul", "Div"} |
---|
164 | var vladiFuncsB = []string{"Add", "Mul", "Div", "Exp"} |
---|
165 | var vladiFuncsC = []string{"Add", "Mul", "Div", "Sin", "Cos", "Exp"} |
---|
166 | |
---|
167 | var kozaFuncs_NT = []string{"Add", "Mul", "Div", "Exp", "Log"} |
---|
168 | var kornsFuncs_NT = []string{"Add", "Mul", "Div", "Exp", "Log", "Sqrt"} |
---|
169 | var vladiFuncsA_NT = []string{"Add", "Mul", "Div"} |
---|
170 | var vladiFuncsB_NT = []string{"Add", "Mul", "Div", "Exp"} |
---|
171 | var vladiFuncsC_NT = []string{"Add", "Mul", "Div", "Exp"} |
---|
172 | |
---|
173 | var BenchmarkList = []Benchmark{ |
---|
174 | Benchmark{"Koza_1", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^4 + x^3 + x^2 + x"}, |
---|
175 | Benchmark{"Koza_2", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^5 - 2x^3 + x"}, |
---|
176 | Benchmark{"Koza_3", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^6 - 2x^4 + x^2"}, |
---|
177 | |
---|
178 | Benchmark{"Nguyen_01", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^3 + x^2 + x"}, |
---|
179 | Benchmark{"Nguyen_02", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^4 + x^3 + x^2 + x"}, |
---|
180 | Benchmark{"Nguyen_03", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^5 + x^4 + x^3 + x^2 + x"}, |
---|
181 | Benchmark{"Nguyen_04", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, vladiFuncsA, vladiFuncsA_NT, "x^6 + x^5 + x^4 + x^3 + x^2 + x"}, |
---|
182 | Benchmark{"Nguyen_05", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, kozaFuncs, kozaFuncs_NT, "sin(x^2)*cos(x) - 1"}, |
---|
183 | Benchmark{"Nguyen_06", []BenchmarkVar{xU11}, 200, []BenchmarkVar{xU11}, 2000, kozaFuncs, kozaFuncs_NT, "sin(x) + sin(x + x^2)"}, |
---|
184 | Benchmark{"Nguyen_07", []BenchmarkVar{xU02}, 200, []BenchmarkVar{xU02}, 2000, kozaFuncs, kozaFuncs_NT, "ln(x+1) + ln(x^2 + 1)"}, |
---|
185 | Benchmark{"Nguyen_08", []BenchmarkVar{xU04}, 200, []BenchmarkVar{xU04}, 2000, kozaFuncs, kozaFuncs_NT, "sqrt(x)"}, |
---|
186 | Benchmark{"Nguyen_09", xyU01, 200, xyU01, 2000, kozaFuncs, kozaFuncs_NT, "sin(x) + sin(y^2)"}, |
---|
187 | Benchmark{"Nguyen_10", xyU01, 200, xyU01, 2000, kozaFuncs, kozaFuncs_NT, "2*sin(x)*cos(y)"}, |
---|
188 | Benchmark{"Nguyen_11", xyU01, 200, xyU01, 2000, kozaFuncs, kozaFuncs_NT, "x^y"}, |
---|
189 | Benchmark{"Nguyen_12", xyU01, 200, xyU01, 2000, vladiFuncsA, vladiFuncsA_NT, "x^4 - x^3 + 0.5*y^2 - y"}, |
---|
190 | |
---|
191 | Benchmark{"Pagie_1", xyE55_4, 0, xyE55_4, 0, kozaFuncs, kozaFuncs_NT, "1 / (1 + x^-4) + 1 / (1 + y^-4)"}, |
---|
192 | |
---|
193 | // 5 inputs: x,y,z,v,w |
---|
194 | Benchmark{"Korns_01", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "1.57 + 24.3*v"}, |
---|
195 | Benchmark{"Korns_02", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "0.23 + 14.2*(v+y)/3w"}, |
---|
196 | Benchmark{"Korns_03", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "-5.41 + 4.9*(v-x+y/w)/3w"}, |
---|
197 | Benchmark{"Korns_04", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "-2.3 + 0.13sin(z)"}, |
---|
198 | Benchmark{"Korns_05", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "3 + 2.13*ln(w)"}, |
---|
199 | Benchmark{"Korns_06", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "1.3 + 0.13*sqrt(x)"}, |
---|
200 | Benchmark{"Korns_07", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "213.80940889*(1 - e^(-0.54723748542*x))"}, |
---|
201 | Benchmark{"Korns_08", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "6.87 + 11*sqrt(7.23*x*v*w)"}, |
---|
202 | Benchmark{"Korns_09", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "(sqrt(x)/ln(y)) * (e^z / v^2)"}, |
---|
203 | Benchmark{"Korns_10", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "0.81 + 24.3*(2y+3*z^2)/(4*(v)^3+5*(w)^4)"}, |
---|
204 | Benchmark{"Korns_11", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "6.87 + 11*cos(7.23*x^3)"}, |
---|
205 | Benchmark{"Korns_12", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "2 - 2.1*cos(9.8*x)*sin(1.3*w)"}, |
---|
206 | Benchmark{"Korns_13", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "32 - 3*(tan(x)*tan(z))/(tan(y)*tan(v))"}, |
---|
207 | Benchmark{"Korns_14", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "22 - 4.2*(cos(x)-tan(y))*(tanh(z)/sin(v))"}, |
---|
208 | Benchmark{"Korns_15", korns5, 200, korns5, 2000, kornsFuncs, kornsFuncs_NT, "12 - 6*(tan(x)/e^y)(ln(z)-tan(v))"}, |
---|
209 | |
---|
210 | Benchmark{"Keijzer_01", []BenchmarkVar{xE11_01}, 0, []BenchmarkVar{xE11_001}, 0, vladiFuncsA, vladiFuncsA_NT, "0.3*x*sin(2*PI*x)"}, |
---|
211 | Benchmark{"Keijzer_02", []BenchmarkVar{xE22_01}, 0, []BenchmarkVar{xE22_001}, 0, vladiFuncsA, vladiFuncsA_NT, "0.3*x*sin(2*PI*x)"}, |
---|
212 | Benchmark{"Keijzer_03", []BenchmarkVar{xE33_01}, 0, []BenchmarkVar{xE33_001}, 0, vladiFuncsA, vladiFuncsA_NT, "0.3*x*sin(2*PI*x)"}, |
---|
213 | // Benchmark{"Keijzer_04", "x", "E[0,10,0.05]", "x^3*e^-x*cos(x)*sin(x)*((sin(x))^2*cos(x) - 1)"}, |
---|
214 | // Benchmark{"Keijzer_05", "x,y,z", "x,z: U[-1,1,1000] y: U[1,2,1000]", "(30*x*z) / ((x-10)*y^2)"}, |
---|
215 | // // Benchmark{"Keijzer_06", "x", "E[1,50,1]", "\\SUM_i^x (1/i)"}, |
---|
216 | // Benchmark{"Keijzer_07", "x", "E[1,100,1]", "ln(x)"}, |
---|
217 | // Benchmark{"Keijzer_08", "x", "E[0,100,1]", "sqrt(x)"}, |
---|
218 | // // arcsinh(x) == ln(x+sqrt(x^2+1)) |
---|
219 | // Benchmark{"Keijzer_09", "x", "E[0,100,1]", "ln(x+sqrt(x^2+1))"}, |
---|
220 | // Benchmark{"Keijzer_10", "x,y", "U[0,1,100]", "x^y"}, |
---|
221 | // // xy ? sin((x-1)(y-1)) |
---|
222 | // // Benchmark{"Keijzer_11", "x,y", "U[-3,3,20]", "xy ? sin((x-1)*(y-1))"}, |
---|
223 | // Benchmark{"Keijzer_12", "x,y", "U[-3,3,20]", "x^4 - x^3 + 0.5*y^2 - y "}, |
---|
224 | // Benchmark{"Keijzer_13", "x,y", "U[-3,3,20]", "6*sin(x)*cos(y)"}, |
---|
225 | // Benchmark{"Keijzer_14", "x,y", "U[-3,3,20]", "8 / (2 + x^2 + y^2) "}, |
---|
226 | // Benchmark{"Keijzer_15", "x,y", "U[-3,3,20]", "0.2*x^3 + 0.5*y^2 - y - x "}, |
---|
227 | |
---|
228 | // // (e^{-(x-1)^2}) / (1.2 + (y-2.5)^2) |
---|
229 | // Benchmark{"Vladislavleva_1", "x,y", "?U[0.3,4,10]?", "(e^{-(x-1)^2}) / (1.2 + (y-2.5)^2)"}, |
---|
230 | // Benchmark{"Vladislavleva_2", "x", "E[0.05,10,0.1]", "e^-x* x^3 * (cos(x)*sin(x)) * (cos(x)*(sin(x))^2-1)"}, |
---|
231 | // Benchmark{"Vladislavleva_3", "x,y", "x: E[0.05,10,0.1] y: E[0.05,10.05,2]", "e^-y * x^3 * (cos(x)*sin(x)) * (cos(x)*(sin(x))^2-1)"}, |
---|
232 | // // Benchmark{"Vladislavleva_4", "x_i", " U[0.05, 6.05, 1024]", "10 / (5 + \\SUM_1^5 (x_i - 3)^2)"}, |
---|
233 | // Benchmark{"Vladislavleva_5", "x,y,z", "x,z: U[0.05,2,300] y: U[1,2,300]", "(30*(x-1)*(z-1)) / (y^2*(x-10)) "}, |
---|
234 | // Benchmark{"Vladislavleva_6", "x,y", "U[0.1,5.9,30]", "6*sin(x)*cos(y)"}, |
---|
235 | // Benchmark{"Vladislavleva_7", "x,y", "U[0.05,6.05,300]", "(x-3)*(y-3) + 2sin((x-4)*(y-4))"}, |
---|
236 | // Benchmark{"Vladislavleva_8", "x,y", "U[0.05,6.05,50]", "((x-3)^4 + (y-3)^3 - (y-3)) / ((y-2)^4 + 10)"}, |
---|
237 | } |
---|