From 239e21509fddc21f28af1d26182099cdc204f296 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Tue, 18 Jun 2024 22:44:24 -0400 Subject: [PATCH] fengshui --- .fermi.go.swp | Bin 0 -> 36864 bytes fermi.go | 185 ++++++++++++++++++----------------------------- pretty/pretty.go | 52 +++++++++++++ 3 files changed, 123 insertions(+), 114 deletions(-) create mode 100644 .fermi.go.swp create mode 100644 pretty/pretty.go diff --git a/.fermi.go.swp b/.fermi.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..c7848d530b53919404cde5a695e92135223df555 GIT binary patch literal 36864 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 ") + pretty.PrettyPrint2Floats(v.low, v.high) + case FilledSamples: + tmp_xs := make([]float64, N_SAMPLES) + copy(tmp_xs, v.xs) + sort.Slice(tmp_xs, func(i, j int) bool { + return tmp_xs[i] < tmp_xs[j] + }) + low_int := N_SAMPLES / 20 + low := tmp_xs[low_int] + high_int := N_SAMPLES * 19 / 20 + high := tmp_xs[high_int] + fmt.Printf("=> ") + pretty.PrettyPrintFloat(low) + fmt.Printf(" ") + pretty.PrettyPrintFloat(high) + fmt.Printf(" (") + pretty.PrettyPrintInt(N_SAMPLES) + fmt.Printf(" samples)\n") + case Beta: + fmt.Printf("=> beta ") + pretty.PrettyPrint2Floats(v.a, v.b) + case Scalar: + fmt.Printf("=> scalar ") + w := float64(v) + pretty.PrettyPrintFloat(w) + fmt.Println() + default: + fmt.Printf("%v", v) + } +} + +// Parse line into Distribution func parseLineErr(err_msg string) (string, Dist, error) { fmt.Println(GENERAL_ERR_MSG) fmt.Println(err_msg) @@ -253,8 +290,10 @@ func divideDists(old_dist Dist, new_dist Dist) (Dist, error) { { switch n := new_dist.(type) { case Lognormal: + // to do: check division by zero return multiplyLogDists(o, Lognormal{low: 1.0 / n.high, high: 1.0 / n.low}), nil case Scalar: + // to do: check division by zero return multiplyLogDists(o, Lognormal{low: 1.0 / float64(n), high: 1.0 / float64(n)}), nil default: return operateDistsAsSamples(old_dist, new_dist, "/") @@ -266,6 +305,7 @@ func divideDists(old_dist Dist, new_dist Dist) (Dist, error) { case Lognormal: return multiplyLogDists(Lognormal{low: float64(o), high: float64(o)}, Lognormal{low: 1.0 / n.high, high: 1.0 / n.low}), nil case Scalar: + // to do: check division by zero return Scalar(float64(o) / float64(n)), nil default: return operateDistsAsSamples(old_dist, new_dist, "/") @@ -276,92 +316,9 @@ func divideDists(old_dist Dist, new_dist Dist) (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: - fmt.Printf("%.1fT", f/1_000_000_000_000) - case math.Abs(f) >= 1_000_000_000: - fmt.Printf("%.1fB", f/1_000_000_000) - case math.Abs(f) >= 1_000_000: - fmt.Printf("%.1fM", f/1_000_000) - case math.Abs(f) >= 1_000: - fmt.Printf("%.1fK", f/1_000) - - case math.Abs(f) <= 0.0001: - fmt.Printf("%.5f", f) - case math.Abs(f) <= 0.001: - fmt.Printf("%.4f", f) - case math.Abs(f) <= 0.01: - fmt.Printf("%.3f", f) - case math.Abs(f) <= 0.1: - fmt.Printf("%.2f", f) - default: - fmt.Printf("%.1f", f) - } - -} -func prettyPrint2Floats(low float64, high float64) { - prettyPrintFloat(low) - fmt.Printf(" ") - prettyPrintFloat(high) - fmt.Printf("\n") -} - -func prettyPrintDist(dist Dist) { - switch v := dist.(type) { - case Lognormal: - fmt.Printf("=> ") - prettyPrint2Floats(v.low, v.high) - case FilledSamples: - tmp_xs := make([]float64, N_SAMPLES) - copy(tmp_xs, v.xs) - sort.Slice(tmp_xs, func(i, j int) bool { - return tmp_xs[i] < tmp_xs[j] - }) - low_int := N_SAMPLES / 20 - low := tmp_xs[low_int] - high_int := N_SAMPLES * 19 / 20 - high := tmp_xs[high_int] - 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) - case Scalar: - fmt.Printf("=> scalar ") - w := float64(v) - prettyPrintFloat(w) - fmt.Println() - default: - fmt.Printf("%v", v) - } -} - /* Combine old dist and new line */ // We want this as a function to be able to have parenthesis/recusion, possibly functions -func combineStackAndDist(stack Stack, new_dist Dist, op string) Stack { +func operateStackWithDist(stack Stack, new_dist Dist, op string) Stack { var combined_dist Dist var err error @@ -403,7 +360,7 @@ func runRepl(stack Stack, reader *bufio.Reader) Stack { /* Parenthesis */ case len(words) == 2 && (words[0] == "*" || words[0] == "+" || words[0] == "-" || words[0] == "/") && words[1] == "(": new_stack := runRepl(Stack{old_dist: INIT_DIST, vars: stack.vars}, reader) - stack = combineStackAndDist(stack, new_stack.old_dist, words[0]) + stack = operateStackWithDist(stack, new_stack.old_dist, words[0]) prettyPrintDist(stack.old_dist) case len(words) == 1 && words[0] == ")": return stack @@ -439,7 +396,7 @@ func runRepl(stack Stack, reader *bufio.Reader) Stack { if err != nil { continue replForLoop } - stack = combineStackAndDist(stack, new_dist, op) + stack = operateStackWithDist(stack, new_dist, op) prettyPrintDist(stack.old_dist) } } diff --git a/pretty/pretty.go b/pretty/pretty.go new file mode 100644 index 0000000..371f9b4 --- /dev/null +++ b/pretty/pretty.go @@ -0,0 +1,52 @@ +package pretty + +import ( + "fmt" + "math" +) + +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: + fmt.Printf("%.1fT", f/1_000_000_000_000) + case math.Abs(f) >= 1_000_000_000: + fmt.Printf("%.1fB", f/1_000_000_000) + case math.Abs(f) >= 1_000_000: + fmt.Printf("%.1fM", f/1_000_000) + case math.Abs(f) >= 1_000: + fmt.Printf("%.1fK", f/1_000) + + case math.Abs(f) <= 0.0001: + fmt.Printf("%.5f", f) + case math.Abs(f) <= 0.001: + fmt.Printf("%.4f", f) + case math.Abs(f) <= 0.01: + fmt.Printf("%.3f", f) + case math.Abs(f) <= 0.1: + fmt.Printf("%.2f", f) + default: + fmt.Printf("%.1f", f) + } + +} +func PrettyPrint2Floats(low float64, high float64) { + PrettyPrintFloat(low) + fmt.Printf(" ") + PrettyPrintFloat(high) + fmt.Printf("\n") +}