start refactoring to explicitly manipulate stack struct
This commit is contained in:
		
							parent
							
								
									e5b48270e6
								
							
						
					
					
						commit
						0dbe3842a7
					
				
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							|  | @ -11,7 +11,7 @@ Sometimes, [Squiggle](https://github.com/quantified-uncertainty/squiggle), [simp | |||
| Here is an example | ||||
| 
 | ||||
| ``` | ||||
| $ go run f.go | ||||
| $ go run fermi.go | ||||
| 5000000 12000000 | ||||
| => 5.0M 12.0M | ||||
| * beta 1 200 | ||||
|  | @ -31,7 +31,7 @@ $ go run f.go | |||
| Perhaps this example is more understandable with comments and better units: | ||||
| 
 | ||||
| ``` | ||||
| $ sed -u "s|#.*||" | sed -u 's|M|000000|g' | go run f.go | ||||
| $ sed -u "s|#.*||" | sed -u 's|M|000000|g' | go run fermi.go | ||||
| 5M 12M # number of people living in Chicago | ||||
| => 5.0M 12.0M | ||||
| * beta 1 200 # fraction of people that have a piano | ||||
|  | @ -79,7 +79,7 @@ The difference between `=: x` and `=. y` is that `=.` clears the stack after the | |||
| ``` | ||||
| make build | ||||
| sudo make install | ||||
| f # rather than the previous go run f.go | ||||
| f # rather than the previous go run fermi.go | ||||
| ``` | ||||
| 
 | ||||
| Why use make instead of the built-in go commands? Because the point of make is to be able to share command-line recipes.  | ||||
|  | @ -93,8 +93,8 @@ sed -u "s|#.*||" | sed -u 's|M|000000|g' | f | |||
| cat more/piano-tuners.f | f | ||||
| cat more/piano-tuners-commented.f | sed -u "s|#.*||" | sed -u 's|M|000000|g' | f | ||||
| 
 | ||||
| tee -a input.log | go run f.go | tee -a output.log | ||||
| tee -a io.log | go run f.go | tee -a io.log | ||||
| tee -a input.log | go run fermi.go | tee -a output.log | ||||
| tee -a io.log | go run fermi.go | tee -a io.log | ||||
| 
 | ||||
| function f(){ | ||||
|   sed -u "s|#.*||" |  | ||||
|  |  | |||
							
								
								
									
										77
									
								
								fermi.go
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								fermi.go
									
									
									
									
									
								
							|  | @ -14,7 +14,7 @@ import ( | |||
| 
 | ||||
| const NORMAL90CONFIDENCE = 1.6448536269514727 | ||||
| const GENERAL_ERR_MSG = "Valid inputs: 2 || * 2 || / 2 || 2 20 || * 2 20 || / 2 20 || clean || =: var || op var || clean || help || debug || exit" | ||||
| const N_SAMPLES = 1_000_000 | ||||
| const N_SAMPLES = 100_000 | ||||
| 
 | ||||
| // Distribution interface
 | ||||
| // https://go.dev/tour/methods/9
 | ||||
|  | @ -255,6 +255,21 @@ func joinDists(old_dist Dist, new_dist Dist, op string) (Dist, error) { | |||
| } | ||||
| 
 | ||||
| /* Pretty print distributions */ | ||||
| func prettyPrintInt(n int) { | ||||
| 	switch { | ||||
| 	case math.Abs(float64(n)) >= 1_000_000_000_000: | ||||
| 		fmt.Printf("%dT", n/1_000_000_000_000) | ||||
| 	case math.Abs(float64(n)) >= 1_000_000_000: | ||||
| 		fmt.Printf("%dB", n/1_000_000_000) | ||||
| 	case math.Abs(float64(n)) >= 1_000_000: | ||||
| 		fmt.Printf("%dM", n/1_000_000) | ||||
| 	case math.Abs(float64(n)) >= 1_000: | ||||
| 		fmt.Printf("%dK", n/1_000) | ||||
| 	default: | ||||
| 		fmt.Printf("%df", n) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func prettyPrintFloat(f float64) { | ||||
| 	switch { | ||||
| 	case math.Abs(f) >= 1_000_000_000_000: | ||||
|  | @ -301,8 +316,13 @@ func prettyPrintDist(dist Dist) { | |||
| 		low := tmp_xs[low_int] | ||||
| 		high_int := N_SAMPLES * 19 / 20 | ||||
| 		high := tmp_xs[high_int] | ||||
| 		fmt.Printf("=> samples ") | ||||
| 		prettyPrint2Floats(low, high) | ||||
| 		fmt.Printf("=> ") | ||||
| 		prettyPrintFloat(low) | ||||
| 		fmt.Printf(" ") | ||||
| 		prettyPrintFloat(high) | ||||
| 		fmt.Printf(" (") | ||||
| 		prettyPrintInt(N_SAMPLES) | ||||
| 		fmt.Printf(" samples)\n") | ||||
| 	case Beta: | ||||
| 		fmt.Printf("=> beta ") | ||||
| 		prettyPrint2Floats(v.a, v.b) | ||||
|  | @ -316,16 +336,29 @@ func prettyPrintDist(dist Dist) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* Combine old dist and new line */ | ||||
| // We want this as a function to be able to have parenthesis/recusion, possibly functions
 | ||||
| const init_dist Scalar = Scalar(1) | ||||
| 
 | ||||
| type Stack struct { | ||||
| 	old_dist Dist | ||||
| 	vars     map[string]Dist | ||||
| } | ||||
| 
 | ||||
| // Could eventually be a more complex struct with:
 | ||||
| // { Dist, VariableMaps, ConfigParams } or smth
 | ||||
| 
 | ||||
| /* | ||||
| func combineStackAndNewLine(stack Stack, new_line string) Stack { | ||||
| 
 | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| /* Main event loop */ | ||||
| func main() { | ||||
| 
 | ||||
| 	reader := bufio.NewReader(os.Stdin) | ||||
| 	var init_dist Dist | ||||
| 	init_dist = Scalar(1) // Lognormal{low: 1, high: 1}
 | ||||
| 	old_dist := init_dist | ||||
| 	vars := make(map[string]Dist) | ||||
| 	// Could eventually be a more complex struct with:
 | ||||
| 	// { Dist, VariableMaps, ConfigParams } or smth
 | ||||
| 	stack := Stack{old_dist: init_dist, vars: make(map[string]Dist)} | ||||
| EventForLoop: | ||||
| 	for { | ||||
| 		input, _ := reader.ReadString('\n') | ||||
|  | @ -342,23 +375,23 @@ EventForLoop: | |||
| 				fmt.Println(GENERAL_ERR_MSG) | ||||
| 				continue EventForLoop | ||||
| 			case words[0] == "debug" || words[0] == "d": | ||||
| 				fmt.Printf("Old dist: %v\n", old_dist) | ||||
| 				fmt.Printf("Vars: %v\n", vars) | ||||
| 				fmt.Printf("Old dist: %v\n", stack.old_dist) | ||||
| 				fmt.Printf("Vars: %v\n", stack.vars) | ||||
| 				continue EventForLoop | ||||
| 			case words[0] == "=:" && len(words) == 2: | ||||
| 				vars[words[1]] = old_dist | ||||
| 				stack.vars[words[1]] = stack.old_dist | ||||
| 				fmt.Printf("%s ", words[1]) | ||||
| 				prettyPrintDist(old_dist) | ||||
| 				prettyPrintDist(stack.old_dist) | ||||
| 				continue EventForLoop | ||||
| 			case words[0] == "." || words[0] == "clean" || words[0] == "c": | ||||
| 				old_dist = init_dist | ||||
| 				stack.old_dist = init_dist | ||||
| 				fmt.Println() | ||||
| 				continue EventForLoop | ||||
| 			case words[0] == "=." && len(words) == 2: | ||||
| 				vars[words[1]] = old_dist | ||||
| 				stack.vars[words[1]] = stack.old_dist | ||||
| 				fmt.Printf("%s ", words[1]) | ||||
| 				prettyPrintDist(old_dist) | ||||
| 				old_dist = init_dist | ||||
| 				prettyPrintDist(stack.old_dist) | ||||
| 				stack.old_dist = init_dist | ||||
| 				fmt.Println() | ||||
| 				continue EventForLoop | ||||
| 				// Other possible cases:
 | ||||
|  | @ -370,19 +403,19 @@ EventForLoop: | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		op, new_dist, err := parseLine(input, vars) | ||||
| 		op, new_dist, err := parseLine(input, stack.vars) | ||||
| 		if err != nil { | ||||
| 			continue EventForLoop | ||||
| 		} | ||||
| 
 | ||||
| 		joint_dist, err := joinDists(old_dist, new_dist, op) | ||||
| 		joint_dist, err := joinDists(stack.old_dist, new_dist, op) | ||||
| 		if err != nil { | ||||
| 			fmt.Printf("%v\n", err) | ||||
| 			fmt.Printf("Dist on stack: ") | ||||
| 			prettyPrintDist(old_dist) | ||||
| 			prettyPrintDist(stack.old_dist) | ||||
| 			continue EventForLoop | ||||
| 		} | ||||
| 		old_dist = joint_dist | ||||
| 		prettyPrintDist(old_dist) | ||||
| 		stack.old_dist = joint_dist | ||||
| 		prettyPrintDist(stack.old_dist) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user