コード例 #1
0
ファイル: benchmarks.go プロジェクト: verdverm/go-pge
func GenBenchData(e expr.Expr, vars []BenchmarkVar, samples int) (pts []Point) {
	pts = make([]Point, 0)
	if vars[0].Rtype == Uniform {
		for i := 0; i < samples; i++ {
			input := make([]float64, len(vars))
		retry:
			for j, v := range vars {
				r := rand.Float64()
				input[j] = (r * (v.H - v.L)) + v.L
			}
			out := e.Eval(0, input, nil, nil)

			if math.IsNaN(out) || math.IsInf(out, 0) || math.Abs(out) > 100000.0 {
				goto retry
			}

			var pnt Point
			pnt.SetIndeps(input)
			pnt.SetDepnds([]float64{out})
			pts = append(pts, pnt)
		}
	} else { // RangeType == Equal
		counter := make([]float64, len(vars))
		for j, v := range vars {
			counter[j] = v.L
		}
		L1, L2 := len(vars)-1, vars[len(vars)-1].L

		for counter[L1] <= L2 {
			input := make([]float64, len(vars))
			copy(input, counter)

			out := e.Eval(0, input, nil, nil)
			var pnt Point
			pnt.SetIndeps(input)
			pnt.SetDepnds([]float64{out})
			pts = append(pts, pnt)

			// increment counter
			for j, v := range vars {
				counter[j] += v.S
				if counter[j] > v.H {
					counter[j] = v.L
				} else {
					break
				}
			}
		}

	}

	return
}
コード例 #2
0
ファイル: pge_search.go プロジェクト: verdverm/go-pge
func scoreExpr(e expr.Expr, P *probs.ExprProblem, dataSets []*probs.PointSet, coeff []float64) (hitsL1, hitsL2, evalCnt, nanCnt, infCnt int, l1_err, l2_err float64) {
	var l1_sum, l2_sum float64
	for _, PS := range dataSets {
		for _, p := range PS.Points() {
			y := p.Depnd(P.SearchVar)
			var out float64
			if P.SearchType == probs.ExprBenchmark {
				out = e.Eval(0, p.Indeps(), coeff, PS.SysVals())
			} else if P.SearchType == probs.ExprDiffeq {
				out = e.Eval(p.Indep(0), p.Indeps()[1:], coeff, PS.SysVals())
			}

			if math.IsNaN(out) {
				nanCnt++
				continue
			} else if math.IsInf(out, 0) {
				infCnt++
				continue
			} else {
				evalCnt++
			}

			diff := out - y
			l1_val := math.Abs(diff)
			l2_val := diff * diff
			l1_sum += l1_val
			l2_sum += l2_val

			if l1_val < P.HitRatio {
				hitsL1++
			}
			if l2_val < P.HitRatio {
				hitsL2++
			}
		}
	}

	if evalCnt == 0 {
		l1_err = math.NaN()
		l2_err = math.NaN()
	} else {
		fEvalCnt := float64(evalCnt + 1)
		l1_err = l1_sum / fEvalCnt
		l2_err = math.Sqrt(l2_sum / fEvalCnt)
	}

	return
}