Browse Source

Merge branch 'master' of https://github.com/odin-lang/Odin

gingerBill 4 years ago
parent
commit
82a74ebfa9

+ 2 - 2
core/math/big/build.bat

@@ -1,9 +1,9 @@
 @echo off
 @echo off
-:odin run . -vet -o:size
+odin run . -vet -o:size
 : -o:size
 : -o:size
 :odin build . -build-mode:shared -show-timings -o:minimal -no-bounds-check -define:MATH_BIG_EXE=false && python test.py -fast-tests
 :odin build . -build-mode:shared -show-timings -o:minimal -no-bounds-check -define:MATH_BIG_EXE=false && python test.py -fast-tests
 :odin build . -build-mode:shared -show-timings -o:size -no-bounds-check -define:MATH_BIG_EXE=false && python test.py -fast-tests
 :odin build . -build-mode:shared -show-timings -o:size -no-bounds-check -define:MATH_BIG_EXE=false && python test.py -fast-tests
 :odin build . -build-mode:shared -show-timings -o:size -define:MATH_BIG_EXE=false && python test.py -fast-tests
 :odin build . -build-mode:shared -show-timings -o:size -define:MATH_BIG_EXE=false && python test.py -fast-tests
-odin build . -build-mode:shared -show-timings -o:speed -no-bounds-check -define:MATH_BIG_EXE=false && python test.py
+:odin build . -build-mode:shared -show-timings -o:speed -no-bounds-check -define:MATH_BIG_EXE=false && python test.py
 : -fast-tests
 : -fast-tests
 :odin build . -build-mode:shared -show-timings -o:speed -define:MATH_BIG_EXE=false && python test.py -fast-tests
 :odin build . -build-mode:shared -show-timings -o:speed -define:MATH_BIG_EXE=false && python test.py -fast-tests

+ 1 - 1
core/math/big/common.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/example.odin

@@ -3,7 +3,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	A BigInt implementation in Odin.
 	A BigInt implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/helpers.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/internal.odin

@@ -3,7 +3,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	A BigInt implementation in Odin.
 	A BigInt implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/logical.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/prime.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 6 - 10
core/math/big/private.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
@@ -1540,6 +1540,8 @@ _private_int_log :: proc(a: ^Int, base: DIGIT, allocator := context.allocator) -
 }
 }
 
 
 
 
+
+
 /*
 /*
 	hac 14.61, pp608
 	hac 14.61, pp608
 */
 */
@@ -1708,9 +1710,7 @@ _private_inverse_modulo_odd :: proc(dest, a, b: ^Int, allocator := context.alloc
 	/*
 	/*
 		2. [modified] `b` must be odd.
 		2. [modified] `b` must be odd.
 	*/
 	*/
-	if internal_is_even(b) {
-		return .Invalid_Argument;
-	}
+	if internal_is_even(b) { return .Invalid_Argument; }
 
 
 	/*
 	/*
 		Init all our temps.
 		Init all our temps.
@@ -1730,9 +1730,7 @@ _private_inverse_modulo_odd :: proc(dest, a, b: ^Int, allocator := context.alloc
 	/*
 	/*
 		If one of `x`, `y` is zero return an error!
 		If one of `x`, `y` is zero return an error!
 	*/
 	*/
-	if internal_is_zero(x) || internal_is_zero(y) {
-		return .Invalid_Argument;
-	}
+	if internal_is_zero(x) || internal_is_zero(y) { return .Invalid_Argument; }
 
 
 	/*
 	/*
 		3. `u` = `x`, `v` = `y`, `A` = 1, `B` = 0, `C` = 0, `D` = 1
 		3. `u` = `x`, `v` = `y`, `A` = 1, `B` = 0, `C` = 0, `D` = 1
@@ -1812,9 +1810,7 @@ _private_inverse_modulo_odd :: proc(dest, a, b: ^Int, allocator := context.alloc
 		/*
 		/*
 			If not zero goto step 4.
 			If not zero goto step 4.
 		*/
 		*/
-		if internal_is_zero(u) {
-			break;
-		}
+		if internal_is_zero(u) { break; }
 	}
 	}
 
 
 	/*
 	/*

+ 1 - 1
core/math/big/public.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/radix.odin

@@ -2,7 +2,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 1 - 1
core/math/big/test.odin

@@ -3,7 +3,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	An arbitrary precision mathematics implementation in Odin.
 	An arbitrary precision mathematics implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.

+ 30 - 23
core/math/big/test.py

@@ -14,6 +14,7 @@ parser = argparse.ArgumentParser(
 	epilog          = "By default we run regression and random tests with preset parameters.",
 	epilog          = "By default we run regression and random tests with preset parameters.",
     formatter_class = argparse.ArgumentDefaultsHelpFormatter,
     formatter_class = argparse.ArgumentDefaultsHelpFormatter,
 )
 )
+
 #
 #
 # Normally, we report the number of passes and fails. With this option set, we exit at first fail.
 # Normally, we report the number of passes and fails. With this option set, we exit at first fail.
 #
 #
@@ -22,10 +23,10 @@ parser.add_argument(
 	help    = "Exit when a test fails",
 	help    = "Exit when a test fails",
 	action  = "store_true",
 	action  = "store_true",
 )
 )
+
 #
 #
 # We skip randomized tests altogether if this is set.
 # We skip randomized tests altogether if this is set.
 #
 #
-
 no_random = parser.add_mutually_exclusive_group()
 no_random = parser.add_mutually_exclusive_group()
 
 
 no_random.add_argument(
 no_random.add_argument(
@@ -33,13 +34,13 @@ no_random.add_argument(
 	help    = "No random tests",
 	help    = "No random tests",
 	action  = "store_true",
 	action  = "store_true",
 )
 )
+
 #
 #
 # Normally we run a given number of cycles on each test.
 # Normally we run a given number of cycles on each test.
 # Timed tests budget 1 second per 20_000 bits instead.
 # Timed tests budget 1 second per 20_000 bits instead.
 #
 #
 # For timed tests we budget a second per `n` bits and iterate until we hit that time.
 # For timed tests we budget a second per `n` bits and iterate until we hit that time.
 #
 #
-
 timed_or_fast = no_random.add_mutually_exclusive_group()
 timed_or_fast = no_random.add_mutually_exclusive_group()
 
 
 timed_or_fast.add_argument(
 timed_or_fast.add_argument(
@@ -55,6 +56,7 @@ parser.add_argument(
 	default = 20_000,
 	default = 20_000,
 	help    = "Timed tests. Every `BITS` worth of input is given a second of running time.",
 	help    = "Timed tests. Every `BITS` worth of input is given a second of running time.",
 )
 )
+
 #
 #
 # For normal tests (non-timed), `-fast-tests` cuts down on the number of iterations.
 # For normal tests (non-timed), `-fast-tests` cuts down on the number of iterations.
 #
 #
@@ -136,7 +138,6 @@ gc.disable()
 #
 #
 # Set up exported procedures
 # Set up exported procedures
 #
 #
-
 try:
 try:
 	l = cdll.LoadLibrary(LIB_PATH)
 	l = cdll.LoadLibrary(LIB_PATH)
 except:
 except:
@@ -159,29 +160,28 @@ print("initialize_constants: ", initialize_constants())
 
 
 error_string = load(l.test_error_string, [c_byte], c_char_p)
 error_string = load(l.test_error_string, [c_byte], c_char_p)
 
 
-add        = load(l.test_add,    [c_char_p, c_char_p],   Res)
-sub        = load(l.test_sub,    [c_char_p, c_char_p],   Res)
-mul        = load(l.test_mul,    [c_char_p, c_char_p],   Res)
-sqr        = load(l.test_sqr,    [c_char_p          ],   Res)
-div        = load(l.test_div,    [c_char_p, c_char_p],   Res)
+add        =     load(l.test_add,        [c_char_p, c_char_p],   Res)
+sub        =     load(l.test_sub,        [c_char_p, c_char_p],   Res)
+mul        =     load(l.test_mul,        [c_char_p, c_char_p],   Res)
+sqr        =     load(l.test_sqr,        [c_char_p          ],   Res)
+div        =     load(l.test_div,        [c_char_p, c_char_p],   Res)
 
 
 # Powers and such
 # Powers and such
-int_log    = load(l.test_log,    [c_char_p, c_longlong], Res)
-int_pow    = load(l.test_pow,    [c_char_p, c_longlong], Res)
-int_sqrt   = load(l.test_sqrt,   [c_char_p            ], Res)
-int_root_n = load(l.test_root_n, [c_char_p, c_longlong], Res)
+int_log    =     load(l.test_log,        [c_char_p, c_longlong], Res)
+int_pow    =     load(l.test_pow,        [c_char_p, c_longlong], Res)
+int_sqrt   =     load(l.test_sqrt,       [c_char_p            ], Res)
+int_root_n =     load(l.test_root_n,     [c_char_p, c_longlong], Res)
 
 
 # Logical operations
 # Logical operations
-
-int_shl_digit  = load(l.test_shl_digit, [c_char_p, c_longlong], Res)
-int_shr_digit  = load(l.test_shr_digit, [c_char_p, c_longlong], Res)
-int_shl        = load(l.test_shl, [c_char_p, c_longlong], Res)
-int_shr        = load(l.test_shr, [c_char_p, c_longlong], Res)
+int_shl_digit  = load(l.test_shl_digit,  [c_char_p, c_longlong], Res)
+int_shr_digit  = load(l.test_shr_digit,  [c_char_p, c_longlong], Res)
+int_shl        = load(l.test_shl,        [c_char_p, c_longlong], Res)
+int_shr        = load(l.test_shr,        [c_char_p, c_longlong], Res)
 int_shr_signed = load(l.test_shr_signed, [c_char_p, c_longlong], Res)
 int_shr_signed = load(l.test_shr_signed, [c_char_p, c_longlong], Res)
 
 
-int_factorial  = load(l.test_factorial, [c_uint64], Res)
-int_gcd        = load(l.test_gcd, [c_char_p, c_char_p], Res)
-int_lcm        = load(l.test_lcm, [c_char_p, c_char_p], Res)
+int_factorial  = load(l.test_factorial,  [c_uint64], Res)
+int_gcd        = load(l.test_gcd,        [c_char_p, c_char_p], Res)
+int_lcm        = load(l.test_lcm,        [c_char_p, c_char_p], Res)
 
 
 def test(test_name: "", res: Res, param=[], expected_error = Error.Okay, expected_result = "", radix=16):
 def test(test_name: "", res: Res, param=[], expected_error = Error.Okay, expected_result = "", radix=16):
 	passed = True
 	passed = True
@@ -561,6 +561,13 @@ if __name__ == '__main__':
 	print("\n---- math/big tests ----")
 	print("\n---- math/big tests ----")
 	print()
 	print()
 
 
+	max_name = 0
+	for test_proc in TESTS:
+		max_name = max(max_name, len(test_proc.__name__))
+
+	fmt_string = "{name:>{max_name}}: {count_pass:7,} passes and {count_fail:7,} failures in {timing:9.3f} ms."
+	fmt_string = fmt_string.replace("{max_name}", str(max_name))
+
 	for test_proc in TESTS:
 	for test_proc in TESTS:
 		count_pass = 0
 		count_pass = 0
 		count_fail = 0
 		count_fail = 0
@@ -583,7 +590,7 @@ if __name__ == '__main__':
 				count_fail     += 1
 				count_fail     += 1
 				total_failures += 1
 				total_failures += 1
 
 
-		print("{name}: {count_pass:,} passes and {count_fail:,} failures in {timing:.3f} ms.".format(name=test_proc.__name__, count_pass=count_pass, count_fail=count_fail, timing=TIMINGS[test_proc] * 1_000))
+		print(fmt_string.format(name=test_proc.__name__, count_pass=count_pass, count_fail=count_fail, timing=TIMINGS[test_proc] * 1_000))
 
 
 	for BITS, ITERATIONS in BITS_AND_ITERATIONS:
 	for BITS, ITERATIONS in BITS_AND_ITERATIONS:
 		print()		
 		print()		
@@ -665,12 +672,12 @@ if __name__ == '__main__':
 				else:
 				else:
 					count_fail     += 1; total_failures += 1
 					count_fail     += 1; total_failures += 1
 
 
-			print("{name}: {count_pass:,} passes and {count_fail:,} failures in {timing:.3f} ms.".format(name=test_proc.__name__, count_pass=count_pass, count_fail=count_fail, timing=TIMINGS[test_proc] * 1_000))
+			print(fmt_string.format(name=test_proc.__name__, count_pass=count_pass, count_fail=count_fail, timing=TIMINGS[test_proc] * 1_000))
 
 
 	print()		
 	print()		
 	print("---- THE END ----")
 	print("---- THE END ----")
 	print()
 	print()
-	print("total: {count_pass:,} passes and {count_fail:,} failures in {timing:.3f} ms.".format(count_pass=total_passes, count_fail=total_failures, timing=TOTAL_TIME * 1_000))
+	print(fmt_string.format(name="total", count_pass=total_passes, count_fail=total_failures, timing=TOTAL_TIME * 1_000))
 
 
 	if total_failures:
 	if total_failures:
 		exit(1)
 		exit(1)

+ 1 - 1
core/math/big/tune.odin

@@ -3,7 +3,7 @@ package math_big
 
 
 /*
 /*
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
 	Copyright 2021 Jeroen van Rijn <[email protected]>.
-	Made available under Odin's BSD-2 license.
+	Made available under Odin's BSD-3 license.
 
 
 	A BigInt implementation in Odin.
 	A BigInt implementation in Odin.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.
 	For the theoretical underpinnings, see Knuth's The Art of Computer Programming, Volume 2, section 4.3.