fix types
This commit is contained in:
parent
3f0bcf0e03
commit
6a68bfdc3b
12
f.go
12
f.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"git.nunosempere.com/NunoSempere/fermi/sample"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -26,14 +27,16 @@ type Lognormal struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l Lognormal) Samples() []float64 {
|
func (l Lognormal) Samples() []float64 {
|
||||||
|
sampler := func(r sample.Src) float64 { return sample.Sample_to(l.low, l.high, r) }
|
||||||
|
return sample.Sample_parallel(sampler, 1_000_000)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 {
|
||||||
low float64
|
low float64
|
||||||
high float64
|
high float64
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
type Dist struct {
|
type Dist struct {
|
||||||
Type string
|
Type string
|
||||||
|
@ -176,6 +179,11 @@ func prettyPrintDist(dist Dist) {
|
||||||
|
|
||||||
/* Main event loop */
|
/* Main event loop */
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
sample_0 := func(r sample.Src) float64 { return 0 }
|
||||||
|
x := sample.Sample_parallel(sample_0, 10)
|
||||||
|
fmt.Printf("%v\n", x)
|
||||||
|
|
||||||
reader := bufio.NewReader(os.Stdin)
|
reader := bufio.NewReader(os.Stdin)
|
||||||
init_dist := Dist{Type: "Lognormal", Lognormal: Lognormal{low: 1, high: 1}, Samples: nil} // Could also just be a scalar
|
init_dist := Dist{Type: "Lognormal", Lognormal: Lognormal{low: 1, high: 1}, Samples: nil} // Could also just be a scalar
|
||||||
old_dist := init_dist
|
old_dist := init_dist
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -1,3 +1,3 @@
|
||||||
module git.nunosempere.com/NunoSempere/fermi.git
|
module git.nunosempere.com/NunoSempere/fermi
|
||||||
|
|
||||||
go 1.22.1
|
go 1.22.1
|
||||||
|
|
|
@ -1,55 +1,53 @@
|
||||||
package squiggle
|
package sample
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
import "math"
|
import "math"
|
||||||
import "sync"
|
import "sync"
|
||||||
import rand "math/rand/v2"
|
import rand "math/rand/v2"
|
||||||
|
|
||||||
// https://pkg.go.dev/math/rand/v2
|
// https://pkg.go.dev/math/rand/v2
|
||||||
|
|
||||||
type src = *rand.Rand
|
type Src = *rand.Rand
|
||||||
type func64 = func(src) float64
|
type func64 = func(Src) float64
|
||||||
|
|
||||||
func Sample_unit_uniform(r src) float64 {
|
func Sample_unit_uniform(r Src) float64 {
|
||||||
return r.Float64()
|
return r.Float64()
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_unit_normal(r src) float64 {
|
func Sample_unit_normal(r Src) float64 {
|
||||||
return r.NormFloat64()
|
return r.NormFloat64()
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_uniform(start float64, end float64, r src) float64 {
|
func Sample_uniform(start float64, end float64, r Src) float64 {
|
||||||
return sample_unit_uniform(r)*(end-start) + start
|
return Sample_unit_uniform(r)*(end-start) + start
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_normal(mean float64, sigma float64, r src) float64 {
|
func Sample_normal(mean float64, sigma float64, r Src) float64 {
|
||||||
return mean + sample_unit_normal(r)*sigma
|
return mean + Sample_unit_normal(r)*sigma
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_lognormal(logmean float64, logstd float64, r src) float64 {
|
func Sample_lognormal(logmean float64, logstd float64, r Src) float64 {
|
||||||
return (math.Exp(sample_normal(logmean, logstd, r)))
|
return (math.Exp(Sample_normal(logmean, logstd, r)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_normal_from_90_ci(low float64, high float64, r src) float64 {
|
func Sample_normal_from_90_ci(low float64, high float64, r Src) float64 {
|
||||||
var normal90 float64 = 1.6448536269514727
|
var normal90 float64 = 1.6448536269514727
|
||||||
var mean float64 = (high + low) / 2.0
|
var mean float64 = (high + low) / 2.0
|
||||||
var std float64 = (high - low) / (2.0 * normal90)
|
var std float64 = (high - low) / (2.0 * normal90)
|
||||||
return sample_normal(mean, std, r)
|
return Sample_normal(mean, std, r)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_to(low float64, high float64, r src) float64 {
|
func Sample_to(low float64, high float64, r Src) float64 {
|
||||||
// Given a (positive) 90% confidence interval,
|
// Given a (positive) 90% confidence interval,
|
||||||
// returns a sample from a lognorma with a matching 90% c.i.
|
// returns a sample from a lognorma with a matching 90% c.i.
|
||||||
// Key idea: If we want a lognormal with 90% confidence interval [a, b]
|
// Key idea: If we want a lognormal with 90% confidence interval [a, b]
|
||||||
// we need but get a normal with 90% confidence interval [log(a), log(b)].
|
// we need but get a normal with 90% confidence interval [log(a), log(b)].
|
||||||
// Then see code for sample_normal_from_90_ci
|
// Then see code for Sample_normal_from_90_ci
|
||||||
var loglow float64 = math.Log(low)
|
var loglow float64 = math.Log(low)
|
||||||
var loghigh float64 = math.Log(high)
|
var loghigh float64 = math.Log(high)
|
||||||
return math.Exp(sample_normal_from_90_ci(loglow, loghigh, r))
|
return math.Exp(Sample_normal_from_90_ci(loglow, loghigh, r))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sample_mixture(fs []func64, weights []float64, r src) float64 {
|
func Sample_mixture(fs []func64, weights []float64, r Src) float64 {
|
||||||
|
|
||||||
// fmt.Println("weights initially: ", weights)
|
// fmt.Println("weights initially: ", weights)
|
||||||
var sum_weights float64 = 0
|
var sum_weights float64 = 0
|
||||||
|
@ -104,6 +102,7 @@ func Sample_parallel(f func64, n_samples int) []float64 {
|
||||||
return xs
|
return xs
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
@ -112,15 +111,15 @@ func main() {
|
||||||
var p_c float64 = p_a * p_b
|
var p_c float64 = p_a * p_b
|
||||||
ws := [4](float64){1 - p_c, p_c / 2, p_c / 4, p_c / 4}
|
ws := [4](float64){1 - p_c, p_c / 2, p_c / 4, p_c / 4}
|
||||||
|
|
||||||
sample_0 := func(r src) float64 { return 0 }
|
Sample_0 := func(r Src) float64 { return 0 }
|
||||||
sample_1 := func(r src) float64 { return 1 }
|
Sample_1 := func(r Src) float64 { return 1 }
|
||||||
sample_few := func(r src) float64 { return sample_to(1, 3, r) }
|
Sample_few := func(r Src) float64 { return Sample_to(1, 3, r) }
|
||||||
sample_many := func(r src) float64 { return sample_to(2, 10, r) }
|
Sample_many := func(r Src) float64 { return Sample_to(2, 10, r) }
|
||||||
fs := [4](func64){sample_0, sample_1, sample_few, sample_many}
|
fs := [4](func64){Sample_0, Sample_1, Sample_few, Sample_many}
|
||||||
|
|
||||||
model := func(r src) float64 { return sample_mixture(fs[0:], ws[0:], r) }
|
model := func(r Src) float64 { return Sample_mixture(fs[0:], ws[0:], r) }
|
||||||
n_samples := 1_000_000
|
n_samples := 1_000_000
|
||||||
xs := sample_parallel(model, n_samples)
|
xs := Sample_parallel(model, n_samples)
|
||||||
var avg float64 = 0
|
var avg float64 = 0
|
||||||
for _, x := range xs {
|
for _, x := range xs {
|
||||||
avg += x
|
avg += x
|
||||||
|
@ -133,10 +132,9 @@ func main() {
|
||||||
var r = rand.New(rand.NewPCG(uint64(1), uint64(2)))
|
var r = rand.New(rand.NewPCG(uint64(1), uint64(2)))
|
||||||
var avg float64 = 0
|
var avg float64 = 0
|
||||||
for i := 0; i < n_samples; i++ {
|
for i := 0; i < n_samples; i++ {
|
||||||
avg += sample_mixture(fs[0:], ws[0:], r)
|
avg += Sample_mixture(fs[0:], ws[0:], r)
|
||||||
}
|
}
|
||||||
avg = avg / float64(n_samples)
|
avg = avg / float64(n_samples)
|
||||||
fmt.Printf("Average: %v\n", avg)
|
fmt.Printf("Average: %v\n", avg)
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user