From 7fe6996461cf4bca2e87ad058b71aac33e9b8fc1 Mon Sep 17 00:00:00 2001 From: Matthew Roughan Date: Sun, 27 May 2018 23:24:26 +0930 Subject: [PATCH] added some internal documentation, plus created an examples directory and shifted some code there --- {test => examples}/Data/dyadic_tree_3.dot | 28 ++--- examples/Data/dyadic_tree_3.dot.pdf | Bin 0 -> 16201 bytes {test => examples}/Data/dyadic_tree_3.dot.svg | 0 {test => examples}/Data/dyadic_tree_4.dot | 0 {test => examples}/Data/dyadic_tree_4.dot.pdf | Bin 19788 -> 19811 bytes {test => examples}/Data/dyadic_tree_4.dot.svg | 0 {test => examples}/dyadic_tree.jl | 2 +- {test => examples}/examples.jl | 2 +- src/SurrealFinite.jl | 108 +++++++++++++++- src/SurrealNumbers.jl | 2 +- src/todo.txt | 12 +- test/Data/dyadic_tree_3.dot.pdf | Bin 16226 -> 0 bytes test/special_case.jl | 30 ----- test/timing_2.jl | 69 +++++++++++ test/timing_3.jl | 115 ++++++++++++++++++ 15 files changed, 315 insertions(+), 53 deletions(-) rename {test => examples}/Data/dyadic_tree_3.dot (74%) create mode 100644 examples/Data/dyadic_tree_3.dot.pdf rename {test => examples}/Data/dyadic_tree_3.dot.svg (100%) rename {test => examples}/Data/dyadic_tree_4.dot (100%) rename {test => examples}/Data/dyadic_tree_4.dot.pdf (53%) rename {test => examples}/Data/dyadic_tree_4.dot.svg (100%) rename {test => examples}/dyadic_tree.jl (99%) rename {test => examples}/examples.jl (99%) delete mode 100644 test/Data/dyadic_tree_3.dot.pdf delete mode 100644 test/special_case.jl create mode 100644 test/timing_2.jl create mode 100644 test/timing_3.jl diff --git a/test/Data/dyadic_tree_3.dot b/examples/Data/dyadic_tree_3.dot similarity index 74% rename from test/Data/dyadic_tree_3.dot rename to examples/Data/dyadic_tree_3.dot index e59d77e..8b9192e 100644 --- a/test/Data/dyadic_tree_3.dot +++ b/examples/Data/dyadic_tree_3.dot @@ -10,14 +10,14 @@ node_day_1 [shape=none, pos="7.875,1!", label="Day 1", fontsize=18] node_1 [shape=none,margin=0,label= < - +
-1
ϕ  
0
ϕ  
0
>,pos="-2.25,1!" ]; node_1:R -> node_0; node_2 [shape=none,margin=0,label= < - +
1
 
0
ϕ
 
0
ϕ
>,pos="2.25,1!" ]; node_2:L -> node_0; @@ -25,21 +25,21 @@ node_day_2 [shape=none, pos="7.875,2!", label="Day 2", fontsize=18] node_3 [shape=none,margin=0,label= < - +
-2
ϕ  
-1
ϕ  
-1
>,pos="-4.5,2!" ]; node_3:R -> node_1; node_4 [shape=none,margin=0,label= < - +
2
 
1
ϕ
 
1
ϕ
>,pos="4.5,2!" ]; node_4:L -> node_2; node_5 [shape=none,margin=0,label= < - +
1/2
 
0
 
1
 
0
 
1
>,pos="1.125,2!" ]; node_5:L -> node_0; @@ -47,7 +47,7 @@ node_day_2 [shape=none, pos="7.875,2!", label="Day 2", fontsize=18] node_6 [shape=none,margin=0,label= < - +
-1/2
 
-1
 
0
 
-1
 
0
>,pos="-1.125,2!" ]; node_6:L -> node_1; @@ -56,21 +56,21 @@ node_day_3 [shape=none, pos="7.875,3!", label="Day 3", fontsize=18] node_7 [shape=none,margin=0,label= < - +
-3
ϕ  
-2
ϕ  
-2
>,pos="-6.75,3!" ]; node_7:R -> node_3; node_8 [shape=none,margin=0,label= < - +
3
 
2
ϕ
 
2
ϕ
>,pos="6.75,3!" ]; node_8:L -> node_4; node_9 [shape=none,margin=0,label= < - +
1/4
 
0
 
1/2
 
0
 
1/2
>,pos="0.5625,3!" ]; node_9:L -> node_0; @@ -78,7 +78,7 @@ node_day_3 [shape=none, pos="7.875,3!", label="Day 3", fontsize=18] node_10 [shape=none,margin=0,label= < - +
-1/4
 
-1/2
 
0
 
-1/2
 
0
>,pos="-0.5625,3!" ]; node_10:L -> node_6; @@ -86,7 +86,7 @@ node_day_3 [shape=none, pos="7.875,3!", label="Day 3", fontsize=18] node_11 [shape=none,margin=0,label= < - +
3/4
 
1/2
 
1
 
1/2
 
1
>,pos="1.6875,3!" ]; node_11:L -> node_5; @@ -94,7 +94,7 @@ node_day_3 [shape=none, pos="7.875,3!", label="Day 3", fontsize=18] node_12 [shape=none,margin=0,label= < - +
-3/4
 
-1
 
-1/2
 
-1
 
-1/2
>,pos="-1.6875,3!" ]; node_12:L -> node_1; @@ -102,7 +102,7 @@ node_day_3 [shape=none, pos="7.875,3!", label="Day 3", fontsize=18] node_13 [shape=none,margin=0,label= < - +
3/2
 
1
 
2
 
1
 
2
>,pos="3.375,3!" ]; node_13:L -> node_2; @@ -110,7 +110,7 @@ node_day_3 [shape=none, pos="7.875,3!", label="Day 3", fontsize=18] node_14 [shape=none,margin=0,label= < - +
-3/2
 
-2
 
-1
 
-2
 
-1
>,pos="-3.375,3!" ]; node_14:L -> node_3; diff --git a/examples/Data/dyadic_tree_3.dot.pdf b/examples/Data/dyadic_tree_3.dot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..596ee547530b8bf5dac505890d8d7be35880e290 GIT binary patch literal 16201 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 literal 0 HcmV?d00001 diff --git a/test/Data/dyadic_tree_3.dot.svg b/examples/Data/dyadic_tree_3.dot.svg similarity index 100% rename from test/Data/dyadic_tree_3.dot.svg rename to examples/Data/dyadic_tree_3.dot.svg diff --git a/test/Data/dyadic_tree_4.dot b/examples/Data/dyadic_tree_4.dot similarity index 100% rename from test/Data/dyadic_tree_4.dot rename to examples/Data/dyadic_tree_4.dot diff --git a/test/Data/dyadic_tree_4.dot.pdf b/examples/Data/dyadic_tree_4.dot.pdf similarity index 53% rename from test/Data/dyadic_tree_4.dot.pdf rename to examples/Data/dyadic_tree_4.dot.pdf index 62ff774f64831f0ae74f9f33eeb24c595971f2da..8632bdd13be0122e48f27951b4abe73a25053954 100644 GIT binary patch delta 8945 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 delta 8893 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 expand( convert(SurrealFinite, 2)) +"2" +julia> expand( convert(SurrealFinite, 2); level=1) +"{ 1 | ϕ }" +julia> expand( convert(SurrealFinite, 2); level=2) +"{ { { ϕ | ϕ } | ϕ } | ϕ }" +``` +""" function expand(x::SurrealFinite; level=0) if level==0 s = x.shorthand != "" ? x.shorthand : expand(x; level=1) @@ -396,6 +418,31 @@ end # special "canonicalised" output spf(x::SurrealFinite) = print("{ ", canonicalise.(x.L), " | ", canonicalise.(x.R), " }") +""" + surreal2dag(x::SurrealFinite) + surreal2dag(io::IO, x::SurrealFinite) + + Writes a surreal representation as a DAG out in DOT format for drawing using GraphVis, + and returns the number of nodes in the graph. + +## Arguments +* `io::IO`: output stream, default is STDOUT +* `x::SurrealFinite`: the number to write out + +## Examples +```jldoctest +julia> surreal2dag(convert(SurrealFinite, 0)) +digraph "0.0" { + node_1 [shape=none,margin=0,label= + < + + +
0
ϕ ϕ
>, + ]; +} +1 +``` +""" function surreal2dag(io::IO, x::SurrealFinite) println(io, "digraph \"", float(x), "\" {") k = 1 @@ -442,6 +489,33 @@ end surreal2dag(x::SurrealFinite) = surreal2dag(STDOUT, x) +""" + surreal2dot(x::SurrealFinite) + surreal2dot(io::IO, x::SurrealFinite) + + Writes a surreal representation as a tree out in DOT format for drawing using GraphVis, + and returns the number of nodes in the graph. + +## Arguments +* `io::IO`: output stream, default is STDOUT +* `x::SurrealFinite`: the number to write out + +## Examples +```jldoctest +julia> surreal2dot(convert(SurrealFinite, 1)) +digraph "1.0" { + node_1 [shape=none,margin=0,label= + < + + +
1
 
0
ϕ
>, + ]; + node_1:"0,1" -> node_2; + node_2 [shape=none,margin=0,label=<0>] +} +2 +``` +""" function surreal2dot(io::IO, x::SurrealFinite) println(io, "digraph \"", float(x), "\" {") k = 1 @@ -525,7 +599,20 @@ surreal2dot(x::SurrealFinite) = surreal2dot(STDOUT, x) ####################################################### -# generation or birth day calculation +""" + generation(x::SurrealFinite) + + Finds the birthday of a surreal number, which is 1 + the max of any of its components. + +## Arguments +* `x::SurrealFinite`: the number to operate on + +## Examples +```jldoctest +julia> generation( convert(SurrealFinite, 1) ) +1 +``` +""" function generation(x::SurrealFinite) if x==zero(x) return 0 @@ -536,6 +623,22 @@ function generation(x::SurrealFinite) end # this is a bit of a cheat, but I'm not smart enough to work out how to do it otherwise +""" + canonicalise(s::SurrealFinite) + + Convert a surreal number form into its equivalent canonical form. + +## Arguments +* `x::SurrealFinite`: the number to operate on + +## Examples +```jldoctest +julia> convert(SurrealFinite, 1) - convert(SurrealFinite, 1) +{ { ϕ | { ϕ | ϕ } } | { { ϕ | ϕ } | ϕ } } +julia> pf( canonicalise( convert(SurrealFinite, 1) - convert(SurrealFinite, 1) ) ) +{ ϕ | ϕ } +``` +""" canonicalise(s::SurrealFinite) = convert(SurrealFinite, convert(Rational, s)) iscanonical(s::SurrealFinite) = canonicalise(s) == s @@ -553,7 +656,6 @@ end ###### standard math routines ############################## - sign(x::SurrealFinite) = xzero(x) ? one(x) : zero(x) # abs(x::SurrealFinite) = xRz9xPZ0E%=2c$XfpAwm=wMbyA=M^D(_ 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 a = [1 2; 3 4] -2×2 Array{Int64,2}: - 1 2 - 3 4 -``` -""" -function special_case(input) - - - -end - diff --git a/test/timing_2.jl b/test/timing_2.jl new file mode 100644 index 0000000..e60ff81 --- /dev/null +++ b/test/timing_2.jl @@ -0,0 +1,69 @@ +# compare the time taken to do simple subtractions compared to < +# with a view to making some routiens that use subtraction a lot faster +using IndexedTables +using SurrealNumbers +convert(SurrealFinite, 2) * convert(SurrealFinite, 1) + +#ns = 6:-1:0 +ns = 0:6 +n = length(ns) +m = 100 * ones(size(ns)) +x1 = Array{SurrealFinite,1}(n) +x2 = Array{Bool,1}(n) +t1 = Array{Float64,1}(n) +t2 = Array{Float64,1}(n) +bytes2 = Array{Float64,1}(n) +bytes1 = Array{Float64,1}(n) +gctime1 = Array{Float64,1}(n) +gctime2 = Array{Float64,1}(n) +s = convert(SurrealFinite, 1) +s > 0 +s - 1 +for i=1:n + println(" working on ", ns[i]) + t1[i] = 0 + t2[i] = 0 + b1 = 0 + g1 = 0 + mem1 = 0 + val1 = 0 + b2 = 0 + g2 = 0 + mem2 = 0 + val2 = false + for j=1:m[i] + s = convert(SurrealFinite, ns[i]) + # val, time, b, g, mem = @timed convert(Rational, s) + val1, time1, b1, g1, mem1 = @timed s - 1 + val2, time2, b2, g2, mem2 = @timed s > 1 + t1[i] += time1 + t2[i] += time2 + end + x1[i] = val1 + bytes1[i] = b1 + gctime1[i] = g1 + x2[i] = val2 + bytes2[i] = b2 + gctime2[i] = g2 +end +# s = size.(x) +# d = depth_av.(x) +# f = n_zeros.(x) +t1 = t1./m[1:n] +bytes1 = bytes1./m[1:n] +t2 = t2./m[1:n] +bytes2 = bytes2./m[1:n] + +t1_p_ms = 1.0e6 * t1 +t2_p_ms = 1.0e6 * t2 + +tab1 = table(@NT( i=0:n-1, + time1=t1_p_ms, + time2=t2_p_ms, + bytes1=bytes1, + bytes2=bytes2); + pkey = [:i]) + + + + diff --git a/test/timing_3.jl b/test/timing_3.jl new file mode 100644 index 0000000..a6d3fd2 --- /dev/null +++ b/test/timing_3.jl @@ -0,0 +1,115 @@ +# compare the time taken to do simple subtractions compared to = one(s) + return floor(s - one(s)) + one(s) + end +end + +function isinteger2(s::SurrealFinite) + if s ≅ zero(s) + return true + elseif s <= -one(s) + return isinteger(s + one(s)) + elseif s >= one(s) + return isinteger(s - one(s)) + else + return false + end +end + + +# not the more general form of rounding defined in Julia -- should fix +function round2(s::SurrealFinite) + if s ≅ zero(s) + return s + elseif s <= -one(s) + return round(s + one(s)) - one(s) + elseif s >= one(s) + return round(s - one(s)) + one(s) + elseif s >= convert(SurrealFinite, 1//2) + return one(s) + elseif s >= convert(SurrealFinite, -1//2) + return zero(s) + else + return -one(s) + end +end + + + +convert(SurrealFinite, 2) * convert(SurrealFinite, 1) + +#ns = 6:-1:0 +ns = 0:4 +n = length(ns) +m = 100 * ones(size(ns)) +x1 = Array{SurrealFinite,1}(n) +x2 = Array{SurrealFinite,1}(n) +t1 = Array{Float64,1}(n) +t2 = Array{Float64,1}(n) +bytes2 = Array{Float64,1}(n) +bytes1 = Array{Float64,1}(n) +gctime1 = Array{Float64,1}(n) +gctime2 = Array{Float64,1}(n) +s = convert(SurrealFinite, 1) +floor(s) +floor2(s) +for i=1:n + println(" working on ", ns[i]) + t1[i] = 0 + t2[i] = 0 + b1 = 0 + g1 = 0 + mem1 = 0 + val1 = 0 + b2 = 0 + g2 = 0 + mem2 = 0 + val2 = 0 + for j=1:m[i] + s = convert(SurrealFinite, ns[i] + 0.5) + # val, time, b, g, mem = @timed convert(Rational, s) + val1, time1, b1, g1, mem1 = @timed floor( s ) + val2, time2, b2, g2, mem2 = @timed floor2( s ) + t1[i] += time1 + t2[i] += time2 + end + x1[i] = val1 + bytes1[i] = b1 + gctime1[i] = g1 + x2[i] = val2 + bytes2[i] = b2 + gctime2[i] = g2 +end +# s = size.(x) +# d = depth_av.(x) +# f = n_zeros.(x) +t1 = t1./m[1:n] +bytes1 = bytes1./m[1:n] +t2 = t2./m[1:n] +bytes2 = bytes2./m[1:n] + +t1_p_ms = 1.0e6 * t1 +t2_p_ms = 1.0e6 * t2 + +tab1 = table(@NT( i=0:n-1, + time1=t1_p_ms, + time2=t2_p_ms, + bytes1=bytes1, + bytes2=bytes2); + pkey = [:i]) + + + +