Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2929_PrioritizedGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.PGE/3.3/go-code/go-pge/plug/pge_search.go @ 16615

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

#2929: Added updated go and plugin files

File size: 22.5 KB
Line 
1package pge
2
3import (
4  "bufio"
5  "fmt"
6  "io/ioutil"
7  "log"
8  "math"
9  "os"
10  "strconv"
11  "strings"
12
13  levmar "github.com/verdverm/go-levmar"
14  config "github.com/verdverm/go-pge/config"
15  probs "github.com/verdverm/go-pge/problems"
16  expr "github.com/verdverm/go-symexpr"
17)
18
19type PgeConfig struct {
20  // search params
21  maxGen        int
22  pgeRptEpoch   int
23  pgeRptCount   int
24  pgeArchiveCap int
25
26  simprules expr.SimpRules
27  treecfg   *probs.TreeParams
28
29  // PGE specific options
30  peelCnt     int
31  sortType    probs.SortType
32  zeroEpsilon float64
33
34  initMethod string
35  growMethod string
36
37  evalrCount int
38}
39
40func pgeConfigParser(field, value string, config interface{}) (err error) {
41
42  PC := config.(*PgeConfig)
43
44  switch strings.ToUpper(field) {
45  case "MAXGEN":
46    PC.maxGen, err = strconv.Atoi(value)
47  case "PGERPTEPOCH":
48    PC.pgeRptEpoch, err = strconv.Atoi(value)
49  case "PGERPTCOUNT":
50    PC.pgeRptCount, err = strconv.Atoi(value)
51  case "PGEARCHIVECAP":
52    PC.pgeArchiveCap, err = strconv.Atoi(value)
53
54  case "PEELCOUNT":
55    PC.peelCnt, err = strconv.Atoi(value)
56
57  case "EVALRCOUNT":
58    PC.evalrCount, err = strconv.Atoi(value)
59
60  case "SORTTYPE":
61    switch strings.ToLower(value) {
62    case "paretotrainerror":
63      PC.sortType = probs.PESORT_PARETO_TRN_ERR
64    case "paretotesterror":
65      PC.sortType = probs.PESORT_PARETO_TST_ERR
66
67    default:
68      log.Printf("PGE Config Not Implemented: %s, %s\n\n", field, value)
69    }
70
71  case "ZEROEPSILON":
72    PC.zeroEpsilon, err = strconv.ParseFloat(value, 64)
73
74  default:
75    // check augillary parsable structures [only TreeParams for now]
76    if PC.treecfg == nil {
77      PC.treecfg = new(probs.TreeParams)
78    }
79    found, ferr := probs.ParseTreeParams(field, value, PC.treecfg)
80    if ferr != nil {
81      log.Fatalf("error parsing PGE - treecfg Config\n")
82      return ferr
83    }
84    if !found {
85      log.Printf("PGE Config Not Implemented: %s, %s\n\n", field, value)
86    }
87
88  }
89  return
90}
91
92type PgeSearch struct {
93  id   int
94  cnfg PgeConfig
95  prob *probs.ExprProblem
96  iter int
97  stop bool
98
99  // comm up
100  commup *probs.ExprProblemComm
101
102  // comm down
103
104  // best exprs
105  Best *probs.ReportQueue
106
107  // training data in C format
108  c_input  []levmar.C_double
109  c_ygiven []levmar.C_double
110
111  // logs
112  logDir     string
113  mainLog    *log.Logger
114  mainLogBuf *bufio.Writer
115  eqnsLog    *log.Logger
116  eqnsLogBuf *bufio.Writer
117  errLog     *log.Logger
118  errLogBuf  *bufio.Writer
119
120  fitnessLog    *log.Logger
121  fitnessLogBuf *bufio.Writer
122  ipreLog       *log.Logger
123  ipreLogBuf    *bufio.Writer
124
125  // equations visited
126  Trie  *IpreNode
127  Queue *probs.ReportQueue
128
129  // eval channels
130  eval_in  chan expr.Expr
131  eval_out chan *probs.ExprReport
132
133  // genStuff
134  GenRoots   []expr.Expr
135  GenLeafs   []expr.Expr
136  GenNodes   []expr.Expr
137  GenNonTrig []expr.Expr
138
139  // FFXish stuff
140  ffxBases []expr.Expr
141
142  // statistics
143  neqns    int
144  ipreCnt  int
145  maxSize  int
146  maxScore int
147  minError float64
148}
149
150func (PS *PgeSearch) GetMaxIter() int {
151  return PS.cnfg.maxGen
152}
153func (PS *PgeSearch) GetPeelCount() int {
154  return PS.cnfg.peelCnt
155}
156func (PS *PgeSearch) SetMaxIter(iter int) {
157  PS.cnfg.maxGen = iter
158}
159func (PS *PgeSearch) SetPeelCount(cnt int) {
160  PS.cnfg.peelCnt = cnt
161}
162func (PS *PgeSearch) SetInitMethod(init string) {
163  PS.cnfg.initMethod = init
164}
165func (PS *PgeSearch) SetGrowMethod(grow string) {
166  PS.cnfg.growMethod = grow
167}
168func (PS *PgeSearch) SetEvalrCount(cnt int) {
169  PS.cnfg.evalrCount = cnt
170}
171
172func (PS *PgeSearch) ParseConfig(filename string) {
173  fmt.Printf("Parsing PGE Config: %s\n", filename)
174  data, err := ioutil.ReadFile(filename)
175  if err != nil {
176    log.Fatal(err)
177  }
178  err = config.ParseConfig(data, pgeConfigParser, &PS.cnfg)
179  if err != nil {
180    log.Fatal(err)
181  }
182}
183
184func (PS *PgeSearch) Init(done chan int, prob *probs.ExprProblem, logdir string, input interface{}) {
185
186  fmt.Printf("Init'n PGE\n")
187  // setup data
188
189  // open logs
190  PS.initLogs(logdir)
191 
192  PS.stop = false
193
194  // copy in common config options
195  PS.prob = prob
196  if PS.cnfg.treecfg == nil {
197    PS.cnfg.treecfg = PS.prob.TreeCfg.Clone()
198  }
199  srules := expr.DefaultRules()
200  srules.ConvertConsts = true
201  PS.cnfg.simprules = srules
202
203  fmt.Println("Roots:   ", PS.cnfg.treecfg.RootsS)
204  fmt.Println("Nodes:   ", PS.cnfg.treecfg.NodesS)
205  fmt.Println("Leafs:   ", PS.cnfg.treecfg.LeafsS)
206  fmt.Println("NonTrig: ", PS.cnfg.treecfg.NonTrigS)
207
208  PS.GenRoots = make([]expr.Expr, len(PS.cnfg.treecfg.Roots))
209  for i := 0; i < len(PS.GenRoots); i++ {
210    PS.GenRoots[i] = PS.cnfg.treecfg.Roots[i].Clone()
211  }
212  PS.GenNodes = make([]expr.Expr, len(PS.cnfg.treecfg.Nodes))
213  for i := 0; i < len(PS.GenNodes); i++ {
214    PS.GenNodes[i] = PS.cnfg.treecfg.Nodes[i].Clone()
215  }
216  PS.GenNonTrig = make([]expr.Expr, len(PS.cnfg.treecfg.NonTrig))
217  for i := 0; i < len(PS.GenNonTrig); i++ {
218    PS.GenNonTrig[i] = PS.cnfg.treecfg.NonTrig[i].Clone()
219  }
220 
221  fmt.Printf("Init1 %v\n", len(PS.cnfg.treecfg.LeafsT))
222
223  PS.GenLeafs = make([]expr.Expr, 0)
224  for _, t := range PS.cnfg.treecfg.LeafsT {
225    switch t {
226    case expr.TIME:
227      PS.GenLeafs = append(PS.GenLeafs, expr.NewTime())
228
229    case expr.VAR:
230      fmt.Println("Use Vars: ", PS.cnfg.treecfg.UsableVars)
231      for _, i := range PS.cnfg.treecfg.UsableVars {
232        PS.GenLeafs = append(PS.GenLeafs, expr.NewVar(i))
233      }
234
235    case expr.SYSTEM:
236      for i := 0; i < PS.prob.Train[0].NumSys(); i++ {
237        PS.GenLeafs = append(PS.GenLeafs, expr.NewSystem(i))
238      }
239
240    }
241  }
242  fmt.Printf("Init2\n")
243  /*** FIX ME
244  PS.GenLeafs = make([]expr.Expr, len(PS.cnfg.treecfg.Leafs))
245  for i := 0; i < len(PS.GenLeafs); i++ {
246    PS.GenLeafs[i] = PS.cnfg.treecfg.Leafs[i].Clone()
247  }
248  ***/
249 
250  fmt.Printf("Init3\n")
251
252  //fmt.Println("Roots:   ", PS.GenRoots)
253  //fmt.Println("Nodes:   ", PS.GenNodes)
254  //fmt.Println("Leafs:   ", PS.GenLeafs)
255  //fmt.Println("NonTrig: ", PS.GenNonTrig)
256
257  // setup communication struct
258  PS.commup = input.(*probs.ExprProblemComm)
259
260  // initialize bbq
261  PS.Trie = new(IpreNode)
262  PS.Trie.val = -1
263  PS.Trie.next = make(map[int]*IpreNode)
264
265  PS.Best = probs.NewReportQueue()
266  PS.Best.SetSort(probs.GPSORT_PARETO_TST_ERR)
267  fmt.Printf("Init4\n")
268
269  PS.Queue = PS.GenInitExpr()
270  PS.Queue.SetSort(probs.PESORT_PARETO_TST_ERR)
271
272  PS.neqns = PS.Queue.Len()
273
274  PS.minError = math.Inf(1)
275
276  PS.eval_in = make(chan expr.Expr, 4048)
277  PS.eval_out = make(chan *probs.ExprReport, 4048)
278
279  fmt.Printf("Init5a\n")
280  for i := 0; i < PS.cnfg.evalrCount; i++ {
281    go PS.Evaluate()
282  }
283  fmt.Printf("Init5\n")
284}
285
286func (PS *PgeSearch) Stop() {
287  PS.stop = true
288}
289
290func (PS *PgeSearch) Evaluate() {
291
292  for !PS.stop {
293    e := <-PS.eval_in
294    if e == nil {
295      continue
296    }
297    //re :=
298    //fmt.Printf("reg: %v\n", re)
299    PS.eval_out <- RegressExpr(e, PS.prob)
300  }
301
302}
303
304func (PS *PgeSearch) Run() {
305  fmt.Printf("Running PGE\n")
306
307  PS.Loop()
308
309  fmt.Println("PGE exitting")
310
311  PS.Clean()
312  PS.commup.Cmds <- -1
313}
314
315func (PS *PgeSearch) Loop() {
316
317  PS.checkMessages()
318  for !PS.stop {
319
320    fmt.Println("in: PS.step() ", PS.iter)
321    PS.Step()
322
323    // if PS.iter%PS.cnfg.pgeRptEpoch == 0 {
324    PS.reportExpr()
325    // }
326
327    // report current iteration
328    PS.commup.Gen <- [2]int{PS.id, PS.iter}
329    PS.iter++
330
331    PS.Clean()
332
333    PS.checkMessages()
334
335  }
336
337  // done expanding, pull the rest of the regressed solutions from the queue
338  p := 0
339  for PS.Queue.Len() > 0 {
340    e := PS.Queue.Pop().(*probs.ExprReport)
341
342    bPush := true
343    if len(e.Coeff()) == 1 && math.Abs(e.Coeff()[0]) < PS.cnfg.zeroEpsilon {
344      // fmt.Println("No Best Push")
345      bPush = false
346    }
347
348    if bPush {
349      // fmt.Printf("pop/push(%d,%d): %v\n", p, PS.Best.Len(), e.Expr())
350      PS.Best.Push(e)
351      p++
352    }
353
354    if e.TestScore() > PS.maxScore {
355      PS.maxScore = e.TestScore()
356    }
357    if e.TestError() < PS.minError {
358      PS.minError = e.TestError()
359      fmt.Printf("EXITING New Min Error:  %v\n", e)
360    }
361    if e.Size() > PS.maxSize {
362      PS.maxSize = e.Size()
363    }
364  }
365
366  fmt.Println("PGE sending last report")
367  PS.reportExpr()
368
369}
370
371
372type PeelResult struct {
373  Es *probs.ExprReport
374
375  Nobestpush bool
376  BestNewMinErr bool
377 
378  Bestlen1 int
379  Bestlen2 int
380 
381  Coeff []float64
382  TestScore int
383 
384  Expre expr.Expr
385  ExpreRe *probs.ExprReport
386}
387
388
389func (PS *PgeSearch) Step() int {
390
391  loop := 0
392  eval_cnt := 0 // for channeled eval
393
394  es := PS.peel()
395
396  ex := PS.expandPeeled(es)
397 
398  cnt_ins := 0
399
400  inserts := make(probs.ExprReportArray, 0)
401  for cnt := range ex {
402    E := ex[cnt]
403
404    if E == nil {
405      continue
406    }
407
408    for _, e := range E {
409      if e == nil {
410        continue
411      }
412      if !PS.cnfg.treecfg.CheckExpr(e) {
413        continue
414      }
415
416      // check ipre_trie
417      serial := make([]int, 0, 64)
418      serial = e.Serial(serial)
419      ins := PS.Trie.InsertSerial(serial)
420      if !ins {
421        continue
422      }
423
424      // for serial eval
425      //re := RegressExpr(e, PS.prob) //needed for TestScore calc via RegressExpr
426      //inserts = append(inserts, re)
427     
428      // start channeled eval
429      PS.eval_in <- e
430      eval_cnt++
431    }
432  }
433 
434  for i := 0; i < eval_cnt; i++ {
435    re := <-PS.eval_out
436    // end channeled eval
437
438    // check for NaN/Inf in re.error  and  if so, skip
439    if math.IsNaN(re.TestError()) || math.IsInf(re.TestError(), 0) {
440      // fmt.Printf("Bad Error\n%v\n", re)
441      continue
442    }
443
444    if re.TestError() < PS.minError {
445      PS.minError = re.TestError()
446    }
447
448    // check for coeff == 0
449    doIns := true
450    for _, c := range re.Coeff() {
451      // i > 0 for free coeff
452      if math.Abs(c) < PS.cnfg.zeroEpsilon {
453        doIns = false
454        break
455      }
456    }
457
458    //fmt.Printf("StepQueue.Push(): %v\n", re)
459    //fmt.Printf("StepQueue.Push(): %v\n", re.Expr())
460   
461    if doIns {
462      re.SetProcID(PS.id)
463      re.SetIterID(PS.iter)
464      re.SetUnitID(loop)
465      re.SetUniqID(PS.neqns)
466      loop++
467      PS.neqns++
468      // fmt.Printf("Queue.Push(): %v\n%v\n\n", re.Expr(), serial)
469      // fmt.Printf("Queue.Push(): %v\n", re)
470      // fmt.Printf("Queue.Push(): %v\n", re.Expr())
471      cnt_ins++
472      PS.Queue.Push(re)
473      //fmt.Printf("Testscore: %v\n", re.TestScore())
474      //PS.commup.Rpts <- &re     //sort missing! > 3 ergs
475    }
476  }
477
478  PS.Queue.Sort() //3 besten werden beim naechsten peel ausgegeben
479 
480  for p := 0; p < PS.cnfg.peelCnt && PS.Queue.Len() > 0; p++ { 
481    val := PS.Queue.Pop().(*probs.ExprReport)
482    inserts = append(inserts, val)
483  }
484 
485  for _, e := range inserts {
486    PS.Queue.Push(e)
487  }
488   
489  PS.Queue.Sort()
490 
491  PS.commup.Res <- &inserts
492 
493  PS.reportExpr()
494  PS.iter++
495 
496  return len(inserts)
497}
498
499func (PS *PgeSearch) peel() []*probs.ExprReport {
500  es := make([]*probs.ExprReport, PS.cnfg.peelCnt)
501 
502  rpt := make(probs.ExprReportArray, 0)
503 
504  for p := 0; p < PS.cnfg.peelCnt && PS.Queue.Len() > 0; p++ {
505
506    e := PS.Queue.Pop().(*probs.ExprReport)
507
508    bPush := true
509    if len(e.Coeff()) == 1 && math.Abs(e.Coeff()[0]) < PS.cnfg.zeroEpsilon {
510      fmt.Println("No Best Push")
511      p--
512      continue
513    }
514
515    if bPush {
516      fmt.Printf("BEST PUSH/push(%d,%d): %v\n", p, PS.Best.Len(), e.Expr())
517      PS.Best.Push(e)
518      rpt = append(rpt, e)
519    }
520
521    es[p] = e
522
523    if e.TestScore() > PS.maxScore {
524      fmt.Printf("Testscore: %v\n", e.TestScore())
525      PS.maxScore = e.TestScore()
526    }
527    if e.TestError() < PS.minError {
528      PS.minError = e.TestError()
529      fmt.Printf("Best New Min Error:  %v\n", e)
530    }
531    if e.Size() > PS.maxSize {
532      PS.maxSize = e.Size()
533    }
534   
535  }
536 
537  //fmt.Printf("sand %d best pushes in peel\n", len(rpt))
538  //PS.commup.Res <- &rpt
539 
540  _ = rpt
541 
542  return es
543}
544
545func (PS *PgeSearch) expandPeeled(es []*probs.ExprReport) [][]expr.Expr {
546  eqns := make([][]expr.Expr, PS.cnfg.peelCnt)
547  for p := 0; p < PS.cnfg.peelCnt; p++ {
548    if es[p] == nil {
549      continue
550    }
551    // fmt.Printf("expand(%d): %v\n", p, es[p].Expr())
552    if es[p].Expr().ExprType() != expr.ADD {
553      add := expr.NewAdd()
554      add.Insert(es[p].Expr())
555      add.CalcExprStats()
556      es[p].SetExpr(add)
557    }
558    eqns[p] = PS.Expand(es[p].Expr())
559    // fmt.Printf("Results:\n")
560    // for i, e := range eqns[p] {
561    //  fmt.Printf("%d,%d:  %v\n", p, i, e)
562    // }
563    // fmt.Println()
564  }
565  fmt.Println("\n")
566  return eqns
567}
568
569//Hier ist das pgeRpt problem, liefert immer die besten pgerpt cnt ergebnisse zurueck
570// //*
571func (PS *PgeSearch) reportExpr() {
572
573  cnt := PS.cnfg.pgeRptCount
574  PS.Best.Sort()
575
576  // repot best equations
577  rpt := make(probs.ExprReportArray, cnt)
578  if PS.Best.Len() < cnt {
579    cnt = PS.Best.Len()
580  }
581  copy(rpt, PS.Best.GetQueue()[:cnt])
582
583  errSum, errCnt := 0.0, 0
584  PS.eqnsLog.Println("\n\nReport", PS.iter)
585  for i, r := range rpt {
586    PS.eqnsLog.Printf("\n%d:  %v\n", i, r)
587    if r != nil && r.Expr() != nil {
588      errSum += r.TestError()
589      errCnt++
590    }
591  }
592
593  PS.mainLog.Printf("Iter: %d  %f  %f\n", PS.iter, errSum/float64(errCnt), PS.minError)
594
595  PS.ipreLog.Println(PS.iter, PS.neqns, PS.Trie.cnt, PS.Trie.vst)
596  PS.fitnessLog.Println(PS.iter, PS.neqns, PS.Trie.cnt, PS.Trie.vst, errSum/float64(errCnt), PS.minError)
597
598  //PS.commup.Rpts <- &rpt
599
600}
601
602func (PS *PgeSearch) FirstPeel() {
603  PS.peel()
604}
605
606func (PS *PgeSearch) Clean() {
607  PS.errLogBuf.Flush()
608  PS.mainLogBuf.Flush()
609  PS.eqnsLogBuf.Flush()
610  PS.fitnessLogBuf.Flush()
611  PS.ipreLogBuf.Flush()
612}
613
614func (PS *PgeSearch) initLogs(logdir string) {
615  // open logs
616  PS.logDir = logdir + "pge/"
617  os.Mkdir(PS.logDir, os.ModePerm)
618  tmpF0, err5 := os.Create(PS.logDir + "pge:err.log")
619  if err5 != nil {
620    log.Fatal("couldn't create errs log")
621  }
622  PS.errLogBuf = bufio.NewWriter(tmpF0)
623  PS.errLogBuf.Flush()
624  PS.errLog = log.New(PS.errLogBuf, "", log.LstdFlags)
625
626  tmpF1, err1 := os.Create(PS.logDir + "pge:main.log")
627  if err1 != nil {
628    log.Fatal("couldn't create main log")
629  }
630  PS.mainLogBuf = bufio.NewWriter(tmpF1)
631  PS.mainLogBuf.Flush()
632  PS.mainLog = log.New(PS.mainLogBuf, "", log.LstdFlags)
633
634  tmpF2, err2 := os.Create(PS.logDir + "pge:eqns.log")
635  if err2 != nil {
636    log.Fatal("couldn't create eqns log")
637  }
638  PS.eqnsLogBuf = bufio.NewWriter(tmpF2)
639  PS.eqnsLogBuf.Flush()
640  PS.eqnsLog = log.New(PS.eqnsLogBuf, "", 0)
641
642  tmpF3, err3 := os.Create(PS.logDir + "pge:fitness.log")
643  if err3 != nil {
644    log.Fatal("couldn't create eqns log")
645  }
646  PS.fitnessLogBuf = bufio.NewWriter(tmpF3)
647  PS.fitnessLogBuf.Flush()
648  PS.fitnessLog = log.New(PS.fitnessLogBuf, "", log.Ltime|log.Lmicroseconds)
649
650  tmpF4, err4 := os.Create(PS.logDir + "pge:ipre.log")
651  if err4 != nil {
652    log.Fatal("couldn't create eqns log")
653  }
654  PS.ipreLogBuf = bufio.NewWriter(tmpF4)
655  PS.ipreLogBuf.Flush()
656  PS.ipreLog = log.New(PS.ipreLogBuf, "", log.Ltime|log.Lmicroseconds)
657}
658
659func (PS *PgeSearch) checkMessages() {
660
661  // check messages from superior
662  select {
663  case cmd, ok := <-PS.commup.Cmds:
664    if ok {
665      if cmd == -1 {
666        fmt.Println("PGE: stop sig recv'd")
667        PS.stop = true
668        return
669      }
670    }
671  default:
672    return
673  }
674}
675
676var c_input, c_ygiven []levmar.C_double
677
678func RegressExpr(E expr.Expr, P *probs.ExprProblem) (R *probs.ExprReport) {
679
680  guess := make([]float64, 0)
681  guess, eqn := E.ConvertToConstants(guess)
682
683  var coeff []float64
684  if len(guess) > 0 {
685
686    // fmt.Printf("x_dims:  %d  %d\n", x_dim, x_dim2)
687
688    // Callback version
689    coeff = levmar.LevmarExpr(eqn, P.SearchVar, P.SearchType, guess, P.Train, P.Test)
690
691    // Stack version
692    // x_dim := P.Train[0].NumDim()
693    // if c_input == nil {
694    //  ps := P.Train[0].NumPoints()
695    //  PS := len(P.Train) * ps
696    //  x_tot := PS * x_dim
697
698    //  c_input = make([]levmar.C_double, x_tot)
699    //  c_ygiven = make([]levmar.C_double, PS)
700
701    //  for i1, T := range P.Train {
702    //    for i2, p := range T.Points() {
703    //      i := i1*ps + i2
704    //      c_ygiven[i] = levmar.MakeCDouble(p.Depnd(P.SearchVar))
705    //      for i3, x_p := range p.Indeps() {
706    //        j := i1*ps*x_dim + i2*x_dim + i3
707    //        c_input[j] = levmar.MakeCDouble(x_p)
708    //      }
709    //    }
710    //  }
711    // }
712    // coeff = levmar.StackLevmarExpr(eqn, x_dim, guess, c_ygiven, c_input)
713
714    // serial := make([]int, 0)
715    // serial = eqn.StackSerial(serial)
716    // fmt.Printf("StackSerial: %v\n", serial)
717    // fmt.Printf("%v\n%v\n%v\n\n", eqn, coeff, steff)
718  }
719
720  R = new(probs.ExprReport)
721  R.SetExpr(eqn) /*.ConvertToConstantFs(coeff)*/
722  R.SetCoeff(coeff)
723  R.Expr().CalcExprStats()
724
725  // hitsL1, hitsL2, evalCnt, nanCnt, infCnt, l1_err, l2_err := scoreExpr(E, P, coeff)
726  _, _, _, trnNanCnt, _, trn_l1_err, _ := scoreExpr(E, P, P.Train, coeff)
727  _, _, tstEvalCnt, tstNanCnt, _, tst_l1_err, tst_l2_err := scoreExpr(E, P, P.Test, coeff)
728
729  R.SetTrainScore(trnNanCnt)
730  R.SetTrainError(trn_l1_err)
731
732  R.SetPredScore(tstNanCnt)
733  R.SetTestScore(tstEvalCnt)
734  R.SetTestError(tst_l1_err)
735  R.SetPredError(tst_l2_err)
736
737  return R
738}
739
740func scoreExpr(e expr.Expr, P *probs.ExprProblem, dataSets []*probs.PointSet, coeff []float64) (hitsL1, hitsL2, evalCnt, nanCnt, infCnt int, l1_err, l2_err float64) {
741  var l1_sum, l2_sum float64
742  for _, PS := range dataSets {
743    for _, p := range PS.Points() {
744      y := p.Depnd(P.SearchVar)
745      var out float64
746      if P.SearchType == probs.ExprBenchmark {
747        out = e.Eval(0, p.Indeps(), coeff, PS.SysVals())
748      } else if P.SearchType == probs.ExprDiffeq {
749        out = e.Eval(p.Indep(0), p.Indeps()[1:], coeff, PS.SysVals())
750      }
751
752      if math.IsNaN(out) {
753        nanCnt++
754        continue
755      } else if math.IsInf(out, 0) {
756        infCnt++
757        continue
758      } else {
759        evalCnt++
760      }
761
762      diff := out - y
763      l1_val := math.Abs(diff)
764      l2_val := diff * diff
765      l1_sum += l1_val
766      l2_sum += l2_val
767
768      if l1_val < P.HitRatio {
769        hitsL1++
770      }
771      if l2_val < P.HitRatio {
772        hitsL2++
773      }
774    }
775  }
776
777  if evalCnt == 0 {
778    l1_err = math.NaN()
779    l2_err = math.NaN()
780  } else {
781    fEvalCnt := float64(evalCnt + 1)
782    l1_err = l1_sum / fEvalCnt
783    l2_err = math.Sqrt(l2_sum / fEvalCnt)
784  }
785
786  return
787}
788
789func (PS *PgeSearch) CreateDS(maxGen int, pgeRptEpoch int, pgeRptCount int, pgeArchiveCap int, peelCnt int, evalrCount int, zeroEpsilon float64, initMethod string, growMethod string, sortType int) {
790  PS.id = 0 //maxGen ? wieso steht des do, id -> procId bei multi searches
791 
792  var PC PgeConfig
793 
794  PC.pgeRptEpoch = pgeRptEpoch
795  PC.pgeRptCount = pgeRptCount
796  PC.pgeArchiveCap = pgeArchiveCap
797  PC.peelCnt = peelCnt
798  PC.evalrCount = evalrCount
799  PC.zeroEpsilon = zeroEpsilon
800  PC.initMethod = initMethod
801  PC.growMethod = growMethod
802 
803  if sortType == 1 {
804    PC.sortType = probs.PESORT_PARETO_TRN_ERR
805  } else { 
806    PC.sortType = probs.PESORT_PARETO_TST_ERR
807  }
808
809  PC.maxGen = maxGen
810  PS.cnfg = PC
811  PS.stop = false //is in init
812  PS.iter = 0
813}
814
815func (PS *PgeSearch) SetProb(ep *probs.ExprProblem) {
816  PS.prob = ep
817}
818func (PS *PgeSearch) GetIter() int {
819  return PS.iter
820}
821
822
823
824
825/********************** DELETED ************************/
826
827
828func (PS *PgeSearch) SingleStep22() {
829  loop := 0
830  eval_cnt := 0 // for channeled eval
831
832  es := PS.peel()
833
834  ex := PS.expandPeeled(es)
835
836  for cnt := range ex {
837    E := ex[cnt]
838
839    if E == nil {
840      continue
841    }
842
843    for _, e := range E {
844      if e == nil {
845        continue
846      }
847      if !PS.cnfg.treecfg.CheckExpr(e) {
848        continue
849      }
850
851      // check ipre_trie
852      serial := make([]int, 0, 64)
853      serial = e.Serial(serial)
854      ins := PS.Trie.InsertSerial(serial)
855      if !ins {
856        continue
857      }
858
859      // for serial eval
860      // re := RegressExpr(e, PS.prob)
861
862      // start channeled eval
863      PS.eval_in <- e
864      eval_cnt++
865    }
866  }
867  for i := 0; i < eval_cnt; i++ {
868    re := <-PS.eval_out
869    // end channeled eval
870
871    // check for NaN/Inf in re.error  and  if so, skip
872    if math.IsNaN(re.TestError()) || math.IsInf(re.TestError(), 0) {
873      // fmt.Printf("Bad Error\n%v\n", re)
874      continue
875    }
876
877    if re.TestError() < PS.minError {
878      PS.minError = re.TestError()
879    }
880
881    // check for coeff == 0
882    doIns := true
883    for _, c := range re.Coeff() {
884      // i > 0 for free coeff
885      if math.Abs(c) < PS.cnfg.zeroEpsilon {
886        doIns = false
887        break
888      }
889    }
890   
891    if doIns {
892      re.SetProcID(PS.id)
893      re.SetIterID(PS.iter)
894      re.SetUnitID(loop)
895      re.SetUniqID(PS.neqns)
896      loop++
897      PS.neqns++
898     
899      //fmt.Printf("SS2Queue.Push(): %v\n%v\n\n", re.Expr(), serial)
900      ////fmt.Printf("INSQueue.Push(): %v\n", re)
901      ////fmt.Printf("INSQueue.Push(): %v\n", re.Expr())
902
903      PS.Queue.Push(re)
904
905    }
906  }
907  // } // for sequential eval
908  PS.Queue.Sort()                                                                                                                                       
909}
910
911//Problem
912func (PS *PgeSearch) SingleStep2() []*PeelResult {
913  if os.Getenv("PGEDEBUG") == "1" {
914    fmt.Printf("Init PgeSearch: %#v \n", PS)
915    fmt.Printf("Init PgeProblem: %#v \n", PS.prob)
916  }
917
918
919  loop := 0
920  eval_cnt := 0
921  PR := PS.peelRes2()
922 
923  es := make([]*probs.ExprReport, len(PR))
924 
925  for i, elem := range PR {
926    if(elem != nil) {
927      es[i] = elem.ExpreRe
928    //} else {
929    //  es[i] = new(probs.ExprReport)
930    }
931  }
932 
933  ex := PS.expandPeeled(es)
934
935  for cnt := range ex {
936    E := ex[cnt]
937    if E == nil {
938      continue
939    }
940    for _, e := range E {
941      if e == nil {
942        continue
943      }
944      if !PS.cnfg.treecfg.CheckExpr(e) {
945        continue
946      }
947      serial := make([]int, 0, 64)
948      serial = e.Serial(serial)
949      ins := PS.Trie.InsertSerial(serial)
950     
951      if !ins {
952        continue
953      }
954      PS.eval_in <- e
955      eval_cnt++
956    }
957  }
958  for i := 0; i < eval_cnt; i++ {
959    re := <-PS.eval_out
960    if math.IsNaN(re.TestError()) || math.IsInf(re.TestError(), 0) {
961      continue
962    }
963    if re.TestError() < PS.minError {
964      PS.minError = re.TestError()
965    }
966    doIns := true
967    for _, c := range re.Coeff() {
968      if math.Abs(c) < PS.cnfg.zeroEpsilon {
969        doIns = false
970        break
971      }
972    }
973    if doIns {
974      re.SetProcID(PS.id)
975      re.SetIterID(PS.iter)
976      re.SetUnitID(loop)
977      re.SetUniqID(PS.neqns)
978      loop++
979      PS.neqns++
980      PS.Queue.Push(re)
981    }
982  }
983  PS.Queue.Sort()
984
985  PS.reportExpr()
986  PS.iter++
987 
988  return PR
989}
990
991//Problem
992func (PS *PgeSearch) peelRes2() []*PeelResult {
993  //es := make([]*probs.ExprReport, PS.cnfg.peelCnt)
994  PRes := make([]*PeelResult, PS.cnfg.peelCnt)
995 
996  for p := 0; p < PS.cnfg.peelCnt && PS.Queue.Len() > 0; p++ {
997    PR := new(PeelResult)
998     
999    PR.BestNewMinErr = false
1000    PR.Nobestpush = false
1001   
1002    e := PS.Queue.Pop().(*probs.ExprReport)
1003   
1004    bPush := true
1005    if len(e.Coeff()) == 1 && math.Abs(e.Coeff()[0]) < PS.cnfg.zeroEpsilon {
1006      //fmt.Println("No Best Push")
1007      PR.Nobestpush = true
1008      p--
1009      continue
1010    }
1011
1012    if bPush {
1013      //fmt.Printf("pop/push (%d,%d): %v\n", p, PS.Best.Len(), e.Expr())
1014      PS.Best.Push(e)
1015    }
1016
1017    //es[p] = e
1018    PR.Bestlen1 = p
1019    PR.Bestlen2 = PS.Best.Len()
1020    PR.Expre = e.Expr()
1021    PR.ExpreRe = e
1022    PR.Es = e
1023    PR.Coeff = e.Coeff()
1024    PR.TestScore = e.TestScore()
1025   
1026   
1027    if e.TestScore() > PS.maxScore {
1028      PS.maxScore = e.TestScore()
1029    }
1030    if e.TestError() < PS.minError {
1031      PS.minError = e.TestError()
1032      PR.BestNewMinErr = true
1033      //fmt.Printf("Best New Min Error:  %v\n", e)
1034    }
1035    if e.Size() > PS.maxSize {
1036      PS.maxSize = e.Size()
1037    }
1038   
1039    PRes[p] = PR
1040  }
1041 
1042  return PRes
1043}
Note: See TracBrowser for help on using the repository browser.