Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2929_PrioritizedGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.PGE/3.3/levmar32/src/go-levmar/levmar.go @ 16666

Last change on this file since 16666 was 16666, checked in by hmaislin, 5 years ago

#2929: Modified make / folder structure to build original app, added x86 dll

File size: 5.8 KB
Line 
1package problems
2
3// #cgo CFLAGS: -ggdb -fpic -m32 -pthread -Wno-implicit-function-declaration
4// #cgo LDFLAGS: -L./levmar-2.6 -L./levmar-2.6/libs32 -lm -llevmar32 -llapack -lblas -lf2c -ltmglib
5// #include "levmar_h.h"
6// #include "stack.h"
7import "C"
8
9import (
10  . "go-pge/problems"
11  expr "go-symexpr"
12  "reflect"
13  "unsafe"
14)
15
16type C_double C.double
17
18func MakeCDouble(f float64) C_double {
19  return C_double(C.double(f))
20}
21
22type callback_data struct {
23  Train []*PointSet
24  Test  []*PointSet
25  E     expr.Expr
26  J     []expr.Expr
27  S     [][]int
28  Coeff []float64
29  Task  ExprProblemType
30}
31
32func LevmarExpr(e expr.Expr, searchDim int, task ExprProblemType, guess []float64, train, test []*PointSet) []float64 {
33
34  ps := train[0].NumPoints()
35  PS := len(train) * ps
36
37  c := make([]float64, len(guess))
38  var cd callback_data
39  cd.Train = train
40  cd.Test = test
41  cd.E = e
42  cd.Coeff = c
43  cd.Task = task
44  cd.J = make([]expr.Expr, len(guess))
45  for i, _ := range cd.J {
46    deriv := e.DerivConst(i)
47    // simp := deriv.Simplify(expr.DefaultRules())
48    //fmt.Printf("Levmar4 %v\n", deriv)
49    cd.J[i] = deriv
50  }
51
52  // c/levmar inputs
53  coeff := make([]C.double, len(guess))
54  for i, g := range guess {
55    coeff[i] = C.double(g)
56    //fmt.Printf("Levmar3 %v\n", coeff[i])
57  }
58
59  y := make([]C.double, PS)
60  for i1, T := range train {
61    for i2, p := range T.Points() {
62      i := i1*ps + i2
63      y[i] = C.double(p.Depnd(searchDim))
64
65      //fmt.Printf("Levmar2 %v %v\n", i, y[i])
66    }
67  }
68  //fmt.Printf("*")
69
70  ya := (*C.double)(unsafe.Pointer(&y[0]))
71  ca := (*C.double)(unsafe.Pointer(&coeff[0]))
72  ni := C.int(PS)
73  mi := C.int(len(c))
74
75  // C.levmar_dif(ya, ca, mi, ni, unsafe.Pointer(&cd))
76  C.levmar_der(ya, ca, mi, ni, unsafe.Pointer(&cd))
77
78  for i, _ := range coeff {
79    //fmt.Printf("Levmar1 %v\n", i)
80    c[i] = float64(coeff[i])
81  }
82  return c
83}
84
85//export Callback_func
86func Callback_func(p, x *C.double, e unsafe.Pointer) {
87  //fmt.Printf("+")
88
89  cd := *(*callback_data)(e)
90  eqn := cd.E
91  coeff := cd.Coeff
92
93  M1 := len(cd.Train)
94  M2 := cd.Train[0].NumPoints()
95  M3 := len(coeff)
96  M23 := M2 * M3
97  MA := M1 * M23
98
99  var p_go []C.double
100  p_head := (*reflect.SliceHeader)((unsafe.Pointer(&p_go)))
101  p_head.Cap = M3
102  p_head.Len = M3
103  p_head.Data = uintptr(unsafe.Pointer(p))
104  for i, _ := range p_go {
105    coeff[i] = float64(p_go[i])
106  }
107
108  var x_go []C.double
109  x_head := (*reflect.SliceHeader)((unsafe.Pointer(&x_go)))
110  x_head.Cap = MA
111  x_head.Len = MA
112  x_head.Data = uintptr(unsafe.Pointer(x))
113
114  N := len(cd.Train)
115  var out float64
116  for i1, PS := range cd.Train {
117    for i2, pnt := range PS.Points() {
118      i := i1*N + i2
119      if cd.Task == ExprBenchmark {
120        out = eqn.Eval(0, pnt.Indeps(), coeff, PS.SysVals())
121      } else if cd.Task == ExprDiffeq {
122        out = eqn.Eval(pnt.Indep(0), pnt.Indeps()[1:], coeff, PS.SysVals())
123      }
124
125      x_go[i] = C.double(out)
126
127    }
128  }
129}
130
131//export Callback_jacfunc
132func Callback_jacfunc(p, x *C.double, e unsafe.Pointer) {
133  //fmt.Printf("[")
134  cd := *(*callback_data)(e)
135  coeff := cd.Coeff
136
137  M1 := len(cd.Train)
138  M2 := cd.Train[0].NumPoints()
139  M3 := len(coeff)
140  M23 := M2 * M3
141  MA := M1 * M23
142
143  var p_go []C.double
144  p_head := (*reflect.SliceHeader)((unsafe.Pointer(&p_go)))
145  p_head.Cap = M3
146  p_head.Len = M3
147  p_head.Data = uintptr(unsafe.Pointer(p))
148  for i, _ := range p_go {
149    coeff[i] = float64(p_go[i])
150  }
151
152  var x_go []C.double
153  x_head := (*reflect.SliceHeader)((unsafe.Pointer(&x_go)))
154  x_head.Cap = MA
155  x_head.Len = MA
156  x_head.Data = uintptr(unsafe.Pointer(x))
157
158  var out float64
159  for i1, PS := range cd.Train {
160    for i2, pnt := range PS.Points() {
161      i := i1*M23 + i2*M3
162      for ji, eqn := range cd.J {
163        if cd.Task == ExprBenchmark {
164          out = eqn.Eval(0, pnt.Indeps(), coeff, PS.SysVals())
165        } else if cd.Task == ExprDiffeq {
166          out = eqn.Eval(pnt.Indep(0), pnt.Indeps()[1:], coeff, PS.SysVals())
167        }
168
169        x_go[i+ji] = C.double(out)
170      }
171    }
172  }
173
174}
175
176func StackLevmarExpr(e expr.Expr, x_dims int, coeff []float64, c_ygiven, c_input []C_double) []float64 {
177
178  // fmt.Printf("Entering Stack Levmar: \n")
179
180  c_coeff := make([]C.double, len(coeff))
181  for i, c := range coeff {
182    c_coeff[i] = C.double(c)
183  }
184  // c_ygiven := make([]C.double, len(ygiven))
185  // for i, c := range ygiven {
186  //  c_ygiven[i] = C.double(c)
187  // }
188  // c_input := make([]C.double, len(input))
189  // for i, c := range input {
190  //  c_input[i] = C.double(c)
191  // }
192
193  cp := (*C.double)(unsafe.Pointer(&c_coeff[0]))
194  mi := C.int(len(coeff))
195  yp := (*C.double)(unsafe.Pointer(&c_ygiven[0]))
196  ni := C.int(len(c_ygiven))
197
198  var sd *C.StackData
199  sd = new(C.StackData)
200  // fmt.Printf("x_len: %d   x_dim: %d\n", len(input), x_dims)
201  sd.x_len = C.int(len(c_input))
202  sd.x_dim = C.int(x_dims)
203  sd.x_data = (*C.double)(unsafe.Pointer(&c_input[0]))
204
205  serial := make([]int, 0)
206  serial = e.StackSerial(serial)
207  // fmt.Printf("StackSerial: %v\n", serial)
208  c_serial := make([]C.int, len(serial))
209  for i, I := range serial {
210    c_serial[i] = C.int(I)
211  }
212  sd.expr.serial = (*C.int)(unsafe.Pointer(&c_serial[0]))
213  sd.expr.s_len = C.int(len(serial))
214
215  // fmt.Printf("GOT HERE: %v\n", serial)
216
217  derivs := make([]C.StackExpr, len(coeff))
218  for i, _ := range coeff {
219    deriv := e.DerivConst(i)
220    dserial := make([]int, 0)
221    dserial = deriv.StackSerial(dserial)
222    d_serial := make([]C.int, len(dserial))
223    for i, I := range dserial {
224      d_serial[i] = C.int(I)
225    }
226    derivs[i].serial = (*C.int)(unsafe.Pointer(&d_serial[0]))
227    derivs[i].s_len = C.int(len(d_serial))
228
229  }
230  sd.derivs = (*C.StackExpr)(unsafe.Pointer(&derivs[0]))
231  sd.d_len = C.int(mi)
232
233  // fmt.Printf("Going into stack_levmar_dif\n")
234  C.stack_levmar_dif(yp, cp, mi, ni, unsafe.Pointer(sd))
235  // C.stack_levmar_der(yp, cp, mi, ni, unsafe.Pointer(sd))
236  // fmt.Printf("Returned from stack_levmar_dif\n")
237
238  c := make([]float64, len(c_coeff))
239  for i, _ := range c_coeff {
240    c[i] = float64(c_coeff[i])
241  }
242  // fmt.Printf("C0: %f\n", c[0])
243  return c
244}
245
246// func LevmarExpr(e expr.Expr, searchDim int, task ExprProblemType, guess []float64, train, test []*PointSet) []float64 {
247
248func IronLevmarExpr() {
249
250}
Note: See TracBrowser for help on using the repository browser.