Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2929_PrioritizedGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.PGE/3.3/go-code/go-levmar/levmar.go @ 16080

Last change on this file since 16080 was 16080, checked in by hmaislin, 6 years ago

#2929 initial commit of working PGE version

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