savepoint
This commit is contained in:
parent
318b8da414
commit
b0adde937f
45
f.go
45
f.go
|
@ -17,8 +17,9 @@ const GENERAL_ERR_MSG = "Valid inputs: 2 || * 2 || / 2 || 2 20 || * 2 20 || / 2
|
||||||
// Distribution interface
|
// Distribution interface
|
||||||
// https://go.dev/tour/methods/9
|
// https://go.dev/tour/methods/9
|
||||||
|
|
||||||
type Distribution interface {
|
type Dist interface {
|
||||||
Samples() []float64
|
Samples() []float64
|
||||||
|
Type() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lognormal implementing Distribution
|
// Lognormal implementing Distribution
|
||||||
|
@ -31,6 +32,9 @@ func (ln Lognormal) Samples() []float64 {
|
||||||
sampler := func(r sample.Src) float64 { return sample.Sample_to(ln.low, ln.high, r) }
|
sampler := func(r sample.Src) float64 { return sample.Sample_to(ln.low, ln.high, r) }
|
||||||
return sample.Sample_parallel(sampler, 1_000_000)
|
return sample.Sample_parallel(sampler, 1_000_000)
|
||||||
}
|
}
|
||||||
|
func (ln Lognormal) Type() string {
|
||||||
|
return "Lognormal"
|
||||||
|
}
|
||||||
|
|
||||||
// Beta implementing Distribution
|
// Beta implementing Distribution
|
||||||
type Beta struct {
|
type Beta struct {
|
||||||
|
@ -41,7 +45,9 @@ type Beta struct {
|
||||||
func (beta Beta) Samples() []float64 {
|
func (beta Beta) Samples() []float64 {
|
||||||
sampler := func(r sample.Src) float64 { return sample.Sample_beta(beta.a, beta.b, r) }
|
sampler := func(r sample.Src) float64 { return sample.Sample_beta(beta.a, beta.b, r) }
|
||||||
return sample.Sample_parallel(sampler, 1_000_000)
|
return sample.Sample_parallel(sampler, 1_000_000)
|
||||||
|
}
|
||||||
|
func (beta Beta) Type() string {
|
||||||
|
return "Beta"
|
||||||
}
|
}
|
||||||
|
|
||||||
// FilledSamples implementing Distribution
|
// FilledSamples implementing Distribution
|
||||||
|
@ -52,6 +58,9 @@ type FilledSamples struct {
|
||||||
func (fs FilledSamples) Samples() []float64 {
|
func (fs FilledSamples) Samples() []float64 {
|
||||||
return fs.xs
|
return fs.xs
|
||||||
}
|
}
|
||||||
|
func (beta FilledSamples) Type() string {
|
||||||
|
return "FilledSamples"
|
||||||
|
}
|
||||||
|
|
||||||
// Actually, I should look up how do do a) enums in go, b) union types
|
// Actually, I should look up how do do a) enums in go, b) union types
|
||||||
/*type Lognormal struct {
|
/*type Lognormal struct {
|
||||||
|
@ -60,17 +69,20 @@ func (fs FilledSamples) Samples() []float64 {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
type Dist struct {
|
type Dist struct {
|
||||||
Type string
|
Type string
|
||||||
Lognormal Lognormal
|
Lognormal Lognormal
|
||||||
Samples []float64
|
Samples []float64
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Parse line into Distribution
|
// Parse line into Distribution
|
||||||
func parseLineErr(err_msg string) (string, Dist, error) {
|
func parseLineErr(err_msg string) (string, Dist, error) {
|
||||||
fmt.Println(GENERAL_ERR_MSG)
|
fmt.Println(GENERAL_ERR_MSG)
|
||||||
fmt.Println(err_msg)
|
fmt.Println(err_msg)
|
||||||
return "", Dist{}, errors.New(err_msg)
|
var errorDist Dist
|
||||||
|
return "", errorDist, errors.New(err_msg)
|
||||||
}
|
}
|
||||||
func parseLine(line string, vars map[string]Dist) (string, Dist, error) {
|
func parseLine(line string, vars map[string]Dist) (string, Dist, error) {
|
||||||
|
|
||||||
|
@ -103,7 +115,7 @@ func parseLine(line string, vars map[string]Dist) (string, Dist, error) {
|
||||||
case var_word_exists:
|
case var_word_exists:
|
||||||
dist = var_word
|
dist = var_word
|
||||||
case err1 == nil:
|
case err1 == nil:
|
||||||
dist = Dist{Type: "Lognormal", Lognormal: Lognormal{low: single_float, high: single_float}, Samples: nil}
|
dist = Lognormal{low: single_float, high: single_float}
|
||||||
case err1 != nil && !var_word_exists:
|
case err1 != nil && !var_word_exists:
|
||||||
return parseLineErr("Trying to operate on a scalar, but scalar is neither a float nor an assigned variable")
|
return parseLineErr("Trying to operate on a scalar, but scalar is neither a float nor an assigned variable")
|
||||||
}
|
}
|
||||||
|
@ -113,7 +125,7 @@ func parseLine(line string, vars map[string]Dist) (string, Dist, error) {
|
||||||
if err1 != nil || err2 != nil {
|
if err1 != nil || err2 != nil {
|
||||||
return parseLineErr("Trying to operate by a distribution, but distribution is not specified as two floats")
|
return parseLineErr("Trying to operate by a distribution, but distribution is not specified as two floats")
|
||||||
}
|
}
|
||||||
dist = Dist{Type: "Lognormal", Lognormal: Lognormal{low: new_low, high: new_high}, Samples: nil}
|
dist = Lognormal{low: new_low, high: new_high}
|
||||||
default:
|
default:
|
||||||
return parseLineErr("Other input methods not implemented yet")
|
return parseLineErr("Other input methods not implemented yet")
|
||||||
}
|
}
|
||||||
|
@ -147,14 +159,19 @@ func multiplyBetaDists(beta1 Beta, beta2 Beta) Beta {
|
||||||
|
|
||||||
func joinDists(old_dist Dist, new_dist Dist, op string) (Dist, error) {
|
func joinDists(old_dist Dist, new_dist Dist, op string) (Dist, error) {
|
||||||
switch {
|
switch {
|
||||||
case old_dist.Type == "Lognormal" && new_dist.Type == "Lognormal" && op == "*":
|
|
||||||
return Dist{Type: "Lognormal", Lognormal: multiplyLogDists(old_dist.Lognormal, new_dist.Lognormal), Samples: nil}, nil
|
|
||||||
case old_dist.Type == "Lognormal" && new_dist.Type == "Lognormal" && op == "/":
|
|
||||||
tmp_dist := Lognormal{low: 1.0 / new_dist.Lognormal.high, high: 1.0 / new_dist.Lognormal.low}
|
|
||||||
return Dist{Type: "Lognormal", Lognormal: multiplyLogDists(old_dist.Lognormal, tmp_dist), Samples: nil}, nil
|
|
||||||
default:
|
|
||||||
fmt.Printf("For now, can't do anything besides multiplying lognormals\n")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
switch {
|
||||||
|
case old_dist.Type == "Lognormal" && new_dist.Type == "Lognormal" && op == "*":
|
||||||
|
return Dist{Type: "Lognormal", Lognormal: multiplyLogDists(old_dist.Lognormal, new_dist.Lognormal), Samples: nil}, nil
|
||||||
|
case old_dist.Type == "Lognormal" && new_dist.Type == "Lognormal" && op == "/":
|
||||||
|
tmp_dist := Lognormal{low: 1.0 / new_dist.Lognormal.high, high: 1.0 / new_dist.Lognormal.low}
|
||||||
|
return Dist{Type: "Lognormal", Lognormal: multiplyLogDists(old_dist.Lognormal, tmp_dist), Samples: nil}, nil
|
||||||
|
default:
|
||||||
|
fmt.Printf("For now, can't do anything besides multiplying lognormals\n")
|
||||||
|
}
|
||||||
|
*/
|
||||||
return old_dist, errors.New("Can't combine distributions in this way")
|
return old_dist, errors.New("Can't combine distributions in this way")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,8 +213,8 @@ func prettyPrintLognormal(low float64, high float64) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func prettyPrintDist(dist Dist) {
|
func prettyPrintDist(dist Dist) {
|
||||||
if dist.Type == "Lognormal" {
|
if dist.Type() == "Lognormal" {
|
||||||
prettyPrintLognormal(dist.Lognormal.low, dist.Lognormal.high)
|
prettyPrintLognormal(dist.low, dist.high)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("%v", dist)
|
fmt.Printf("%v", dist)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user