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