From b8513490e0bef86692b0af975b2088eed4e51f4c Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Mon, 22 Jan 2024 15:47:36 -0600 Subject: [PATCH 01/35] visuals basics working --- experiments/scout_visuals.jl | 210 +++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 experiments/scout_visuals.jl diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl new file mode 100644 index 0000000..7bf4dd1 --- /dev/null +++ b/experiments/scout_visuals.jl @@ -0,0 +1,210 @@ +module scout_visuals + +using GamesVoI +using GLMakie +include("tower_defense.jl") + +Makie.inline!(false) + +# export demo + +# function demo() + +# Game parameters +attacker_preference = [.1; .2; .7] + +# Axis parameters + # borders + ax_aspect = 1 + ax_limits = (0, 1, 0, 1) + # title + ax_titlegap = 48 + ax_titlesize = 60 + # x-axis + ax_xautolimitmargin = (0, 0) + ax_xgridwidth = 2 + ax_xticklabelsize = 36 + ax_xticks = -10:10 + ax_xticksize = 18 + # y-axis + ax_yautolimitmargin = (0, 0) + ax_ygridwidth = 2 + ax_yticklabelpad = 14 + ax_yticklabelsize = 36 + ax_yticks = -10:10 + ax_yticksize = 18 + + + +# ## Observables +# # Observables are a way to create a reactive programming environment in Julia. +# # Listener is an Observable that is dependent on another Observable +# x = Observable(1.0) # no listeners +# y = Observable(2.0) # no listensers +# z = @lift($x .+ $y) # set up listener using the lift macro + +# x[] = 2.0 # change x using empty brackets +# println(z) # updates automatically + +# # ObserverFunction. on(...) adds function f as a listener to observable +# w = on(x) do val +# println("x changed to $val") +# end + +# # Simple Example (REPL에서 Makie.inline!(false) 해주기) +# ox = 1:4 +# oy = Observable(rand(4)) # Y-values are Observables +# lw = Observable(2.0) # line width is an Observable + +# fig = Figure() +# ax = Axis(fig[1,1]) +# lines!(ox, oy, linewidth = lw) # plot initial values +# ylims!(ax, 0, 1) # set y limits + +# lw[] = 50.0 # change line width +# oy[] = rand(4) # change y values + + +## 1. Sliders +# initialize plot +fig = Figure(;size = (3840, 2160)) +# add axis + +ax_north = Axis(fig[1,2], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "North", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +) +ax_east = Axis(fig[2,1], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "East", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +) +ax_west = Axis(fig[2,3], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "West", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +) + + +# darken axes + +# vlines!(ax1, [0], linewidth = 2, color = :black) +# hlines!(ax1, [0], linewidth = 2, color = :black) + +# Create sliders +sg = SliderGrid( + fig[3, 2], + (label = "prior_north", range = 0:0.01:1, format = "{:.2f}", startvalue = 01), + (label = "prior_east", range = 0:0.01:1, format = "{:.2f}", startvalue = 0), + (label = "prior_west", range = 0:0.01:1, format = "{:.2f}", startvalue = 0) +) + +# Create listener +prior_north_listener = sg.sliders[1].value +prior_east_listener = sg.sliders[2].value +prior_west_listener = sg.sliders[3].value + +# print("{$prior_north_listener}, {$prior_east_listener}, {$prior_west_listener}\n") + +x = -10:0.01:10 +# r = @lift(solve_r([$prior_north_listener; $prior_east_listener; $prior_west_listener], attacker_preference)) + +#temporary +r = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) +# print(r) +scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) + +# Plot line +# line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) + +## Another way ## +# sliderob = [s.value for s in sg.sliders] + +# y = lift(sliderob...) do slope, intercept +# slope .* x .+ intercept +# end +# y = lift((slope, intercept) -> slope .* x .+ intercept, sliderob...) # also same + +# Plot line +# line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) + +# # 2. Button +# fig[3,1] = buttongrid = GridLayout(tellwidth = false) +# buttonlabels = ["Red", "Green", "Blue"] + +# buttons = buttongrid[1, 1:3] = [ +# Button(fig, label = l, height = 60, width = 250, fontsize = 30) for l in buttonlabels] + +# bt_sublayout = GridLayout(height = 150) +# fig[3,1] = bt_sublayout + +# # Random dataset we want to see + +# x = -10:0.01:10 +# data = [] + +# for i in 1:3 +# d = rand(-10:0.01:10, length(x)) +# push!(data, d) +# end + +# # Set y_data as observable +# y = Observable(data[1]) + +# # Set color as observable +# colors = [:red, :green, :blue] +# c = Observable(colors[1]) + +# # Set markersize as observable +# markersizes = [8, 12, 16] +# ms = Observable(markersizes[1]) + +# # Add scatter plot +# scat1 = scatter!(ax1, x, y, markersize = ms, color = c) + +# # Button instructions using on...do...end syntax + +# for i in 1:3 +# on(buttons[i].clicks) do _ +# y[] = data[i] +# c[] = colors[i] +# ms[] = markersizes[i] +# end +# end +display(fig) + +#demo function end +# end +#module end +end \ No newline at end of file From e04b0cbc5f07fcaf0ace0425f8f9a1c645cd9ea8 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:09:52 -0600 Subject: [PATCH 02/35] added function demo() --- Manifest.toml | 625 +++++++++++++++++++++++++++++++++-- Project.toml | 1 + experiments/scout_visuals.jl | 333 ++++++++----------- 3 files changed, 742 insertions(+), 217 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index 1459c4f..8ee8033 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.9.2" +julia_version = "1.10.0" manifest_format = "2.0" -project_hash = "a5f1841910efd0ebd18598d9ea6d4792e2798173" +project_hash = "93c6ae1b7d34c53294667f6503bd776af5cbcc76" [[deps.ADTypes]] git-tree-sha1 = "f5c25e8a5b29b5e941b7408bc8cc79fea4d9ef9a" @@ -26,6 +26,11 @@ weakdeps = ["ChainRulesCore", "Test"] AbstractFFTsChainRulesCoreExt = "ChainRulesCore" AbstractFFTsTestExt = "Test" +[[deps.AbstractLattices]] +git-tree-sha1 = "222ee9e50b98f51b5d78feb93dd928880df35f06" +uuid = "398f06c4-4d28-53ec-89ca-5b2656b7603d" +version = "0.3.0" + [[deps.AbstractTrees]] git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" @@ -41,6 +46,12 @@ weakdeps = ["StaticArrays"] [deps.Adapt.extensions] AdaptStaticArraysExt = "StaticArrays" +[[deps.Animations]] +deps = ["Colors"] +git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" +uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" +version = "0.4.1" + [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" version = "1.1.1" @@ -82,6 +93,24 @@ git-tree-sha1 = "b25e88db7944f98789130d7b503276bc34bc098e" uuid = "bf4720bc-e11a-5d0c-854e-bdca1663c893" version = "0.1.0" +[[deps.Automa]] +deps = ["PrecompileTools", "TranscodingStreams"] +git-tree-sha1 = "588e0d680ad1d7201d4c6a804dcb1cd9cba79fbb" +uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" +version = "1.0.3" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.1.0" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -124,6 +153,21 @@ git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" version = "0.4.2" +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" + +[[deps.CRlibm]] +deps = ["CRlibm_jll"] +git-tree-sha1 = "32abd86e3c2025db5172aa182b982debed519834" +uuid = "96374032-68de-5a5b-8d9e-752f78720389" +version = "1.0.1" + +[[deps.CRlibm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" +version = "1.0.1+0" + [[deps.CSV]] deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] git-tree-sha1 = "44dbf560808d49041989b8a96cae4cffbeb7966a" @@ -166,6 +210,12 @@ git-tree-sha1 = "02aa26a4cf76381be7f66e020a3eddeb27b0a092" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" version = "0.7.2" +[[deps.ColorBrewer]] +deps = ["Colors", "JSON", "Test"] +git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" +uuid = "a2cac450-b92f-5266-8821-25eda20663c8" +version = "0.4.0" + [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" @@ -223,7 +273,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+0" +version = "1.0.5+1" [[deps.CompositeTypes]] git-tree-sha1 = "02d2316b7ffceff992f3096ae48c7829a8aa0638" @@ -295,6 +345,12 @@ version = "1.0.0" deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +[[deps.DelaunayTriangulation]] +deps = ["DataStructures", "EnumX", "ExactPredicates", "Random", "SimpleGraphs"] +git-tree-sha1 = "26eb8e2331b55735c3d305d949aabd7363f07ba7" +uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" +version = "0.8.11" + [[deps.DelimitedFiles]] deps = ["Mmap"] git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" @@ -360,6 +416,12 @@ git-tree-sha1 = "9b05a8bc04d7a9a9c7e9ee3b0fdf1584857b65dc" uuid = "7c1d4256-1411-5781-91ec-d7bc3513ac07" version = "0.5.2" +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + [[deps.EnumX]] git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" @@ -371,6 +433,17 @@ git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" version = "0.0.20230411+0" +[[deps.ErrorfreeArithmetic]] +git-tree-sha1 = "d6863c556f1142a061532e79f611aa46be201686" +uuid = "90fa49ef-747e-5e6f-a989-263ba693cf1a" +version = "0.5.2" + +[[deps.ExactPredicates]] +deps = ["IntervalArithmetic", "Random", "StaticArraysCore"] +git-tree-sha1 = "499b1ca78f6180c8f8bdf1cabde2d39120229e5c" +uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" +version = "2.2.6" + [[deps.ExceptionUnwrapping]] deps = ["Test"] git-tree-sha1 = "e90caa41f5a86296e014e148ee061bd6c3edec96" @@ -388,6 +461,11 @@ git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" version = "0.1.10" +[[deps.Extents]] +git-tree-sha1 = "2140cd04483da90b2da7f99b2add0750504fc39c" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.2" + [[deps.FFMPEG]] deps = ["FFMPEG_jll"] git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" @@ -400,6 +478,36 @@ git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" version = "4.4.4+1" +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.8.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FastRounding]] +deps = ["ErrorfreeArithmetic", "LinearAlgebra"] +git-tree-sha1 = "6344aa18f654196be82e62816935225b3b9abe44" +uuid = "fa42c844-2597-5d31-933b-ebd51ab2693f" +version = "0.3.1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "c5c28c245101bd59154f649e19b038d15901b5dc" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.2" + +[[deps.FilePaths]] +deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] +git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" +version = "0.8.3" + [[deps.FilePathsBase]] deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa" @@ -415,6 +523,22 @@ git-tree-sha1 = "f372472e8672b1d993e93dada09e23139b509f9e" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" version = "1.5.0" +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "73d1214fec245096717847c62d389a5d2ac86504" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.22.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + [[deps.FixedPointNumbers]] deps = ["Statistics"] git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" @@ -443,12 +567,24 @@ weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] ForwardDiffStaticArraysExt = "StaticArrays" +[[deps.FreeType]] +deps = ["CEnum", "FreeType2_jll"] +git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" +version = "4.1.1" + [[deps.FreeType2_jll]] deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" version = "2.13.1+0" +[[deps.FreeTypeAbstraction]] +deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] +git-tree-sha1 = "055626e1a35f6771fe99060e835b72ca61a52621" +uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" +version = "0.10.1" + [[deps.FriBidi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" @@ -476,12 +612,24 @@ version = "0.5.0" deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +[[deps.GLFW]] +deps = ["GLFW_jll"] +git-tree-sha1 = "35dbc482f0967d8dceaa7ce007d16f9064072166" +uuid = "f7f18e0c-5ee9-5ccd-a5bf-e8befd85ed98" +version = "3.4.1" + [[deps.GLFW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" version = "3.3.9+0" +[[deps.GLMakie]] +deps = ["ColorTypes", "Colors", "FileIO", "FixedPointNumbers", "FreeTypeAbstraction", "GLFW", "GeometryBasics", "LinearAlgebra", "Makie", "Markdown", "MeshIO", "ModernGL", "Observables", "PrecompileTools", "Printf", "ShaderAbstractions", "StaticArrays"] +git-tree-sha1 = "e53267e2fc64f81b939849ca7bd70d8f879b5293" +uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" +version = "0.9.5" + [[deps.GPUArrays]] deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] git-tree-sha1 = "8ad8f375ae365aa1eb2f42e2565a40b55a4b69a8" @@ -506,6 +654,18 @@ git-tree-sha1 = "025d171a2847f616becc0f84c8dc62fe18f0f6dd" uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" version = "0.72.10+0" +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "d4f85701f569584f2cff7ba67a137d03f0cfb7d0" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.3.3" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "424a5a6ce7c5d97cca7bcc4eac551b97294c54af" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.9" + [[deps.Gettext_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" @@ -524,6 +684,12 @@ git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" version = "1.3.14+0" +[[deps.GridLayoutBase]] +deps = ["GeometryBasics", "InteractiveUtils", "Observables"] +git-tree-sha1 = "af13a277efd8a6e716d79ef635d5342ccb75be61" +uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" +version = "0.10.0" + [[deps.Grisu]] git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" @@ -582,6 +748,52 @@ git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "fc5d1d3443a124fde6e92d0260cd9e064eba69f8" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.1" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.7" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.7+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.4" + [[deps.InlineStrings]] deps = ["Parsers"] git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461" @@ -593,10 +805,32 @@ git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" version = "0.1.2" +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5fdf2fe6724d8caabf43b557b84ce53f3b7e2f6b" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2024.0.2+0" + [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.15.1" +weakdeps = ["Unitful"] + + [deps.Interpolations.extensions] + InterpolationsUnitfulExt = "Unitful" + +[[deps.IntervalArithmetic]] +deps = ["CRlibm", "EnumX", "FastRounding", "LinearAlgebra", "Markdown", "Random", "RecipesBase", "RoundingEmulator", "SetRounding", "StaticArrays"] +git-tree-sha1 = "f59e639916283c1d2e106d2b00910b50f4dab76c" +uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +version = "0.21.2" + [[deps.IntervalSets]] deps = ["Dates", "Random"] git-tree-sha1 = "8e59ea773deee525c99a8018409f64f19fb719e6" @@ -617,6 +851,17 @@ git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" version = "0.2.2" +[[deps.Isoband]] +deps = ["isoband_jll"] +git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" +version = "0.1.1" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + [[deps.IteratorInterfaceExtensions]] git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" uuid = "82899510-4779-5014-852e-03e436cf321d" @@ -646,6 +891,12 @@ git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" version = "0.21.4" +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.5" + [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "60b1194df0a3298f460063de985eae7b01bc011a" @@ -658,6 +909,12 @@ git-tree-sha1 = "43032da5832754f58d14a91ffbe86d5f176acda9" uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963" version = "0.2.1+0" +[[deps.KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "fee018a29b60733876eb557804b5b109dd3dd8a7" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.8" + [[deps.LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" @@ -734,24 +991,34 @@ version = "0.15.1" deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.3" +version = "0.6.4" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "7.84.0+0" +version = "8.4.0+0" [[deps.LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + [[deps.LibSSH2_jll]] deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.10.2+0" +version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" @@ -804,10 +1071,28 @@ git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" version = "2.36.0+0" +[[deps.LightXML]] +deps = ["Libdl", "XML2_jll"] +git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" +uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" +version = "0.9.1" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.2.0" + [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +[[deps.LinearAlgebraX]] +deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] +git-tree-sha1 = "d76cec8007ec123c2b681269d40f94b053473fcf" +uuid = "9b3f67b0-2d00-526e-9884-9e4938f8fb88" +version = "0.2.7" + [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] git-tree-sha1 = "c3ce8e7420b3a6e071e0fe4745f5d4300e37b13f" @@ -833,12 +1118,35 @@ git-tree-sha1 = "cedb76b37bc5a6c702ade66be44f831fa23c681e" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" version = "1.0.0" +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "72dc3cf284559eb8f53aa593fe62cb33f83ed0c0" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2024.0.0+0" + [[deps.MacroTools]] deps = ["Markdown", "Random"] git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.10" +[[deps.Makie]] +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "Setfield", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "StableHashTraits", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun"] +git-tree-sha1 = "a37c6610dd20425b131caf65d52abdf859da5ab1" +uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +version = "0.20.4" + +[[deps.MakieCore]] +deps = ["Observables", "REPL"] +git-tree-sha1 = "ec5db7bb2dc9b85072658dcb2d3ad09569b09ac9" +uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" +version = "0.7.2" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + [[deps.Markdown]] deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" @@ -849,6 +1157,12 @@ git-tree-sha1 = "5c5cd501ae1d76d3ccd7c7e6b4325a15dde7f31c" uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" version = "1.18.0" +[[deps.MathTeXEngine]] +deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] +git-tree-sha1 = "96ca8a313eb6437db5ffe946c457a401bbb8ce1d" +uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" +version = "0.5.7" + [[deps.MbedTLS]] deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" @@ -858,13 +1172,19 @@ version = "1.1.7" [[deps.MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+0" +version = "2.28.2+1" [[deps.Measures]] git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" version = "0.3.2" +[[deps.MeshIO]] +deps = ["ColorTypes", "FileIO", "GeometryBasics", "Printf"] +git-tree-sha1 = "8be09d84a2d597c7c0c34d7d604c039c9763e48c" +uuid = "7269a6da-0436-5bbc-96c2-40638cbb6118" +version = "0.4.10" + [[deps.Missings]] deps = ["DataAPI"] git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" @@ -874,9 +1194,31 @@ version = "1.1.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" +[[deps.ModernGL]] +deps = ["Libdl"] +git-tree-sha1 = "b76ea40b5c0f45790ae09492712dd326208c28b2" +uuid = "66fc600b-dfda-50eb-8b99-91cfa97b1301" +version = "1.1.7" + +[[deps.Mods]] +git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" +uuid = "7475f97c-0381-53b1-977b-4c60186c8d62" +version = "2.2.4" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2022.10.11" +version = "2023.1.10" + +[[deps.Multisets]] +git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" +uuid = "3b2b4ff1-bcff-5658-a3ee-dbcf1ce5ac09" +version = "0.4.4" [[deps.MultivariatePolynomials]] deps = ["ChainRulesCore", "DataStructures", "LinearAlgebra", "MutableArithmetics"] @@ -902,12 +1244,24 @@ git-tree-sha1 = "0bdaa479939d2a1f85e2f93e38fbccfcb73175a5" uuid = "a975b10e-0019-58db-a62f-e48ff68538c9" version = "1.0.1" +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.3" + [[deps.NaNMath]] deps = ["OpenLibm_jll"] git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" version = "1.0.2" +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" @@ -917,6 +1271,15 @@ git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" uuid = "510215fc-4207-5dde-b226-833fc4488ee2" version = "0.5.5" +[[deps.OffsetArrays]] +git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.13.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + [[deps.Ogg_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" @@ -926,12 +1289,24 @@ version = "1.3.5+1" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.21+4" +version = "0.3.23+2" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.4+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+0" +version = "0.8.1+2" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] @@ -951,6 +1326,12 @@ git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.5+0" +[[deps.Optim]] +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "01f85d9269b13fedc61e63cc72ee2213565f7a72" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.8" + [[deps.Opus_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" @@ -971,7 +1352,7 @@ version = "1.5.0" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+0" +version = "10.42.0+1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -979,6 +1360,24 @@ git-tree-sha1 = "67eae2738d63117a196f497d7db789821bce61d1" uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" version = "0.11.17" +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.3" + +[[deps.Packing]] +deps = ["GeometryBasics"] +git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501" +uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" +version = "0.5.0" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + [[deps.Parameters]] deps = ["OrderedCollections", "UnPack"] git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" @@ -997,12 +1396,24 @@ git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" version = "2.7.2" +[[deps.Permutations]] +deps = ["Combinatorics", "LinearAlgebra", "Random"] +git-tree-sha1 = "eb3f9df2457819bf0a9019bd93cc451697a0751e" +uuid = "2ae35dd2-176d-5d53-8349-f30d82d94d4f" +version = "0.4.20" + [[deps.Pidfile]] deps = ["FileWatching", "Test"] git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03" uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307" version = "1.3.0" +[[deps.PikaParser]] +deps = ["DocStringExtensions"] +git-tree-sha1 = "d6ff87de27ff3082131f31a714d25ab6d0a88abf" +uuid = "3bbf5609-3e7b-44cd-8549-7c69f321e792" +version = "0.6.1" + [[deps.Pipe]] git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" @@ -1017,7 +1428,13 @@ version = "0.42.2+0" [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.9.2" +version = "1.10.0" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" [[deps.PlotThemes]] deps = ["PlotUtils", "Statistics"] @@ -1063,12 +1480,36 @@ version = "1.39.0" ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" +[[deps.PolygonOps]] +git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +uuid = "647866c9-e3ac-4575-94e7-e3d426903924" +version = "0.1.2" + +[[deps.Polynomials]] +deps = ["LinearAlgebra", "RecipesBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "a9c7a523d5ed375be3983db190f6a5874ae9286d" +uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" +version = "4.0.6" +weakdeps = ["ChainRulesCore", "FFTW", "MakieCore", "MutableArithmetics"] + + [deps.Polynomials.extensions] + PolynomialsChainRulesCoreExt = "ChainRulesCore" + PolynomialsFFTWExt = "FFTW" + PolynomialsMakieCoreExt = "MakieCore" + PolynomialsMutableArithmeticsExt = "MutableArithmetics" + [[deps.PooledArrays]] deps = ["DataAPI", "Future"] git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" version = "1.4.3" +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + [[deps.PreallocationTools]] deps = ["Adapt", "ArrayInterface", "ForwardDiff", "Requires"] git-tree-sha1 = "f739b1b3cc7b9949af3b35089931f2b58c289163" @@ -1113,6 +1554,12 @@ uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" deps = ["Printf"] uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "00099623ffee15972c16111bcf84c58a0051257c" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.9.0" + [[deps.PyCall]] deps = ["Conda", "Dates", "Libdl", "LinearAlgebra", "MacroTools", "Serialization", "VersionParsing"] git-tree-sha1 = "9816a3826b0ebf49ab4926e2b18842ad8b5c8f04" @@ -1125,6 +1572,12 @@ git-tree-sha1 = "9220a9dae0369f431168d60adab635f88aca7857" uuid = "d330b81b-6aea-500a-939a-2ce795aea3ee" version = "2.11.2" +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + [[deps.Qt6Base_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" @@ -1142,7 +1595,7 @@ deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.Random]] -deps = ["SHA", "Serialization"] +deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [[deps.RandomExtensions]] @@ -1151,6 +1604,21 @@ git-tree-sha1 = "062986376ce6d394b23d5d90f01d81426113a3c9" uuid = "fb686558-2515-59ef-acaa-46db3789a887" version = "0.4.3" +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + [[deps.RealDot]] deps = ["LinearAlgebra"] git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" @@ -1202,6 +1670,12 @@ git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.0" +[[deps.RingLists]] +deps = ["Random"] +git-tree-sha1 = "f39da63aa6d2d88e0c1bd20ed6a3ff9ea7171ada" +uuid = "286e9d63-9694-5540-9e3c-4e6708fa07b2" +version = "0.2.8" + [[deps.Rmath]] deps = ["Random", "Rmath_jll"] git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" @@ -1214,6 +1688,11 @@ git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" version = "0.4.0+0" +[[deps.RoundingEmulator]] +git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" +version = "0.2.1" + [[deps.RuntimeGeneratedFunctions]] deps = ["ExprTools", "SHA", "Serialization"] git-tree-sha1 = "237edc1563bbf078629b4f8d194bd334e97907cf" @@ -1257,23 +1736,80 @@ version = "1.4.1" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +[[deps.SetRounding]] +git-tree-sha1 = "d7a25e439d07a17b7cdf97eecee504c50fedf5f6" +uuid = "3cc68bcd-71a2-5612-b932-767ffbe40ab0" +version = "0.2.1" + [[deps.Setfield]] deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" version = "1.1.1" +[[deps.ShaderAbstractions]] +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "db0219befe4507878b1a90e07820fed3e62c289d" +uuid = "65257c39-d410-5151-9873-9b3e5be5013e" +version = "0.4.0" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + [[deps.Showoff]] deps = ["Dates", "Grisu"] git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" version = "1.0.3" +[[deps.SignedDistanceFields]] +deps = ["Random", "Statistics", "Test"] +git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" +version = "0.4.0" + [[deps.SimpleBufferStream]] git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" version = "1.1.0" +[[deps.SimpleGraphs]] +deps = ["AbstractLattices", "Combinatorics", "DataStructures", "IterTools", "LightXML", "LinearAlgebra", "LinearAlgebraX", "Optim", "Primes", "Random", "RingLists", "SimplePartitions", "SimplePolynomials", "SimpleRandom", "SparseArrays", "Statistics"] +git-tree-sha1 = "f65caa24a622f985cc341de81d3f9744435d0d0f" +uuid = "55797a34-41de-5266-9ec1-32ac4eb504d3" +version = "0.8.6" + +[[deps.SimplePartitions]] +deps = ["AbstractLattices", "DataStructures", "Permutations"] +git-tree-sha1 = "e9330391d04241eafdc358713b48396619c83bcb" +uuid = "ec83eff0-a5b5-5643-ae32-5cbf6eedec9d" +version = "0.3.1" + +[[deps.SimplePolynomials]] +deps = ["Mods", "Multisets", "Polynomials", "Primes"] +git-tree-sha1 = "7063828369cafa93f3187b3d0159f05582011405" +uuid = "cc47b68c-3164-5771-a705-2bc0097375a0" +version = "0.2.17" + +[[deps.SimpleRandom]] +deps = ["Distributions", "LinearAlgebra", "Random"] +git-tree-sha1 = "3a6fb395e37afab81aeea85bae48a4db5cd7244a" +uuid = "a6525b86-64cd-54fa-8f65-62fc48bdc0e8" +version = "0.3.1" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + [[deps.SnoopPrecompile]] deps = ["Preferences"] git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" @@ -1298,6 +1834,7 @@ version = "1.1.1" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" [[deps.SparseInverseSubset]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1315,6 +1852,18 @@ weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" +[[deps.StableHashTraits]] +deps = ["Compat", "PikaParser", "SHA", "Tables", "TupleTools"] +git-tree-sha1 = "662f56ffe22b3985f3be7474f0aecbaf214ecf0f" +uuid = "c5dd0088-6c3f-4803-b00e-f31a60c170fa" +version = "1.1.6" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + [[deps.StaticArrays]] deps = ["LinearAlgebra", "Random", "StaticArraysCore"] git-tree-sha1 = "9cabadf6e7cd2349b6cf49f1915ad2028d65e881" @@ -1333,7 +1882,7 @@ version = "1.4.2" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.9.0" +version = "1.10.0" [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -1378,9 +1927,9 @@ deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "5.10.1+6" +version = "7.2.1+1" [[deps.SymbolicIndexingInterface]] deps = ["DocStringExtensions"] @@ -1438,6 +1987,12 @@ version = "0.1.1" deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "34cc045dd0aaa59b8bbe86c644679bc57f1d5bd0" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.8" + [[deps.TimerOutputs]] deps = ["ExprTools", "Printf"] git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" @@ -1461,12 +2016,22 @@ git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" version = "0.1.7" +[[deps.TriplotBase]] +git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +uuid = "981d1d27-644d-49a2-9326-4793e63143c3" +version = "0.1.0" + [[deps.TruncatedStacktraces]] deps = ["InteractiveUtils", "MacroTools", "Preferences"] git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" uuid = "781d530d-4396-4725-bb49-402e4bee1e77" version = "1.4.0" +[[deps.TupleTools]] +git-tree-sha1 = "155515ed4c4236db30049ac1495e2969cc06be9d" +uuid = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" +version = "1.4.3" + [[deps.URIs]] git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" @@ -1568,6 +2133,12 @@ git-tree-sha1 = "fcdae142c1cfc7d89de2d11e08721d0f2f86c98a" uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" version = "0.6.6" +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "1.0.0" + [[deps.WorkerUtilities]] git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" @@ -1750,7 +2321,7 @@ version = "4.3.4+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+0" +version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1798,6 +2369,12 @@ git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" version = "3.1.1+0" +[[deps.isoband_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" +version = "0.2.3+0" + [[deps.libaom_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" @@ -1813,7 +2390,7 @@ version = "0.15.1+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+0" +version = "5.8.0+1" [[deps.libevdev_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -1839,6 +2416,12 @@ git-tree-sha1 = "93284c28274d9e75218a416c65ec49d0e0fcdf3d" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" version = "1.6.40+0" +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + [[deps.libsodium_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e" @@ -1860,12 +2443,12 @@ version = "1.1.6+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.48.0+0" +version = "1.52.0+1" [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+0" +version = "17.4.0+2" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] diff --git a/Project.toml b/Project.toml index 396a504..46cefde 100644 --- a/Project.toml +++ b/Project.toml @@ -7,6 +7,7 @@ version = "0.1.0" BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" ParametricMCPs = "9b992ff8-05bb-4ea1-b9d2-5ef72d82f7ad" PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 7bf4dd1..fd89a09 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -8,203 +8,144 @@ Makie.inline!(false) # export demo -# function demo() - -# Game parameters -attacker_preference = [.1; .2; .7] - -# Axis parameters - # borders - ax_aspect = 1 - ax_limits = (0, 1, 0, 1) - # title - ax_titlegap = 48 - ax_titlesize = 60 - # x-axis - ax_xautolimitmargin = (0, 0) - ax_xgridwidth = 2 - ax_xticklabelsize = 36 - ax_xticks = -10:10 - ax_xticksize = 18 - # y-axis - ax_yautolimitmargin = (0, 0) - ax_ygridwidth = 2 - ax_yticklabelpad = 14 - ax_yticklabelsize = 36 - ax_yticks = -10:10 - ax_yticksize = 18 - - - -# ## Observables -# # Observables are a way to create a reactive programming environment in Julia. -# # Listener is an Observable that is dependent on another Observable -# x = Observable(1.0) # no listeners -# y = Observable(2.0) # no listensers -# z = @lift($x .+ $y) # set up listener using the lift macro - -# x[] = 2.0 # change x using empty brackets -# println(z) # updates automatically - -# # ObserverFunction. on(...) adds function f as a listener to observable -# w = on(x) do val -# println("x changed to $val") -# end - -# # Simple Example (REPL에서 Makie.inline!(false) 해주기) -# ox = 1:4 -# oy = Observable(rand(4)) # Y-values are Observables -# lw = Observable(2.0) # line width is an Observable - -# fig = Figure() -# ax = Axis(fig[1,1]) -# lines!(ox, oy, linewidth = lw) # plot initial values -# ylims!(ax, 0, 1) # set y limits - -# lw[] = 50.0 # change line width -# oy[] = rand(4) # change y values - - -## 1. Sliders -# initialize plot -fig = Figure(;size = (3840, 2160)) -# add axis - -ax_north = Axis(fig[1,2], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "North", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -) -ax_east = Axis(fig[2,1], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "East", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -) -ax_west = Axis(fig[2,3], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "West", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -) - - -# darken axes - -# vlines!(ax1, [0], linewidth = 2, color = :black) -# hlines!(ax1, [0], linewidth = 2, color = :black) - -# Create sliders -sg = SliderGrid( - fig[3, 2], - (label = "prior_north", range = 0:0.01:1, format = "{:.2f}", startvalue = 01), - (label = "prior_east", range = 0:0.01:1, format = "{:.2f}", startvalue = 0), - (label = "prior_west", range = 0:0.01:1, format = "{:.2f}", startvalue = 0) -) - -# Create listener -prior_north_listener = sg.sliders[1].value -prior_east_listener = sg.sliders[2].value -prior_west_listener = sg.sliders[3].value - -# print("{$prior_north_listener}, {$prior_east_listener}, {$prior_west_listener}\n") - -x = -10:0.01:10 -# r = @lift(solve_r([$prior_north_listener; $prior_east_listener; $prior_west_listener], attacker_preference)) - -#temporary -r = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) -# print(r) -scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) - -# Plot line -# line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) - -## Another way ## -# sliderob = [s.value for s in sg.sliders] - -# y = lift(sliderob...) do slope, intercept -# slope .* x .+ intercept -# end -# y = lift((slope, intercept) -> slope .* x .+ intercept, sliderob...) # also same - -# Plot line -# line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) - -# # 2. Button -# fig[3,1] = buttongrid = GridLayout(tellwidth = false) -# buttonlabels = ["Red", "Green", "Blue"] - -# buttons = buttongrid[1, 1:3] = [ -# Button(fig, label = l, height = 60, width = 250, fontsize = 30) for l in buttonlabels] - -# bt_sublayout = GridLayout(height = 150) -# fig[3,1] = bt_sublayout - -# # Random dataset we want to see - -# x = -10:0.01:10 -# data = [] - -# for i in 1:3 -# d = rand(-10:0.01:10, length(x)) -# push!(data, d) -# end - -# # Set y_data as observable -# y = Observable(data[1]) - -# # Set color as observable -# colors = [:red, :green, :blue] -# c = Observable(colors[1]) - -# # Set markersize as observable -# markersizes = [8, 12, 16] -# ms = Observable(markersizes[1]) - -# # Add scatter plot -# scat1 = scatter!(ax1, x, y, markersize = ms, color = c) - -# # Button instructions using on...do...end syntax - -# for i in 1:3 -# on(buttons[i].clicks) do _ -# y[] = data[i] -# c[] = colors[i] -# ms[] = markersizes[i] -# end -# end -display(fig) +function demo() + + # Game parameters + attacker_preference = [.1; .2; .7] + + ## 1. Sliders + # Initialize plot + fig = Figure(;size = (3840, 2160)) + + # Add axis for each direction + ax_north = Axis(fig[1,2], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "North", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + ) + ax_east = Axis(fig[2,1], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "East", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + ) + ax_west = Axis(fig[2,3], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "West", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + ) + + # Create sliders + sg = SliderGrid( + fig[3, 2], + (label = "prior_north", range = 0:0.01:1, format = "{:.2f}", startvalue = 01), + (label = "prior_east", range = 0:0.01:1, format = "{:.2f}", startvalue = 0), + (label = "prior_west", range = 0:0.01:1, format = "{:.2f}", startvalue = 0) + ) + + # Create listener + prior_north_listener = sg.sliders[1].value + prior_east_listener = sg.sliders[2].value + prior_west_listener = sg.sliders[3].value + + # TODO + #r = @lift(solve_r([$prior_north_listener; $prior_east_listener; $prior_west_listener], attacker_preference)) + + #temporary + r = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + # print(r) + scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) + + # Plot line + # line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) + + ## Another way ## + # sliderob = [s.value for s in sg.sliders] + + # y = lift(sliderob...) do slope, intercept + # slope .* x .+ intercept + # end + # y = lift((slope, intercept) -> slope .* x .+ intercept, sliderob...) # also same + + # Plot line + # line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) + + # # 2. Button + # fig[3,1] = buttongrid = GridLayout(tellwidth = false) + # buttonlabels = ["Red", "Green", "Blue"] + + # buttons = buttongrid[1, 1:3] = [ + # Button(fig, label = l, height = 60, width = 250, fontsize = 30) for l in buttonlabels] + + # bt_sublayout = GridLayout(height = 150) + # fig[3,1] = bt_sublayout + + # # Random dataset we want to see + + # x = -10:0.01:10 + # data = [] + + # for i in 1:3 + # d = rand(-10:0.01:10, length(x)) + # push!(data, d) + # end + + # # Set y_data as observable + # y = Observable(data[1]) + + # # Set color as observable + # colors = [:red, :green, :blue] + # c = Observable(colors[1]) + + # # Set markersize as observable + # markersizes = [8, 12, 16] + # ms = Observable(markersizes[1]) + + # # Add scatter plot + # scat1 = scatter!(ax1, x, y, markersize = ms, color = c) + + # # Button instructions using on...do...end syntax + + # for i in 1:3 + # on(buttons[i].clicks) do _ + # y[] = data[i] + # c[] = colors[i] + # ms[] = markersizes[i] + # end + # end + display(fig) #demo function end -# end +end + #module end end \ No newline at end of file From 42576fcb037095405f1813531ee4f28070ab5254 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:45:53 -0600 Subject: [PATCH 03/35] revised axis parameters --- experiments/scout_visuals.jl | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index fd89a09..cf8b065 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -15,7 +15,28 @@ function demo() ## 1. Sliders # Initialize plot - fig = Figure(;size = (3840, 2160)) + fig = Figure(; size = (600, 400)) + + # Axis parameters + # borders + ax_aspect = 1 + ax_limits = (0, 1, 0, 1) + # title + ax_titlegap = 48 + ax_titlesize = 60 + # x-axis + ax_xautolimitmargin = (0, 0) + ax_xgridwidth = 2 + ax_xticklabelsize = 36 + ax_xticks = -10:10 + ax_xticksize = 18 + # y-axis + ax_yautolimitmargin = (0, 0) + ax_ygridwidth = 2 + ax_yticklabelpad = 14 + ax_yticklabelsize = 36 + ax_yticks = -10:10 + ax_yticksize = 18 # Add axis for each direction ax_north = Axis(fig[1,2], From 7ff06d87fe2e47b398edc86c1f14f1afd78a195d Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 23 Jan 2024 10:10:28 -0600 Subject: [PATCH 04/35] create list of TODOs update attacker_preference --- experiments/scout_visuals.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index cf8b065..ef55003 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -7,15 +7,19 @@ include("tower_defense.jl") Makie.inline!(false) # export demo +""" TODO: +1. Do visualiation for each given world/signal received by Player 1 +2. Solve for all different combinations and store them in a "look-up dictionary" so that you dont have to solve the game all the time +""" function demo() # Game parameters - attacker_preference = [.1; .2; .7] + attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] ## 1. Sliders # Initialize plot - fig = Figure(; size = (600, 400)) + fig = Figure(; size = (3840, 2160)) # Axis parameters # borders @@ -93,12 +97,12 @@ function demo() (label = "prior_west", range = 0:0.01:1, format = "{:.2f}", startvalue = 0) ) - # Create listener + # TODO: Priors need to be in the simplex. Values should add up to 1.0. prior_north_listener = sg.sliders[1].value prior_east_listener = sg.sliders[2].value prior_west_listener = sg.sliders[3].value - # TODO + # TODO: Integrate with solve_r function #r = @lift(solve_r([$prior_north_listener; $prior_east_listener; $prior_west_listener], attacker_preference)) #temporary From a769a1d5a011e695bddaa3f7c9e0e29cd4ce6f1d Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Tue, 23 Jan 2024 17:33:11 -0600 Subject: [PATCH 05/35] some work on saving computations --- Manifest.toml | 60 +++++++------ Project.toml | 1 + experiments/scout_visuals.jl | 167 ++++++++++++++++++++++++++++------- 3 files changed, 167 insertions(+), 61 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index 8ee8033..fca380a 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.0" +julia_version = "1.9.3" manifest_format = "2.0" -project_hash = "93c6ae1b7d34c53294667f6503bd776af5cbcc76" +project_hash = "2fea9ab4adad4ea859e33a972c23495c1091cc70" [[deps.ADTypes]] git-tree-sha1 = "f5c25e8a5b29b5e941b7408bc8cc79fea4d9ef9a" @@ -273,7 +273,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+1" +version = "1.0.5+0" [[deps.CompositeTypes]] git-tree-sha1 = "02d2316b7ffceff992f3096ae48c7829a8aa0638" @@ -999,26 +999,21 @@ version = "0.3.1" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" +version = "0.6.3" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.4.0+0" +version = "7.84.0+0" [[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.6.4+0" - [[deps.LibSSH2_jll]] deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" +version = "1.10.2+0" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" @@ -1172,7 +1167,7 @@ version = "1.1.7" [[deps.MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+1" +version = "2.28.2+0" [[deps.Measures]] git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" @@ -1213,7 +1208,7 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.1.10" +version = "2022.10.11" [[deps.Multisets]] git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" @@ -1289,7 +1284,7 @@ version = "1.3.5+1" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+2" +version = "0.3.21+4" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1306,7 +1301,7 @@ version = "3.1.4+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+2" +version = "0.8.1+0" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] @@ -1352,7 +1347,7 @@ version = "1.5.0" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" +version = "10.42.0+0" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1428,7 +1423,7 @@ version = "0.42.2+0" [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.10.0" +version = "1.9.2" [[deps.PkgVersion]] deps = ["Pkg"] @@ -1595,7 +1590,7 @@ deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.Random]] -deps = ["SHA"] +deps = ["SHA", "Serialization"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [[deps.RandomExtensions]] @@ -1834,7 +1829,6 @@ version = "1.1.1" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.10.0" [[deps.SparseInverseSubset]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1882,7 +1876,7 @@ version = "1.4.2" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.10.0" +version = "1.9.0" [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -1927,9 +1921,15 @@ deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.2.1+1" +version = "5.10.1+6" + +[[deps.Suppressor]] +deps = ["Logging"] +git-tree-sha1 = "6cd9e4a207964c07bf6395beff7a1e8f21d0f3b2" +uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb" +version = "0.2.6" [[deps.SymbolicIndexingInterface]] deps = ["DocStringExtensions"] @@ -2086,6 +2086,12 @@ git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" version = "0.2.0" +[[deps.UpdateJulia]] +deps = ["JSON", "Suppressor"] +git-tree-sha1 = "ca2f4bae4aa6a99f81aac1075f949a6a4d392443" +uuid = "770da0de-323d-4d28-9202-0e205c1e0aff" +version = "0.4.4" + [[deps.VersionParsing]] git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" @@ -2321,7 +2327,7 @@ version = "4.3.4+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" +version = "1.2.13+0" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -2390,7 +2396,7 @@ version = "0.15.1+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" +version = "5.8.0+0" [[deps.libevdev_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -2443,12 +2449,12 @@ version = "1.1.6+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.52.0+1" +version = "1.48.0+0" [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+2" +version = "17.4.0+0" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] diff --git a/Project.toml b/Project.toml index 46cefde..ae10d4d 100644 --- a/Project.toml +++ b/Project.toml @@ -14,4 +14,5 @@ PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" +UpdateJulia = "770da0de-323d-4d28-9202-0e205c1e0aff" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index ef55003..769e22d 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -2,46 +2,54 @@ module scout_visuals using GamesVoI using GLMakie +using LinearAlgebra +using JSON3 include("tower_defense.jl") Makie.inline!(false) -# export demo +# Globals: +num_worlds = 3 +prior_range_step = 0.01 +prior_range = 0:prior_range_step:1 +save_file_name = "precomputed_r.txt" +save_precision = 4 + +# Game Parameters +attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] + +# Visual parameters + # Axis parameters + # borders + ax_aspect = 1 + ax_limits = (0, 1, 0, 1) + # title + ax_titlegap = 48 + ax_titlesize = 60 + # x-axis + ax_xautolimitmargin = (0, 0) + ax_xgridwidth = 2 + ax_xticklabelsize = 36 + ax_xticks = -10:10 + ax_xticksize = 18 + # y-axis + ax_yautolimitmargin = (0, 0) + ax_ygridwidth = 2 + ax_yticklabelpad = 14 + ax_yticklabelsize = 36 + ax_yticks = -10:10 + ax_yticksize = 18 + """ TODO: 1. Do visualiation for each given world/signal received by Player 1 2. Solve for all different combinations and store them in a "look-up dictionary" so that you dont have to solve the game all the time """ function demo() - - # Game parameters - attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] - ## 1. Sliders # Initialize plot fig = Figure(; size = (3840, 2160)) - # Axis parameters - # borders - ax_aspect = 1 - ax_limits = (0, 1, 0, 1) - # title - ax_titlegap = 48 - ax_titlesize = 60 - # x-axis - ax_xautolimitmargin = (0, 0) - ax_xgridwidth = 2 - ax_xticklabelsize = 36 - ax_xticks = -10:10 - ax_xticksize = 18 - # y-axis - ax_yautolimitmargin = (0, 0) - ax_ygridwidth = 2 - ax_yticklabelpad = 14 - ax_yticklabelsize = 36 - ax_yticks = -10:10 - ax_yticksize = 18 - # Add axis for each direction ax_north = Axis(fig[1,2], # borders @@ -92,21 +100,19 @@ function demo() # Create sliders sg = SliderGrid( fig[3, 2], - (label = "prior_north", range = 0:0.01:1, format = "{:.2f}", startvalue = 01), - (label = "prior_east", range = 0:0.01:1, format = "{:.2f}", startvalue = 0), - (label = "prior_west", range = 0:0.01:1, format = "{:.2f}", startvalue = 0) + (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 0), + (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 0), + (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 0) ) - # TODO: Priors need to be in the simplex. Values should add up to 1.0. prior_north_listener = sg.sliders[1].value prior_east_listener = sg.sliders[2].value prior_west_listener = sg.sliders[3].value - # TODO: Integrate with solve_r function - #r = @lift(solve_r([$prior_north_listener; $prior_east_listener; $prior_west_listener], attacker_preference)) - #temporary - r = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + normalize!(priors) + r = solve_r(priors, attacker_preference) # print(r) scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) @@ -172,5 +178,98 @@ function demo() #demo function end end +function compute_all_r_save_to_file() + # save_file = open(save_file_name, "w+") + hashmap = Dict{Tuple{Float64, Float64, Float64}, Tuple{Float64, Float64, Float64}}() + for prior_north in prior_range + for prior_east in prior_range + for prior_west in prior_range + current_prior = (prior_north, prior_east, prior_west) + r = solve_r(current_prior, attacker_preference) + hashmap[current_prior] = round.(r, digits = save_precision) + end + end + end + JSON3.write(save_file_name, hashmap) + # write(save_file, hashmap) + # close(save_file) +end + +function draw_given() + # saved_computations = open(save_file_name, "r") + # hashmap = read(save_file, Dict{Tuple{Float64, Float64, Float64}, Tuple{Float64, Float64, Float64}}) + saved_computations = read(save_file_name, String) + hashmap = JSON3.read(saved_computations, Dict{Tuple{Float64, Float64, Float64}, Tuple{Float64, Float64, Float64}}) + + + fig = Figure(; size = (3840, 2160)) + + # Add axis for each direction + ax_north = Axis(fig[1,2], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "North", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + ) + ax_east = Axis(fig[2,1], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "East", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + ) + ax_west = Axis(fig[2,3], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "West", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + ) + + # Create sliders + sg = SliderGrid( + fig[3, 2], + (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 0), + (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 0), + (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 0) + ) + + prior_north_listener = sg.sliders[1].value + prior_east_listener = sg.sliders[2].value + prior_west_listener = sg.sliders[3].value + + priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + if priors[1] + priors[2] + priors[3] == 1 + r = hashmap[(priors[1], priors[2], priors[3])] + end + # print(r) + scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) + display(fig) +end #module end end \ No newline at end of file From e7ea5484a563f7dc40c1bd608182b083a9aff696 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Tue, 23 Jan 2024 17:59:02 -0600 Subject: [PATCH 06/35] fixed using observables instead of vectors --- Manifest.toml | 20 +++++++++++++++++++- Project.toml | 1 + experiments/scout_visuals.jl | 13 +++++++------ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index fca380a..f3126b1 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.9.3" manifest_format = "2.0" -project_hash = "2fea9ab4adad4ea859e33a972c23495c1091cc70" +project_hash = "7d7b3c1186cf1c68f85209fdd2012a14aa1bd1c5" [[deps.ADTypes]] git-tree-sha1 = "f5c25e8a5b29b5e941b7408bc8cc79fea4d9ef9a" @@ -891,6 +891,18 @@ git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" version = "0.21.4" +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.0" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + [[deps.JpegTurbo]] deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" @@ -1916,6 +1928,12 @@ git-tree-sha1 = "0a3db38e4cce3c54fe7a71f831cd7b6194a54213" uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" version = "0.6.16" +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "ca4bccb03acf9faaf4137a9abc1881ed1841aa70" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.10.0" + [[deps.SuiteSparse]] deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" diff --git a/Project.toml b/Project.toml index ae10d4d..8744aa9 100644 --- a/Project.toml +++ b/Project.toml @@ -9,6 +9,7 @@ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" +JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" ParametricMCPs = "9b992ff8-05bb-4ea1-b9d2-5ef72d82f7ad" PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 769e22d..dcdc541 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -11,6 +11,7 @@ Makie.inline!(false) # Globals: num_worlds = 3 prior_range_step = 0.01 +prior_range_step_precision = 2 prior_range = 0:prior_range_step:1 save_file_name = "precomputed_r.txt" save_precision = 4 @@ -110,8 +111,9 @@ function demo() prior_west_listener = sg.sliders[3].value #temporary - priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) - normalize!(priors) + observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + priors = normalize(observable_priors[]) + r = solve_r(priors, attacker_preference) # print(r) scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) @@ -263,10 +265,9 @@ function draw_given() prior_east_listener = sg.sliders[2].value prior_west_listener = sg.sliders[3].value - priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) - if priors[1] + priors[2] + priors[3] == 1 - r = hashmap[(priors[1], priors[2], priors[3])] - end + observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + priors = normalize(observable_priors[]) + priors .= round.(priors, digits = prior_range_step_precision) # print(r) scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) display(fig) From ccdfa5f1a1324052eb60a077b3386b480de2adcb Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Tue, 23 Jan 2024 18:32:49 -0600 Subject: [PATCH 07/35] getting from hashmap dynamically --- experiments/scout_visuals.jl | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index dcdc541..8ee3225 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -111,12 +111,22 @@ function demo() prior_west_listener = sg.sliders[3].value #temporary - observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) - priors = normalize(observable_priors[]) + observable_priors = @lift(round.(normalize([$prior_north_listener; $prior_east_listener; $prior_west_listener]), + digits = prior_range_step_precision)) - r = solve_r(priors, attacker_preference) + arr = [.1, .2, .3, .4, .5, .6, .7, .8] + + f1(x) = arr[1] .+ x + f2(x) = x + + r1 = lift(f1, observable_priors) + r2 = lift(f2, observable_priors) + # priors = normalize(observable_priors[]) + + # r = solve_r(priors, attacker_preference) + # r = priors # print(r) - scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) + scat1 = scatter!(ax_north, r1, r2, markersize = 10, color = :red) # Plot line # line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) @@ -265,9 +275,13 @@ function draw_given() prior_east_listener = sg.sliders[2].value prior_west_listener = sg.sliders[3].value - observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) - priors = normalize(observable_priors[]) - priors .= round.(priors, digits = prior_range_step_precision) + priors = @lift(round.(normalize([$prior_north_listener; $prior_east_listener; $prior_west_listener]), + digits = prior_range_step_precision)) + + get_r(x) = hashmap[x[]] + + r = lift(get_r, priors) + # print(r) scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) display(fig) From ae143a8bc7cf8967cb3a28bac135fc728c8eea67 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Fri, 26 Jan 2024 16:13:59 -0600 Subject: [PATCH 08/35] prior simplex --- Manifest.toml | 46 ++++++++------- experiments/scout_visuals.jl | 107 ++++++++++++----------------------- 2 files changed, 61 insertions(+), 92 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index f3126b1..f5c9ae2 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.9.3" +julia_version = "1.10.0" manifest_format = "2.0" project_hash = "7d7b3c1186cf1c68f85209fdd2012a14aa1bd1c5" @@ -273,7 +273,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+0" +version = "1.0.5+1" [[deps.CompositeTypes]] git-tree-sha1 = "02d2316b7ffceff992f3096ae48c7829a8aa0638" @@ -1011,21 +1011,26 @@ version = "0.3.1" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.3" +version = "0.6.4" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "7.84.0+0" +version = "8.4.0+0" [[deps.LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + [[deps.LibSSH2_jll]] deps = ["Artifacts", "Libdl", "MbedTLS_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.10.2+0" +version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" @@ -1179,7 +1184,7 @@ version = "1.1.7" [[deps.MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+0" +version = "2.28.2+1" [[deps.Measures]] git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" @@ -1220,7 +1225,7 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2022.10.11" +version = "2023.1.10" [[deps.Multisets]] git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" @@ -1296,7 +1301,7 @@ version = "1.3.5+1" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.21+4" +version = "0.3.23+2" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1313,7 +1318,7 @@ version = "3.1.4+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+0" +version = "0.8.1+2" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] @@ -1359,7 +1364,7 @@ version = "1.5.0" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+0" +version = "10.42.0+1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1435,7 +1440,7 @@ version = "0.42.2+0" [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.9.2" +version = "1.10.0" [[deps.PkgVersion]] deps = ["Pkg"] @@ -1602,7 +1607,7 @@ deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.Random]] -deps = ["SHA", "Serialization"] +deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [[deps.RandomExtensions]] @@ -1841,6 +1846,7 @@ version = "1.1.1" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" [[deps.SparseInverseSubset]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1888,7 +1894,7 @@ version = "1.4.2" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.9.0" +version = "1.10.0" [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -1939,9 +1945,9 @@ deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "5.10.1+6" +version = "7.2.1+1" [[deps.Suppressor]] deps = ["Logging"] @@ -2345,7 +2351,7 @@ version = "4.3.4+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+0" +version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -2414,7 +2420,7 @@ version = "0.15.1+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+0" +version = "5.8.0+1" [[deps.libevdev_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -2467,12 +2473,12 @@ version = "1.1.6+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.48.0+0" +version = "1.52.0+1" [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+0" +version = "17.4.0+2" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 8ee3225..a6c5e73 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -10,9 +10,9 @@ Makie.inline!(false) # Globals: num_worlds = 3 -prior_range_step = 0.01 -prior_range_step_precision = 2 -prior_range = 0:prior_range_step:1 +prior_range_step = 0.1 +prior_range_step_precision = 1 +prior_range = 0.001:prior_range_step:1 save_file_name = "precomputed_r.txt" save_precision = 4 @@ -46,7 +46,7 @@ attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] 2. Solve for all different combinations and store them in a "look-up dictionary" so that you dont have to solve the game all the time """ -function demo() +function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) ## 1. Sliders # Initialize plot fig = Figure(; size = (3840, 2160)) @@ -98,6 +98,12 @@ function demo() yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize ) + ax_simplex = Axis3(fig[2,2], aspect = (1,1,1), + limits = ((0.0, 1.0, 0.0, 1.0, 0.0, 1.1)), + xreversed = true, + yreversed = true + ) + # Create sliders sg = SliderGrid( fig[3, 2], @@ -109,82 +115,37 @@ function demo() prior_north_listener = sg.sliders[1].value prior_east_listener = sg.sliders[2].value prior_west_listener = sg.sliders[3].value + + # TODO: + #scat1 = scatter!(ax_north, r1, r2, markersize = 10, color = :red) - #temporary - observable_priors = @lift(round.(normalize([$prior_north_listener; $prior_east_listener; $prior_west_listener]), - digits = prior_range_step_precision)) - - arr = [.1, .2, .3, .4, .5, .6, .7, .8] - - f1(x) = arr[1] .+ x - f2(x) = x - - r1 = lift(f1, observable_priors) - r2 = lift(f2, observable_priors) - # priors = normalize(observable_priors[]) - - # r = solve_r(priors, attacker_preference) - # r = priors - # print(r) - scat1 = scatter!(ax_north, r1, r2, markersize = 10, color = :red) - - # Plot line - # line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) - - ## Another way ## - # sliderob = [s.value for s in sg.sliders] - - # y = lift(sliderob...) do slope, intercept - # slope .* x .+ intercept - # end - # y = lift((slope, intercept) -> slope .* x .+ intercept, sliderob...) # also same - - # Plot line - # line1 = lines!(ax1, x, y, linewidth = 2, color = :blue) - - # # 2. Button - # fig[3,1] = buttongrid = GridLayout(tellwidth = false) - # buttonlabels = ["Red", "Green", "Blue"] - - # buttons = buttongrid[1, 1:3] = [ - # Button(fig, label = l, height = 60, width = 250, fontsize = 30) for l in buttonlabels] - - # bt_sublayout = GridLayout(height = 150) - # fig[3,1] = bt_sublayout - - # # Random dataset we want to see - - # x = -10:0.01:10 - # data = [] + # Plot priors on the Simplex + scatterlines!(ax_simplex, [1;0;0;1], [0;1;0;0], [0;0;1;0], markersize = 15) + #scat_priors = @lift scatter!(ax_simplex, $observable_priors[1], $observable_priors[2], $observable_priors[3]; markersize = 15, color = :red) + get_val1(x) = x[1] + get_val2(x) = x[2] + get_val3(x) = x[3] - # for i in 1:3 - # d = rand(-10:0.01:10, length(x)) - # push!(data, d) - # end + norm1(x) = round.(normalize(x, 1), digits=1) - # # Set y_data as observable - # y = Observable(data[1]) + # Normalize priors + observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) + normalized_observable_p = lift(norm1, observable_priors) - # # Set color as observable - # colors = [:red, :green, :blue] - # c = Observable(colors[1]) + p1 = lift(get_val1, normalized_observable_p) + p2 = lift(get_val2, normalized_observable_p) + p3 = lift(get_val3, normalized_observable_p) - # # Set markersize as observable - # markersizes = [8, 12, 16] - # ms = Observable(markersizes[1]) + scat_priors = scatter!(ax_simplex, p1, p2, p3 ; markersize = 15, color = :red) - # # Add scatter plot - # scat1 = scatter!(ax1, x, y, markersize = ms, color = c) + @lift println("priors: ", $normalized_observable_p) - # # Button instructions using on...do...end syntax + # Solve for r + obs_r(x) = solve_r(x, attacker_preference)[1] + scout_allocation = lift(obs_r, normalized_observable_p) - # for i in 1:3 - # on(buttons[i].clicks) do _ - # y[] = data[i] - # c[] = colors[i] - # ms[] = markersizes[i] - # end - # end + scout_north = scatter!(ax_north, scout_allocation, scout_allocation, markersize = 10, color = :red) + display(fig) #demo function end @@ -197,6 +158,7 @@ function compute_all_r_save_to_file() for prior_east in prior_range for prior_west in prior_range current_prior = (prior_north, prior_east, prior_west) + Main.@infiltrate r = solve_r(current_prior, attacker_preference) hashmap[current_prior] = round.(r, digits = save_precision) end @@ -275,6 +237,7 @@ function draw_given() prior_east_listener = sg.sliders[2].value prior_west_listener = sg.sliders[3].value + # TODO: We want normalized priors to appear on GUI (next to slider) priors = @lift(round.(normalize([$prior_north_listener; $prior_east_listener; $prior_west_listener]), digits = prior_range_step_precision)) From a870330da4ec8817ea88f4256bfd83e7091c7854 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Fri, 26 Jan 2024 16:32:43 -0600 Subject: [PATCH 09/35] try with pie --- experiments/scout_visuals.jl | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index a6c5e73..5218bd8 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -122,31 +122,38 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Plot priors on the Simplex scatterlines!(ax_simplex, [1;0;0;1], [0;1;0;0], [0;0;1;0], markersize = 15) #scat_priors = @lift scatter!(ax_simplex, $observable_priors[1], $observable_priors[2], $observable_priors[3]; markersize = 15, color = :red) - get_val1(x) = x[1] - get_val2(x) = x[2] - get_val3(x) = x[3] - + get_val(x, index) = x[index] norm1(x) = round.(normalize(x, 1), digits=1) # Normalize priors observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) normalized_observable_p = lift(norm1, observable_priors) - p1 = lift(get_val1, normalized_observable_p) - p2 = lift(get_val2, normalized_observable_p) - p3 = lift(get_val3, normalized_observable_p) + p1 = lift(get_val, normalized_observable_p, 1) + p2 = lift(get_val, normalized_observable_p, 2) + p3 = lift(get_val, normalized_observable_p, 3) scat_priors = scatter!(ax_simplex, p1, p2, p3 ; markersize = 15, color = :red) @lift println("priors: ", $normalized_observable_p) # Solve for r - obs_r(x) = solve_r(x, attacker_preference)[1] - scout_allocation = lift(obs_r, normalized_observable_p) + obs_r(x) = solve_r(x, attacker_preference) + scout_allocation_north = lift(get_val, lift(obs_r, normalized_observable_p), 1) + scout_allocation_east = lift(get_val, lift(obs_r, normalized_observable_p), 2) + scout_allocation_west = lift(get_val, lift(obs_r, normalized_observable_p), 3) - scout_north = scatter!(ax_north, scout_allocation, scout_allocation, markersize = 10, color = :red) + scatter!(ax_north, scout_allocation_north, scout_allocation_north, markersize = 10, color = :red) + scatter!(ax_east, scout_allocation_east, scout_allocation_east, markersize = 10, color = :purple) + scatter!(ax_west, scout_allocation_west, scout_allocation_west, markersize = 10, color = :green) - display(fig) + # Try + f, ax, plt = pie(@lift([$scout_allocation_north, $scout_allocation_east, $scout_allocation_west]), + normalize = false, + color = [:red, :purple, :green] + ) + fig[1,1] = f + fig #demo function end end From 5edda3e58297f14d9c525f6a95802172ff6f9f32 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Mon, 29 Jan 2024 22:18:57 -0600 Subject: [PATCH 10/35] cleaned demo(), fixed additional implementation of solve_r() --- experiments/scout_visuals.jl | 80 ++++++++++++++---------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 5218bd8..114dcc4 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -8,14 +8,6 @@ include("tower_defense.jl") Makie.inline!(false) -# Globals: -num_worlds = 3 -prior_range_step = 0.1 -prior_range_step_precision = 1 -prior_range = 0.001:prior_range_step:1 -save_file_name = "precomputed_r.txt" -save_precision = 4 - # Game Parameters attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] @@ -47,9 +39,16 @@ attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] """ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) - ## 1. Sliders + + num_worlds = 3 + prior_range_step = 0.01 + prior_range_step_precision = 1 + prior_range = 0.01:prior_range_step:1 + save_file_name = "precomputed_r.txt" + save_precision = 4 + # Initialize plot - fig = Figure(; size = (3840, 2160)) + fig = Figure() # Add axis for each direction ax_north = Axis(fig[1,2], @@ -107,55 +106,36 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Create sliders sg = SliderGrid( fig[3, 2], - (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 0), - (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 0), - (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 0) + (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 1.0), + (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 1.0), + (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 1.0) ) - - prior_north_listener = sg.sliders[1].value - prior_east_listener = sg.sliders[2].value - prior_west_listener = sg.sliders[3].value + observable_prior_sliders = [s.value for s in sg.sliders] - # TODO: - #scat1 = scatter!(ax_north, r1, r2, markersize = 10, color = :red) - # Plot priors on the Simplex scatterlines!(ax_simplex, [1;0;0;1], [0;1;0;0], [0;0;1;0], markersize = 15) - #scat_priors = @lift scatter!(ax_simplex, $observable_priors[1], $observable_priors[2], $observable_priors[3]; markersize = 15, color = :red) - get_val(x, index) = x[index] - norm1(x) = round.(normalize(x, 1), digits=1) # Normalize priors - observable_priors = @lift([$prior_north_listener; $prior_east_listener; $prior_west_listener]) - normalized_observable_p = lift(norm1, observable_priors) - - p1 = lift(get_val, normalized_observable_p, 1) - p2 = lift(get_val, normalized_observable_p, 2) - p3 = lift(get_val, normalized_observable_p, 3) - - scat_priors = scatter!(ax_simplex, p1, p2, p3 ; markersize = 15, color = :red) - + normalized_observable_p = lift(observable_prior_sliders...) do a, b, c + round.(normalize([a,b,c], 1), digits = 2) + end @lift println("priors: ", $normalized_observable_p) - # Solve for r - obs_r(x) = solve_r(x, attacker_preference) - scout_allocation_north = lift(get_val, lift(obs_r, normalized_observable_p), 1) - scout_allocation_east = lift(get_val, lift(obs_r, normalized_observable_p), 2) - scout_allocation_west = lift(get_val, lift(obs_r, normalized_observable_p), 3) + p1, p2, p3 = [lift((x,i)->x[i], normalized_observable_p, idx) for idx in 1:num_worlds] + scatter!(ax_simplex, p1, p2, p3 ; markersize = 15, color = :red) - scatter!(ax_north, scout_allocation_north, scout_allocation_north, markersize = 10, color = :red) - scatter!(ax_east, scout_allocation_east, scout_allocation_east, markersize = 10, color = :purple) - scatter!(ax_west, scout_allocation_west, scout_allocation_west, markersize = 10, color = :green) - - # Try - f, ax, plt = pie(@lift([$scout_allocation_north, $scout_allocation_east, $scout_allocation_west]), - normalize = false, - color = [:red, :purple, :green] - ) - fig[1,1] = f - fig + # Solve for scout_allocation, r + observable_r = on(normalized_observable_p) do x + solve_r(x, attacker_preference) + end + scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] -#demo function end + # TODO: Be creative with scout_allocation + scatter!(ax_north, scout_north, scout_north, markersize = 15, color = :red) + scatter!(ax_east, scout_east, scout_east, markersize = 15, color = :purple) + scatter!(ax_west, scout_west, scout_west, markersize = 15, color = :green) + + display(fig) end function compute_all_r_save_to_file() @@ -165,7 +145,6 @@ function compute_all_r_save_to_file() for prior_east in prior_range for prior_west in prior_range current_prior = (prior_north, prior_east, prior_west) - Main.@infiltrate r = solve_r(current_prior, attacker_preference) hashmap[current_prior] = round.(r, digits = save_precision) end @@ -256,5 +235,6 @@ function draw_given() scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) display(fig) end + #module end end \ No newline at end of file From 84449ee49f6177fe7b64b8b6c4ae8f26d4655429 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:49:42 -0600 Subject: [PATCH 11/35] working copy --- experiments/scout_visuals.jl | 46 ++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 114dcc4..e3708ed 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -46,6 +46,9 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. prior_range = 0.01:prior_range_step:1 save_file_name = "precomputed_r.txt" save_precision = 4 + K = 100 + opacity = 0.5 + # Initialize plot fig = Figure() @@ -130,11 +133,46 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] - # TODO: Be creative with scout_allocation - scatter!(ax_north, scout_north, scout_north, markersize = 15, color = :red) - scatter!(ax_east, scout_east, scout_east, markersize = 15, color = :purple) - scatter!(ax_west, scout_west, scout_west, markersize = 15, color = :green) + function get_random_point_within_ball(; radius = 0.3, center = [0.5, 0.5], num_points = 1) + # Check center is Tuple + @assert length(center) == 2 "Center must be a 2-element vector [x, y]" + x_coord, y_coord = center + + # Generate random angle in radians + angle = [2π * rand() for _ in 1:num_points] + + # Generate random distance within the specificed radius + r = [radius * sqrt(rand()) for _ in 1:num_points] + + # Calculate new x and y coordinates + x = x_coord .+ r .* cos.(angle) + y = y_coord .+ r .* sin.(angle) + + [x, y] + end + + # Check if scout_allocation results are normalized + @lift println("Scout allocation: ", [$scout_north, $scout_east, $scout_west]) + @assert round(sum([scout_north.val, scout_east.val, scout_west.val])) ≈ 1 "Scout allocation is not normalized" + + # Display scout allocation as a text on the Figure + text_directions = [lift((x) -> "$(round(x, digits = 2)* K)", scout) for scout in [scout_north, scout_east, scout_west]] + Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) + Label(fig[2,1], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) + Label(fig[2,3], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) + + # Plot scout allocation + points = @lift [get_random_point_within_ball(; num_points = round(scout, digits = 2)* K) for scout in [$scout_north, $scout_east, $scout_west]] + north_points, east_points, west_points = [lift((x, i) -> x[i], points, idx) for idx in 1:3] + x_north, y_north = [lift((x, i) -> x[i], north_points, idx) for idx in 1:2] + x_east, y_east = [lift((x, i) -> x[i], east_points, idx) for idx in 1:2] + x_west, y_west = [lift((x, i) -> x[i], west_points, idx) for idx in 1:2] + scatter!(ax_north, x_north, y_north, markersize = 15, color = (:orange, opacity)) + scatter!(ax_east, x_east, y_east, markersize = 15, color = (:pink, opacity+0.2)) + scatter!(ax_west, x_west, y_west, markersize = 15, color = (:green, opacity)) + + display(fig) end From eb8d1132e0a1468b81709b8aefcf39e61fec5037 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:56:04 -0600 Subject: [PATCH 12/35] scout visual using scatter, used solve_r update --- experiments/scout_visuals.jl | 82 ++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index e3708ed..27046f2 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -8,28 +8,25 @@ include("tower_defense.jl") Makie.inline!(false) -# Game Parameters -attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] - # Visual parameters # Axis parameters # borders ax_aspect = 1 - ax_limits = (0, 1, 0, 1) + ax_limits = (0, 2, 0, 2) # title - ax_titlegap = 48 - ax_titlesize = 60 + ax_titlegap = 1 + ax_titlesize = 30 # x-axis ax_xautolimitmargin = (0, 0) ax_xgridwidth = 2 - ax_xticklabelsize = 36 + ax_xticklabelsize = 0 ax_xticks = -10:10 ax_xticksize = 18 # y-axis ax_yautolimitmargin = (0, 0) ax_ygridwidth = 2 ax_yticklabelpad = 14 - ax_yticklabelsize = 36 + ax_yticklabelsize = 0 ax_yticks = -10:10 ax_yticksize = 18 @@ -40,6 +37,8 @@ attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) + # Game Parameters + attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] num_worlds = 3 prior_range_step = 0.01 prior_range_step_precision = 1 @@ -47,8 +46,29 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. save_file_name = "precomputed_r.txt" save_precision = 4 K = 100 - opacity = 0.5 + # Axis parameters + # borders + ax_aspect = 1 + ax_limits = (0, 1, 0, 1) + # title + ax_titlegap = 1 + ax_titlesize = 30 + # x-axis + ax_xautolimitmargin = (0, 0) + ax_xgridwidth = 2 + ax_xticklabelsize = 0 + ax_xticks = -10:10 + ax_xticksize = 18 + # y-axis + ax_yautolimitmargin = (0, 0) + ax_ygridwidth = 2 + ax_yticklabelpad = 14 + ax_yticklabelsize = 0 + ax_yticks = -10:10 + ax_yticksize = 18 + + opacity = 0.5 # Initialize plot fig = Figure() @@ -69,11 +89,11 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. yticklabelpad = ax_yticklabelpad, yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize ) - ax_east = Axis(fig[2,1], + ax_west = Axis(fig[2,1], # borders aspect = ax_aspect, limits = ax_limits, # title - title = "East", + title = "West", titlegap = ax_titlegap, titlesize = ax_titlesize, # x-axis xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, @@ -84,11 +104,11 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. yticklabelpad = ax_yticklabelpad, yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize ) - ax_west = Axis(fig[2,3], + ax_east = Axis(fig[2,3], # borders aspect = ax_aspect, limits = ax_limits, # title - title = "West", + title = "East", titlegap = ax_titlegap, titlesize = ax_titlesize, # x-axis xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, @@ -103,15 +123,22 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. ax_simplex = Axis3(fig[2,2], aspect = (1,1,1), limits = ((0.0, 1.0, 0.0, 1.0, 0.0, 1.1)), xreversed = true, - yreversed = true + yreversed = true, + xlabel = "", + ylabel = "", + zlabel = "", ) + hidedecorations!(ax_north) + hidedecorations!(ax_east) + hidedecorations!(ax_west) + # Create sliders sg = SliderGrid( fig[3, 2], - (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 1.0), - (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 1.0), - (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 1.0) + (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 1.0), # z + (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 1.0), # y + (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 1.0) # x ) observable_prior_sliders = [s.value for s in sg.sliders] @@ -124,16 +151,18 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. end @lift println("priors: ", $normalized_observable_p) + # p₁ : west, p₂ : east, p₃ : north p1, p2, p3 = [lift((x,i)->x[i], normalized_observable_p, idx) for idx in 1:num_worlds] - scatter!(ax_simplex, p1, p2, p3 ; markersize = 15, color = :red) + scatter!(ax_simplex, p3, p2, p1 ; markersize = 15, color = :red) # Solve for scout_allocation, r observable_r = on(normalized_observable_p) do x solve_r(x, attacker_preference) + #rand(3) end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] - function get_random_point_within_ball(; radius = 0.3, center = [0.5, 0.5], num_points = 1) + function get_random_point_within_ball(; radius = 0.3, center = [ax_limits[2]/2, ax_limits[2]/2], num_points = 1) # Check center is Tuple @assert length(center) == 2 "Center must be a 2-element vector [x, y]" x_coord, y_coord = center @@ -153,16 +182,16 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Check if scout_allocation results are normalized @lift println("Scout allocation: ", [$scout_north, $scout_east, $scout_west]) - @assert round(sum([scout_north.val, scout_east.val, scout_west.val])) ≈ 1 "Scout allocation is not normalized" + #@assert round(sum([scout_north.val, scout_east.val, scout_west.val])) ≈ 1 "Scout allocation is not normalized" # Display scout allocation as a text on the Figure - text_directions = [lift((x) -> "$(round(x, digits = 2)* K)", scout) for scout in [scout_north, scout_east, scout_west]] + text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) - Label(fig[2,1], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) - Label(fig[2,3], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) + Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) + Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) # Plot scout allocation - points = @lift [get_random_point_within_ball(; num_points = round(scout, digits = 2)* K) for scout in [$scout_north, $scout_east, $scout_west]] + points = @lift [get_random_point_within_ball(; radius = scout*0.5, num_points = 100) for scout in [$scout_north, $scout_east, $scout_west]] north_points, east_points, west_points = [lift((x, i) -> x[i], points, idx) for idx in 1:3] x_north, y_north = [lift((x, i) -> x[i], north_points, idx) for idx in 1:2] x_east, y_east = [lift((x, i) -> x[i], east_points, idx) for idx in 1:2] @@ -170,10 +199,11 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. scatter!(ax_north, x_north, y_north, markersize = 15, color = (:orange, opacity)) scatter!(ax_east, x_east, y_east, markersize = 15, color = (:pink, opacity+0.2)) scatter!(ax_west, x_west, y_west, markersize = 15, color = (:green, opacity)) - + # Plot Enemy + scatter!(ax_north, rand(10), rand(10), color = :red) - display(fig) + display(fig, fullscreen = true) end function compute_all_r_save_to_file() From 480b4610e29ab322b26427bda932677ca53cc99f Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:01:22 -0600 Subject: [PATCH 13/35] change spacing --- experiments/scout_visuals.jl | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 27046f2..2b627f2 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -48,27 +48,27 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. K = 100 # Axis parameters - # borders - ax_aspect = 1 - ax_limits = (0, 1, 0, 1) - # title - ax_titlegap = 1 - ax_titlesize = 30 - # x-axis - ax_xautolimitmargin = (0, 0) - ax_xgridwidth = 2 - ax_xticklabelsize = 0 - ax_xticks = -10:10 - ax_xticksize = 18 - # y-axis - ax_yautolimitmargin = (0, 0) - ax_ygridwidth = 2 - ax_yticklabelpad = 14 - ax_yticklabelsize = 0 - ax_yticks = -10:10 - ax_yticksize = 18 - - opacity = 0.5 + # borders + ax_aspect = 1 + ax_limits = (0, 1, 0, 1) + # title + ax_titlegap = 1 + ax_titlesize = 30 + # x-axis + ax_xautolimitmargin = (0, 0) + ax_xgridwidth = 2 + ax_xticklabelsize = 0 + ax_xticks = -10:10 + ax_xticksize = 18 + # y-axis + ax_yautolimitmargin = (0, 0) + ax_ygridwidth = 2 + ax_yticklabelpad = 14 + ax_yticklabelsize = 0 + ax_yticks = -10:10 + ax_yticksize = 18 + + opacity = 0.5 # Initialize plot fig = Figure() From 234638c952e7134cb4832f27278adf5d19b39dbc Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:44:13 -0600 Subject: [PATCH 14/35] removed numbers next to sliders --- experiments/scout_visuals.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 2b627f2..7fb58b2 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -136,9 +136,9 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Create sliders sg = SliderGrid( fig[3, 2], - (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 1.0), # z - (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 1.0), # y - (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 1.0) # x + (label = "prior_north", range = prior_range, format = x-> "", startvalue = 1.0), # z + (label = "prior_east", range = prior_range, format = x-> "", startvalue = 1.0), # y + (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0) # x ) observable_prior_sliders = [s.value for s in sg.sliders] @@ -192,7 +192,7 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Plot scout allocation points = @lift [get_random_point_within_ball(; radius = scout*0.5, num_points = 100) for scout in [$scout_north, $scout_east, $scout_west]] - north_points, east_points, west_points = [lift((x, i) -> x[i], points, idx) for idx in 1:3] + north_points, east_points, west_points = [lift((x, i) -> x[i], points, idx) for idx in 1:num_worlds] x_north, y_north = [lift((x, i) -> x[i], north_points, idx) for idx in 1:2] x_east, y_east = [lift((x, i) -> x[i], east_points, idx) for idx in 1:2] x_west, y_west = [lift((x, i) -> x[i], west_points, idx) for idx in 1:2] From f435fc709da5202e88eb40d3f7e53e5fac304b05 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Tue, 6 Feb 2024 17:00:42 -0600 Subject: [PATCH 15/35] added file saving (untested) and changing number of circles --- data.tmp | 1 + experiments/scout_visuals.jl | 90 +++++++++++++++++++++++------------- experiments/tower_defense.jl | 11 +++-- 3 files changed, 68 insertions(+), 34 deletions(-) create mode 100644 data.tmp diff --git a/data.tmp b/data.tmp new file mode 100644 index 0000000..516e366 --- /dev/null +++ b/data.tmp @@ -0,0 +1 @@ +{"[0.01, 0.01, 0.01]":[0.3,0.3,0.3]} \ No newline at end of file diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 7fb58b2..5e863e8 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -35,17 +35,24 @@ Makie.inline!(false) 2. Solve for all different combinations and store them in a "look-up dictionary" so that you dont have to solve the game all the time """ -function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) +function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], use_file=false) + + save_file = nothing + if use_file + save_file = JSON3.read(open("data.tmp", "r"), Dict{Vector{Float64}, Vector{Float64}}) + println("read file") + end # Game Parameters - attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] - num_worlds = 3 - prior_range_step = 0.01 - prior_range_step_precision = 1 - prior_range = 0.01:prior_range_step:1 - save_file_name = "precomputed_r.txt" - save_precision = 4 - K = 100 + attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] + num_worlds = 3 + prior_range_step = 0.01 + prior_range_step_precision = 1 + prior_range = 0.01:prior_range_step:1 + save_file_name = "precomputed_r.txt" + save_precision = 4 + K = 100 + num_unit_scaling_factor = 20 # Axis parameters # borders @@ -157,8 +164,11 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Solve for scout_allocation, r observable_r = on(normalized_observable_p) do x - solve_r(x, attacker_preference) - #rand(3) + if use_file + save_file[x] + else + solve_r(x, attacker_preference) + end end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] @@ -186,35 +196,53 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Display scout allocation as a text on the Figure text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] - Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) - Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) - Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) # Plot scout allocation - points = @lift [get_random_point_within_ball(; radius = scout*0.5, num_points = 100) for scout in [$scout_north, $scout_east, $scout_west]] - north_points, east_points, west_points = [lift((x, i) -> x[i], points, idx) for idx in 1:num_worlds] - x_north, y_north = [lift((x, i) -> x[i], north_points, idx) for idx in 1:2] - x_east, y_east = [lift((x, i) -> x[i], east_points, idx) for idx in 1:2] - x_west, y_west = [lift((x, i) -> x[i], west_points, idx) for idx in 1:2] - scatter!(ax_north, x_north, y_north, markersize = 15, color = (:orange, opacity)) - scatter!(ax_east, x_east, y_east, markersize = 15, color = (:pink, opacity+0.2)) - scatter!(ax_west, x_west, y_west, markersize = 15, color = (:green, opacity)) - - # Plot Enemy - scatter!(ax_north, rand(10), rand(10), color = :red) - + points = @lift [get_random_point_within_ball(; radius = scout*0.5, num_points = + round(Int, (num_unit_scaling_factor * scout) * (num_unit_scaling_factor * scout))) + for scout in [$scout_north, $scout_east, $scout_west]] + + enemies_x = rand(num_worlds * num_unit_scaling_factor) + enemies_y = rand(num_worlds * num_unit_scaling_factor) + on(points) do pt + #TODO: change enemy constants to be variable + north, east, west = [pt[idx] for idx in 1:num_worlds] + + Box(fig[1,2], color = :white, strokevisible = false) + scatter!(ax_north, north[1], north[2], markersize = 15, color = (:orange, opacity)) + scatter!(ax_north, enemies_x[1:20], enemies_y[1:20], color = :red) + Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) + + Box(fig[2,3], color = :white, strokevisible = false) + scatter!(ax_east, east[1], east[2], markersize = 15, color = (:pink, opacity + 0.2)) + scatter!(ax_east, enemies_x[21:40], enemies_y[21:40], color = :red) + Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) + + Box(fig[2,1], color = :white, strokevisible = false) + scatter!(ax_west, west[1], west[2], markersize = 15, color = (:green, opacity)) + scatter!(ax_west, enemies_x[41:60], enemies_y[41:60], color = :red) + Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) + end display(fig, fullscreen = true) end -function compute_all_r_save_to_file() +function demo_stage2() + +end + +function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1, + attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], + save_file_name = "data.tmp") + prior_range = round.(_prior_range, digits=1) # save_file = open(save_file_name, "w+") - hashmap = Dict{Tuple{Float64, Float64, Float64}, Tuple{Float64, Float64, Float64}}() + hashmap = Dict{Vector{Float64}, Vector{Float64}}() for prior_north in prior_range for prior_east in prior_range for prior_west in prior_range - current_prior = (prior_north, prior_east, prior_west) - r = solve_r(current_prior, attacker_preference) - hashmap[current_prior] = round.(r, digits = save_precision) + # print("calculating: ", [prior_north, prior_east, prior_west]) + current_prior = [prior_north, prior_east, prior_west] + r = solve_r(current_prior, attacker_preference, verbose = false) + hashmap[current_prior] = r end end end diff --git a/experiments/tower_defense.jl b/experiments/tower_defense.jl index 460e37f..07c8861 100644 --- a/experiments/tower_defense.jl +++ b/experiments/tower_defense.jl @@ -31,7 +31,8 @@ Inputs: Outputs: r: optimal scout allocation """ -function solve_r(ps, βs; r_init = [1/3, 1/3, 1/3], iter_limit=50, target_error=.00001, α=1, return_states = false) +function solve_r(ps, βs; r_init = [1/3, 1/3, 1/3], iter_limit=50, target_error=.00001, α=1, return_states = false, + verbose=true) @assert sum(r_init) ≈ 1.0 "Initial guess r must be a probability distribution" cur_iter = 0 n = length(ps) @@ -43,7 +44,9 @@ function solve_r(ps, βs; r_init = [1/3, 1/3, 1/3], iter_limit=50, target_error= end game, _ = build_stage_2(ps, βs) r = r_init - println("0: r = $r") + if verbose + println("0: r = $r") + end x = compute_stage_2(r, ps, βs, game) dKdr = zeros(Float64, n) while cur_iter < iter_limit # TODO: Break if change from last iteration is small @@ -61,7 +64,9 @@ function solve_r(ps, βs; r_init = [1/3, 1/3, 1/3], iter_limit=50, target_error= # compute stage 1 cost function for current r and x K = compute_K(r, x, ps, βs) # println("r_temp = $(round.(r_temp, digits=3)), dKdr = $(round.(dKdr, digits=3)) r = $(round.(r, digits=3)) K = $(round(K, digits=3))") - println("r = $(round.(r, digits=3))") + if verbose + println("r = $(round.(r, digits=3))") + end cur_iter += 1 end if return_states From 74d26db9ea16457151e3f6e1dba5ec87c8991ece Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 6 Feb 2024 21:34:10 -0600 Subject: [PATCH 16/35] Use Point2f in get_random_point_within_ball() --- experiments/scout_visuals.jl | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 7fb58b2..abedd55 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -158,7 +158,7 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Solve for scout_allocation, r observable_r = on(normalized_observable_p) do x solve_r(x, attacker_preference) - #rand(3) + trigger = true end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] @@ -173,16 +173,13 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Generate random distance within the specificed radius r = [radius * sqrt(rand()) for _ in 1:num_points] - # Calculate new x and y coordinates - x = x_coord .+ r .* cos.(angle) - y = y_coord .+ r .* sin.(angle) + # Calculate new x and y coordinates and create an array of Point2f objects - [x, y] + [Point2f(x_coord + r[i] * cos(angle[i]), y_coord + r[i] * sin(angle[i])) for i in 1:num_points] end # Check if scout_allocation results are normalized @lift println("Scout allocation: ", [$scout_north, $scout_east, $scout_west]) - #@assert round(sum([scout_north.val, scout_east.val, scout_west.val])) ≈ 1 "Scout allocation is not normalized" # Display scout allocation as a text on the Figure text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] @@ -191,15 +188,14 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) # Plot scout allocation - points = @lift [get_random_point_within_ball(; radius = scout*0.5, num_points = 100) for scout in [$scout_north, $scout_east, $scout_west]] - north_points, east_points, west_points = [lift((x, i) -> x[i], points, idx) for idx in 1:num_worlds] - x_north, y_north = [lift((x, i) -> x[i], north_points, idx) for idx in 1:2] - x_east, y_east = [lift((x, i) -> x[i], east_points, idx) for idx in 1:2] - x_west, y_west = [lift((x, i) -> x[i], west_points, idx) for idx in 1:2] - scatter!(ax_north, x_north, y_north, markersize = 15, color = (:orange, opacity)) - scatter!(ax_east, x_east, y_east, markersize = 15, color = (:pink, opacity+0.2)) - scatter!(ax_west, x_west, y_west, markersize = 15, color = (:green, opacity)) - + north_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_north) + east_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_east) + west_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_west) + scatter!(ax_north, north_points, markersize = 15, color = (:orange, opacity)) + scatter!(ax_east, east_points, markersize = 15, color = (:pink, opacity+0.2)) + scatter!(ax_west, west_points, markersize = 15, color = (:green, opacity)) + + # Plot Enemy scatter!(ax_north, rand(10), rand(10), color = :red) From 31982d62eb0795816394af4855f83c29074b1bd5 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 6 Feb 2024 21:40:57 -0600 Subject: [PATCH 17/35] display text_directions --- experiments/scout_visuals.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 8d6bc62..e6ea608 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -193,7 +193,10 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Display scout allocation as a text on the Figure text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] - + Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) + Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) + Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) + # Plot scout allocation north_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_north) east_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_east) From 6fe711089e3e4b0577f08c38942a3a928e38d53b Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Wed, 7 Feb 2024 10:21:23 -0600 Subject: [PATCH 18/35] data.tmp v1 --- data.tmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data.tmp b/data.tmp index 516e366..266fab8 100644 --- a/data.tmp +++ b/data.tmp @@ -1 +1 @@ -{"[0.01, 0.01, 0.01]":[0.3,0.3,0.3]} \ No newline at end of file +{"[0.6, 0.1, 0.6]":[1.0,0.0,0.0],"[0.4, 0.4, 0.9]":[0.5000000077505603,0.4999999922494396,0.0],"[0.5, 0.9, 0.3]":[1.0,0.0,0.0],"[0.2, 0.1, 0.3]":[1.0,0.0,0.0],"[0.8, 0.8, 0.8]":[0.33169342945663427,0.33541083897858137,0.3328957315647847],"[0.9, 0.0, 0.9]":[1.0,0.0,0.0],"[0.5, 0.5, 0.4]":[0.5000010169408886,0.4999989830591113,0.0],"[0.3, 0.2, 0.3]":[0.5000000006396236,0.0,0.4999999993603764],"[0.9, 0.4, 0.3]":[0.0,1.0,0.0],"[0.2, 0.6, 0.9]":[0.0,1.0,0.0],"[0.0, 0.5, 0.3]":[0.0,0.0,1.0],"[0.9, 0.7, 0.6]":[0.0,1.0,0.0],"[0.4, 0.9, 0.7]":[0.0,0.0,1.0],"[0.5, 0.6, 0.5]":[0.500000000000028,0.0,0.499999999999972],"[0.9, 0.8, 0.1]":[0.0,1.0,0.0],"[0.5, 0.3, 0.4]":[0.0,0.0,1.0],"[0.7, 0.7, 0.5]":[0.5019686180300313,0.49803138196996866,0.0],"[0.7, 0.8, 0.0]":[1.0,0.0,0.0],"[0.7, 0.0, 0.4]":[0.0,0.0,1.0],"[0.0, 0.3, 0.3]":[0.0,0.49999882569010157,0.5000011743098984],"[0.6, 0.8, 0.4]":[1.0,0.0,0.0],"[0.1, 0.2, 0.9]":[0.0,1.0,0.0],"[0.7, 0.9, 0.9]":[0.0,0.0,1.0],"[0.6, 0.6, 0.8]":[0.49999992129947635,0.5000000787005237,0.0],"[0.2, 0.2, 0.2]":[0.33333333333308035,0.33333333333184945,0.3333333333350703],"[0.6, 0.7, 0.0]":[1.0,0.0,0.0],"[0.4, 0.7, 0.8]":[0.0,1.0,0.0],"[0.9, 0.1, 0.6]":[0.0,0.0,1.0],"[0.1, 0.8, 0.3]":[0.0,0.0,1.0],"[0.8, 0.4, 0.4]":[0.0,0.500000180685116,0.499999819314884],"[0.3, 0.4, 0.5]":[0.0,1.0,0.0],"[0.6, 0.5, 0.5]":[0.0,0.4999999999998642,0.5000000000001358],"[0.7, 0.1, 0.5]":[0.0,0.0,1.0],"[0.0, 0.0, 0.7]":[0.2924750419847143,0.2924750419847143,0.41504991603057134],"[0.6, 0.1, 0.0]":[0.0,1.0,0.0],"[0.3, 0.8, 0.7]":[0.0,0.0,1.0],"[0.5, 0.2, 0.3]":[0.0,0.0,1.0],"[0.4, 0.1, 0.8]":[1.0,0.0,0.0],"[0.6, 0.3, 0.5]":[0.0,0.0,1.0],"[0.4, 0.0, 0.5]":[1.0,0.0,0.0],"[0.8, 0.5, 0.7]":[0.0,0.0,1.0],"[0.9, 0.8, 0.4]":[0.0,1.0,0.0],"[0.4, 0.2, 0.7]":[1.0,0.0,0.0],"[0.9, 0.6, 0.8]":[0.0,0.0,1.0],"[0.9, 0.7, 0.0]":[0.0,1.0,0.0],"[0.8, 0.3, 0.7]":[0.0,0.0,1.0],"[0.2, 0.4, 0.9]":[0.0,1.0,0.0],"[0.9, 0.5, 0.5]":[0.0,0.49990817332058657,0.5000918266794134],"[0.7, 0.2, 0.9]":[1.0,0.0,0.0],"[0.5, 0.4, 0.5]":[0.4999985389107886,0.0,0.5000014610892114],"[0.3, 0.9, 0.8]":[0.0,0.0,1.0],"[0.4, 0.9, 0.6]":[0.0,0.0,1.0],"[0.1, 0.6, 0.1]":[0.499999999999993,0.0,0.5000000000000071],"[0.0, 0.6, 0.2]":[0.0,0.0,1.0],"[0.7, 0.8, 0.3]":[1.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0],"[0.9, 0.3, 0.5]":[0.0,0.0,1.0],"[0.6, 0.9, 0.2]":[1.0,0.0,0.0],"[0.6, 0.4, 0.8]":[1.0,0.0,0.0],"[0.5, 0.8, 0.7]":[0.0,0.0,1.0],"[0.8, 0.8, 0.9]":[0.0,1.0,0.0],"[0.2, 0.9, 0.7]":[0.0,0.0,1.0],"[0.6, 0.7, 0.3]":[1.0,0.0,0.0],"[0.0, 0.0, 0.6]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.9, 0.5]":[1.0,0.0,0.0],"[0.1, 0.5, 0.2]":[0.0,0.0,1.0],"[0.2, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.8, 0.6]":[0.0,0.0,1.0],"[0.6, 0.1, 0.3]":[0.0,0.0,1.0],"[0.8, 0.7, 0.1]":[0.0,1.0,0.0],"[0.1, 0.3, 0.2]":[0.0,0.0,1.0],"[0.3, 0.0, 0.1]":[0.0,0.0,1.0],"[0.6, 0.6, 0.9]":[0.4994988515805705,0.5005011484194295,0.0],"[0.8, 0.5, 0.6]":[0.0,0.0,1.0],"[0.4, 0.7, 0.9]":[0.0,1.0,0.0],"[0.5, 0.9, 0.8]":[0.0,0.0,1.0],"[0.2, 0.1, 0.8]":[1.0,0.0,0.0],"[0.9, 0.9, 0.2]":[0.0,1.0,0.0],"[0.1, 0.6, 0.4]":[0.0,0.0,1.0],"[0.3, 0.2, 0.8]":[1.0,0.0,0.0],"[0.4, 0.2, 0.6]":[1.0,0.0,0.0],"[0.9, 0.4, 0.8]":[0.0,0.0,1.0],"[0.8, 0.1, 0.1]":[0.0,0.5,0.4999999999999999],"[0.7, 0.6, 0.1]":[0.0,1.0,0.0],"[0.4, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.7, 0.3]":[0.0,1.0,0.0],"[0.2, 0.0, 0.5]":[1.0,0.0,0.0],"[0.0, 0.5, 0.8]":[0.0,1.0,0.0],"[0.8, 0.3, 0.6]":[0.0,0.0,1.0],"[0.4, 0.1, 0.9]":[1.0,0.0,0.0],"[0.6, 0.2, 0.2]":[0.0,0.49999999999230316,0.5000000000076967],"[0.2, 0.2, 0.7]":[0.49999999684535534,0.5000000031546447,0.0],"[0.1, 0.4, 0.1]":[0.5,0.0,0.5000000000000001],"[0.0, 0.4, 0.2]":[0.0,0.0,1.0],"[0.0, 0.8, 0.5]":[0.0,0.0,1.0],"[0.9, 0.1, 0.3]":[0.0,0.0,1.0],"[0.0, 0.3, 0.8]":[0.0,1.0,0.0],"[0.8, 0.2, 0.5]":[0.0,0.0,1.0],"[0.4, 0.5, 0.1]":[1.0,0.0,0.0],"[0.8, 0.0, 0.2]":[0.0,0.0,1.0],"[0.7, 0.5, 0.2]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.5, 0.8, 0.6]":[0.0,0.0,1.0],"[0.2, 0.9, 0.6]":[0.0,0.0,1.0],"[0.9, 0.6, 0.9]":[1.0,0.0,0.0],"[0.1, 0.8, 0.8]":[0.0,0.0,1.0],"[0.5, 0.0, 0.1]":[0.0,0.0,1.0],"[0.8, 0.7, 0.4]":[0.0,1.0,0.0],"[0.3, 0.7, 0.5]":[0.0,0.0,1.0],"[0.3, 0.8, 0.0]":[1.0,0.0,0.0],"[0.3, 0.0, 0.4]":[1.0,0.0,0.0],"[0.4, 0.3, 0.1]":[0.0,1.0,0.0],"[0.7, 0.3, 0.2]":[0.0,1.0,0.0],"[0.3, 0.9, 0.9]":[0.0,1.0,0.0],"[0.8, 0.5, 0.0]":[0.0,1.0,0.0],"[0.5, 0.2, 0.8]":[1.0,0.0,0.0],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.4, 0.8, 0.2]":[1.0,0.0,0.0],"[0.9, 0.2, 0.2]":[0.0,0.49999999999999944,0.5000000000000006],"[0.8, 0.1, 0.4]":[0.0,0.0,1.0],"[0.3, 0.1, 0.5]":[1.0,0.0,0.0],"[0.7, 0.6, 0.4]":[0.0,1.0,0.0],"[0.4, 0.2, 0.0]":[0.0,1.0,0.0],"[0.6, 0.4, 0.9]":[1.0,0.0,0.0],"[0.8, 0.3, 0.0]":[0.0,1.0,0.0],"[0.1, 0.4, 0.4]":[0.0,0.5000054138479915,0.4999945861520084],"[0.7, 0.4, 0.1]":[0.0,1.0,0.0],"[0.0, 0.6, 0.7]":[0.0,1.0,0.0],"[0.4, 0.9, 0.3]":[1.0,0.0,0.0],"[0.4, 0.5, 0.4]":[0.525511614814011,0.0,0.4744883851859889],"[0.2, 0.7, 0.9]":[0.0,1.0,0.0],"[0.6, 0.9, 0.7]":[0.0,0.0,1.0],"[0.2, 0.2, 0.6]":[0.4999999999923366,0.5000000000076634,0.0],"[0.5, 0.7, 0.5]":[0.48818461446100414,0.0,0.5118153855389957],"[0.5, 0.8, 0.0]":[1.0,0.0,0.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.5, 0.0, 0.4]":[0.0,0.0,1.0],"[0.7, 0.8, 0.8]":[0.0,0.0,1.0],"[0.4, 0.6, 0.5]":[0.0,0.0,1.0],"[0.1, 0.5, 0.7]":[0.0,1.0,0.0],"[0.4, 0.3, 0.4]":[0.49999997951431263,0.0,0.5000000204856874],"[0.5, 0.9, 0.9]":[0.0,1.0,0.0],"[0.2, 0.1, 0.9]":[1.0,0.0,0.0],"[0.0, 0.0, 0.3]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.2, 0.9]":[1.0,0.0,0.0],"[0.9, 0.4, 0.9]":[0.0,0.0,1.0],"[0.5, 0.1, 0.5]":[0.5004627141978825,0.0,0.49953728580211754],"[0.0, 0.9, 0.4]":[0.0,0.0,1.0],"[0.0, 0.2, 0.1]":[0.0,0.0,1.0],"[0.0, 0.5, 0.9]":[0.0,1.0,0.0],"[0.3, 0.8, 0.3]":[0.5000000000004963,0.0,0.49999999999950373],"[0.2, 0.5, 0.1]":[1.0,0.0,0.0],"[0.1, 0.3, 0.7]":[0.0,1.0,0.0],"[0.6, 0.1, 0.8]":[1.0,0.0,0.0],"[0.8, 0.5, 0.3]":[0.0,1.0,0.0],"[0.0, 0.3, 0.9]":[0.0,1.0,0.0],"[0.9, 0.9, 0.7]":[1.0,0.0,0.0],"[0.7, 0.4, 0.4]":[0.0,0.5000010324180174,0.4999989675819826],"[0.2, 0.3, 0.1]":[1.0,0.0,0.0],"[0.6, 0.0, 0.5]":[0.0,0.0,1.0],"[0.4, 0.2, 0.3]":[0.0,0.0,1.0],"[0.1, 0.8, 0.9]":[0.0,1.0,0.0],"[0.8, 0.3, 0.3]":[0.0,0.49999999999999944,0.5000000000000004],"[0.6, 0.2, 0.7]":[1.0,0.0,0.0],"[0.2, 0.8, 0.2]":[0.49999999999999967,0.0,0.5000000000000003],"[0.0, 0.4, 0.7]":[0.0,1.0,0.0],"[0.9, 0.7, 0.8]":[0.0,0.0,1.0],"[0.0, 0.6, 0.6]":[0.0,1.0,0.0],"[0.1, 0.9, 0.5]":[0.0,0.0,1.0],"[0.2, 0.2, 0.0]":[0.49999999999999967,0.5000000000000002,0.0],"[0.5, 0.2, 0.9]":[1.0,0.0,0.0],"[0.8, 0.0, 0.7]":[0.0,0.0,1.0],"[0.7, 0.5, 0.7]":[0.49915287649094453,0.0,0.5008471235090552],"[0.6, 0.9, 0.6]":[0.5005013648897552,0.0,0.49949863511024484],"[0.1, 0.7, 0.1]":[0.4999999999999998,0.0,0.5000000000000002],"[0.5, 0.8, 0.3]":[1.0,0.0,0.0],"[0.0, 0.7, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.3]":[0.0,0.0,1.0],"[0.0, 0.2, 0.4]":[0.0,1.0,0.0],"[0.3, 0.6, 0.1]":[1.0,0.0,0.0],"[0.9, 0.1, 0.8]":[0.0,0.0,1.0],"[0.4, 0.4, 0.5]":[0.5255116166193949,0.47448838338060517,0.0],"[0.2, 0.5, 0.4]":[0.0,0.0,1.0],"[0.1, 0.5, 0.6]":[0.0,1.0,0.0],"[0.7, 0.3, 0.7]":[0.45129020446250856,0.0,0.5487097955374914],"[0.9, 0.0, 0.5]":[0.0,0.0,1.0],"[0.1, 0.1, 0.1]":[0.3333333333333334,0.3333333333333333,0.33333333333333337],"[0.0, 0.1, 0.2]":[0.0,1.0,0.0],"[0.4, 0.8, 0.7]":[0.0,0.0,1.0],"[0.2, 0.6, 0.5]":[0.0,0.0,1.0],"[0.9, 0.2, 0.7]":[0.0,0.0,1.0],"[0.2, 0.3, 0.4]":[0.0,1.0,0.0],"[0.1, 0.3, 0.6]":[0.0,1.0,0.0],"[0.3, 0.5, 0.2]":[1.0,0.0,0.0],"[0.7, 0.8, 0.9]":[0.0,1.0,0.0],"[0.9, 0.9, 0.6]":[0.0,1.0,0.0],"[0.1, 0.2, 0.5]":[0.0,1.0,0.0],"[0.8, 0.6, 0.2]":[0.0,1.0,0.0],"[0.1, 0.0, 0.2]":[1.0,0.0,0.0],"[0.7, 0.9, 0.5]":[1.0,0.0,0.0],"[0.3, 0.3, 0.2]":[0.5000000008141167,0.49999999918588334,0.0],"[0.0, 0.6, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.7, 0.9]":[0.0,1.0,0.0],"[0.6, 0.2, 0.6]":[0.47922117945743936,0.0,0.5207788205425606],"[0.5, 0.6, 0.1]":[1.0,0.0,0.0],"[0.6, 0.9, 0.0]":[1.0,0.0,0.0],"[0.1, 0.7, 0.4]":[0.0,0.0,1.0],"[0.0, 0.4, 0.6]":[0.0,1.0,0.0],"[0.4, 0.9, 0.8]":[0.0,0.0,1.0],"[0.7, 0.7, 0.1]":[1.0,0.0,0.0],"[0.3, 0.6, 0.4]":[0.0,0.0,1.0],"[0.2, 0.2, 0.3]":[0.4999902353156671,0.5000097646843329,0.0],"[0.6, 0.1, 0.9]":[1.0,0.0,0.0],"[0.8, 0.0, 0.6]":[0.0,0.0,1.0],"[0.7, 0.5, 0.6]":[0.0,0.0,1.0],"[0.1, 0.5, 0.0]":[1.0,0.0,0.0],"[0.1, 0.1, 0.4]":[0.5000000000000002,0.4999999999999998,0.0],"[0.3, 0.4, 0.1]":[1.0,0.0,0.0],"[0.6, 0.5, 0.1]":[0.0,1.0,0.0],"[0.7, 0.1, 0.1]":[0.0,0.4999999999999931,0.5000000000000069],"[0.5, 0.5, 0.2]":[0.4999533720258884,0.5000466279741116,0.0],"[0.0, 0.0, 0.8]":[0.30001451754304154,0.30001451754304154,0.39997096491391704],"[0.7, 0.3, 0.6]":[0.0,0.0,1.0],"[0.1, 0.3, 0.0]":[1.0,0.0,0.0],"[0.9, 0.7, 0.9]":[1.0,0.0,0.0],"[0.3, 0.8, 0.8]":[0.0,0.0,1.0],"[0.4, 0.8, 0.6]":[0.0,0.0,1.0],"[0.2, 0.4, 0.5]":[0.0,1.0,0.0],"[0.6, 0.3, 0.1]":[0.0,1.0,0.0],"[0.5, 0.3, 0.2]":[0.0,1.0,0.0],"[0.9, 0.2, 0.6]":[0.0,0.0,1.0],"[0.9, 0.9, 0.0]":[0.0,1.0,0.0],"[0.4, 0.0, 0.1]":[0.0,0.0,1.0],"[0.7, 0.2, 0.5]":[0.0,0.0,1.0],"[0.7, 0.0, 0.2]":[0.0,0.0,1.0],"[0.8, 0.5, 0.8]":[1.0,0.0,0.0],"[0.6, 0.8, 0.2]":[1.0,0.0,0.0],"[0.9, 0.1, 0.9]":[1.0,0.0,0.0],"[0.2, 0.8, 0.7]":[0.0,0.0,1.0],"[0.5, 0.6, 0.4]":[1.0,0.0,0.0],"[0.6, 0.2, 0.0]":[0.0,1.0,0.0],"[0.7, 0.7, 0.4]":[0.4992843517430079,0.500715648256992,0.0],"[0.4, 0.2, 0.8]":[1.0,0.0,0.0],"[0.8, 0.4, 0.2]":[0.0,1.0,0.0],"[0.0, 0.4, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.8, 0.5]":[1.0,0.0,0.0],"[0.0, 0.6, 0.3]":[0.0,0.0,1.0],"[0.8, 0.3, 0.8]":[0.0,0.0,1.0],"[0.9, 0.5, 0.1]":[0.0,1.0,0.0],"[0.8, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.5, 0.4, 0.1]":[0.0,1.0,0.0],"[0.7, 0.5, 0.0]":[0.0,1.0,0.0],"[0.6, 0.9, 0.3]":[1.0,0.0,0.0],"[0.0, 0.7, 0.7]":[0.0,0.0,1.0],"[0.3, 0.4, 0.4]":[0.0,0.5000000160599674,0.49999998394003264],"[0.6, 0.5, 0.4]":[0.0,1.0,0.0],"[0.7, 0.1, 0.4]":[0.0,0.0,1.0],"[0.9, 0.3, 0.1]":[0.0,1.0,0.0],"[0.1, 0.5, 0.3]":[0.0,0.0,1.0],"[0.7, 0.3, 0.0]":[0.0,1.0,0.0],"[0.5, 0.8, 0.8]":[0.0,0.0,1.0],"[0.2, 0.9, 0.8]":[0.0,0.0,1.0],"[0.6, 0.6, 0.5]":[0.4997338610506261,0.5002661389493739,0.0],"[0.9, 0.8, 0.2]":[0.0,1.0,0.0],"[0.0, 0.1, 0.7]":[0.0,1.0,0.0],"[0.6, 0.3, 0.4]":[0.0,0.0,1.0],"[0.8, 0.9, 0.1]":[1.0,0.0,0.0],"[0.4, 0.7, 0.5]":[0.0,0.0,1.0],"[0.4, 0.8, 0.0]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.4, 0.0, 0.4]":[0.49967103916341193,0.0,0.5003289608365882],"[0.3, 0.5, 0.7]":[0.0,1.0,0.0],"[0.1, 0.3, 0.3]":[0.0,0.5000000157945836,0.49999998420541647],"[0.4, 0.9, 0.9]":[0.0,1.0,0.0],"[0.4, 0.1, 0.5]":[1.0,0.0,0.0],"[0.8, 0.6, 0.7]":[0.0,0.0,1.0],"[0.1, 0.0, 0.7]":[1.0,0.0,0.0],"[0.9, 0.9, 0.3]":[0.0,1.0,0.0],"[0.3, 0.3, 0.7]":[0.49999998057494255,0.5000000194250575,0.0],"[0.9, 0.5, 0.4]":[0.0,1.0,0.0],"[0.5, 0.4, 0.4]":[0.0,0.5255116158680251,0.4744883841319749],"[0.2, 0.8, 0.6]":[0.0,0.0,1.0],"[0.6, 0.2, 0.3]":[0.0,0.0,1.0],"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.2, 0.0, 0.1]":[0.0,0.0,1.0],"[0.0, 0.4, 0.3]":[0.0,0.0,1.0],"[0.9, 0.6, 0.5]":[0.0,1.0,0.0],"[0.9, 0.3, 0.4]":[0.0,0.0,1.0],"[0.3, 0.8, 0.9]":[0.0,1.0,0.0],"[0.8, 0.0, 0.3]":[0.0,0.0,1.0],"[0.7, 0.5, 0.3]":[0.0,1.0,0.0],"[0.2, 0.2, 0.8]":[0.5000000000000006,0.49999999999999944,0.0],"[0.0, 0.7, 0.6]":[0.0,0.0,1.0],"[0.0, 0.8, 0.1]":[0.0,0.0,1.0],"[0.8, 0.9, 0.4]":[1.0,0.0,0.0],"[0.3, 0.9, 0.5]":[0.0,0.0,1.0],"[0.5, 0.5, 0.7]":[0.5118154575601646,0.48818454243983567,0.0],"[0.8, 0.2, 0.1]":[0.0,1.0,0.0],"[0.8, 0.5, 0.9]":[1.0,0.0,0.0],"[0.7, 0.3, 0.3]":[0.0,0.5000000194235866,0.49999998057641337],"[0.4, 0.2, 0.9]":[1.0,0.0,0.0],"[0.6, 0.4, 0.5]":[0.0,0.0,1.0],"[0.3, 0.7, 0.1]":[1.0,0.0,0.0],"[0.0, 0.1, 0.6]":[0.0,1.0,0.0],"[0.1, 0.6, 0.2]":[0.0,0.0,1.0],"[0.5, 0.3, 0.7]":[1.0,0.0,0.0],"[0.8, 0.3, 0.9]":[1.0,0.0,0.0],"[0.4, 0.8, 0.3]":[1.0,0.0,0.0],"[0.9, 0.2, 0.3]":[0.0,0.0,1.0],"[0.3, 0.5, 0.6]":[0.0,1.0,0.0],"[0.7, 0.0, 0.7]":[0.0,0.0,1.0],"[0.6, 0.8, 0.7]":[0.0,0.0,1.0],"[0.2, 0.7, 0.5]":[0.0,0.0,1.0],"[0.2, 0.8, 0.0]":[1.0,0.0,0.0],"[0.3, 0.1, 0.1]":[0.0,0.5000000000003715,0.49999999999962863],"[0.8, 0.4, 0.7]":[0.0,0.0,1.0],"[0.2, 0.0, 0.4]":[1.0,0.0,0.0],"[0.8, 0.6, 0.6]":[0.0,0.5000003394252299,0.4999996605747701],"[0.1, 0.0, 0.6]":[1.0,0.0,0.0],"[0.3, 0.3, 0.6]":[0.49977501833596605,0.500224981664034,0.0],"[0.5, 0.8, 0.9]":[0.0,1.0,0.0],"[0.2, 0.9, 0.9]":[0.0,0.0,1.0],"[0.5, 0.9, 0.5]":[0.49990816607341304,0.0,0.500091833926587],"[0.0, 0.8, 0.4]":[0.0,0.0,1.0],"[0.2, 0.1, 0.5]":[1.0,0.0,0.0],"[0.8, 0.7, 0.2]":[0.0,1.0,0.0],"[0.0, 0.6, 0.8]":[0.0,1.0,0.0],"[0.0, 0.7, 0.0]":[0.3000481869141004,0.39990362617179914,0.3000481869141004],"[0.8, 0.2, 0.4]":[0.0,0.0,1.0],"[0.3, 0.2, 0.5]":[1.0,0.0,0.0],"[0.9, 0.4, 0.5]":[0.0,0.0,1.0],"[0.3, 0.0, 0.2]":[0.0,0.0,1.0],"[0.0, 0.5, 0.5]":[0.0,0.544461608176789,0.455538391823211],"[0.6, 0.9, 0.8]":[0.0,0.0,1.0],"[0.5, 0.7, 0.1]":[1.0,0.0,0.0],"[0.3, 0.7, 0.4]":[0.0,0.0,1.0],"[0.9, 0.8, 0.7]":[0.0,1.0,0.0],"[0.4, 0.6, 0.1]":[1.0,0.0,0.0],"[0.5, 0.5, 0.6]":[0.4999999999999254,0.5000000000000747,0.0],"[0.8, 0.1, 0.2]":[0.0,0.0,1.0],"[0.7, 0.6, 0.2]":[0.0,1.0,0.0],"[0.0, 0.1, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.5, 0.8]":[0.0,1.0,0.0],"[0.0, 0.3, 0.5]":[0.0,1.0,0.0],"[0.3, 0.5, 0.0]":[1.0,0.0,0.0],"[0.5, 0.1, 0.1]":[0.0,0.5000000000000002,0.4999999999999998],"[0.1, 0.4, 0.2]":[0.0,0.0,1.0],"[0.3, 0.1, 0.4]":[1.0,0.0,0.0],"[0.5, 0.3, 0.6]":[1.0,0.0,0.0],"[0.1, 0.8, 0.5]":[0.0,0.0,1.0],"[0.1, 0.3, 0.8]":[0.0,1.0,0.0],"[0.7, 0.0, 0.6]":[0.0,0.0,1.0],"[0.4, 0.5, 0.2]":[1.0,0.0,0.0],"[0.8, 0.6, 0.0]":[0.0,1.0,0.0],"[0.1, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.3, 0.3, 0.0]":[0.4999996330701194,0.5000003669298807,0.0],"[0.2, 0.2, 0.9]":[0.49999999999999956,0.5000000000000004,0.0],"[0.6, 0.8, 0.6]":[0.5000000159064093,0.0,0.4999999840935909],"[0.5, 0.2, 0.5]":[0.5000438751874834,0.0,0.4999561248125166],"[0.2, 0.8, 0.3]":[0.0,0.0,1.0],"[0.6, 0.0, 0.1]":[0.0,0.0,1.0],"[0.5, 0.0, 0.2]":[0.0,0.0,1.0],"[0.8, 0.4, 0.6]":[0.0,0.0,1.0],"[0.9, 0.9, 0.8]":[0.0,1.0,0.0],"[0.4, 0.3, 0.2]":[0.0,1.0,0.0],"[0.5, 0.7, 0.4]":[1.0,0.0,0.0],"[0.6, 0.2, 0.8]":[1.0,0.0,0.0],"[0.1, 0.9, 0.1]":[0.5,0.0,0.5],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.0, 0.4, 0.8]":[0.0,1.0,0.0],"[0.4, 0.6, 0.4]":[0.5000013004714524,0.0,0.4999986995285476],"[0.0, 0.7, 0.3]":[0.0,0.0,1.0],"[0.5, 0.5, 0.0]":[0.38602213002540053,0.6139778699745995,0.0],"[0.8, 0.0, 0.8]":[1.0,0.0,0.0],"[0.7, 0.5, 0.8]":[1.0,0.0,0.0],"[0.5, 0.1, 0.4]":[0.0,0.0,1.0],"[0.9, 0.8, 0.6]":[0.0,1.0,0.0],"[0.4, 0.4, 0.1]":[0.49998961436166756,0.5000103856383324,0.0],"[0.1, 0.6, 0.7]":[0.0,1.0,0.0],"[0.7, 0.4, 0.2]":[0.0,1.0,0.0],"[0.0, 0.1, 0.3]":[0.0,1.0,0.0],"[0.7, 0.8, 0.5]":[1.0,0.0,0.0],"[0.5, 0.3, 0.0]":[0.0,1.0,0.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[0.7, 0.3, 0.8]":[1.0,0.0,0.0],"[0.3, 0.5, 0.3]":[0.5000012339347999,0.0,0.4999987660652002],"[0.7, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.6, 0.9]":[0.0,1.0,0.0],"[0.6, 0.7, 0.5]":[1.0,0.0,0.0],"[0.6, 0.8, 0.0]":[1.0,0.0,0.0],"[0.2, 0.6, 0.1]":[1.0,0.0,0.0],"[0.4, 0.8, 0.8]":[0.0,0.8885595996419731,0.11144040035802694],"[0.6, 0.0, 0.4]":[0.0,0.0,1.0],"[0.9, 0.2, 0.8]":[0.0,0.0,1.0],"[0.6, 0.9, 0.9]":[0.0,0.0,1.0],"[0.8, 0.4, 0.0]":[0.0,1.0,0.0],"[0.8, 0.6, 0.3]":[0.0,1.0,0.0],"[0.1, 0.0, 0.3]":[1.0,0.0,0.0],"[0.3, 0.3, 0.3]":[0.33333333340668475,0.33333333324390607,0.33333333334940923],"[0.6, 0.1, 0.5]":[0.0,0.0,1.0],"[0.1, 0.9, 0.4]":[0.0,0.0,1.0],"[0.1, 0.2, 0.1]":[0.5000002427577386,0.0,0.4999997572422614],"[0.0, 0.2, 0.2]":[0.0,0.4999999995779131,0.5000000004220869],"[0.1, 0.5, 0.9]":[0.0,1.0,0.0],"[0.7, 0.9, 0.1]":[1.0,0.0,0.0],"[0.8, 0.7, 0.7]":[0.0,1.0,0.0],"[0.2, 0.5, 0.2]":[0.5000066303213249,0.0,0.49999336967867514],"[0.3, 0.0, 0.7]":[1.0,0.0,0.0],"[0.1, 0.3, 0.9]":[0.0,1.0,0.0],"[0.4, 0.4, 0.4]":[0.33333332827294304,0.33333333623744255,0.3333333354896144],"[0.2, 0.3, 0.2]":[0.5000097646839672,0.0,0.4999902353160328],"[0.8, 0.1, 0.7]":[0.0,0.0,1.0],"[0.7, 0.6, 0.7]":[0.46944641094303496,0.0,0.530553589056965],"[0.9, 0.7, 0.5]":[0.0,1.0,0.0],"[0.9, 0.8, 0.0]":[0.0,1.0,0.0],"[0.5, 0.5, 0.3]":[0.4999990599094176,0.5000009400905823,0.0],"[0.9, 0.0, 0.4]":[0.0,0.0,1.0],"[0.9, 0.9, 0.9]":[0.28924749591705357,0.37907426662590604,0.33167823745704084],"[0.1, 0.4, 0.7]":[0.0,1.0,0.0],"[0.2, 0.6, 0.4]":[0.0,0.0,1.0],"[0.1, 0.6, 0.6]":[0.0,1.0,0.0],"[0.9, 0.1, 0.5]":[0.0,0.0,1.0],"[0.5, 0.3, 0.3]":[0.0,0.49999876604950166,0.5000012339504983],"[0.6, 0.2, 0.9]":[1.0,0.0,0.0],"[0.4, 0.5, 0.7]":[0.0,1.0,0.0],"[0.0, 0.4, 0.9]":[0.0,1.0,0.0],"[0.7, 0.0, 0.3]":[0.0,0.0,1.0],"[0.2, 0.4, 0.1]":[1.0,0.0,0.0],"[0.6, 0.8, 0.3]":[1.0,0.0,0.0],"[0.1, 0.7, 0.2]":[0.0,0.0,1.0],"[0.1, 0.2, 0.4]":[0.0,1.0,0.0],"[0.3, 0.6, 0.2]":[1.0,0.0,0.0],"[0.5, 0.0, 0.7]":[1.0,0.0,0.0],"[0.7, 0.9, 0.4]":[1.0,0.0,0.0],"[0.8, 0.0, 0.9]":[1.0,0.0,0.0],"[0.7, 0.2, 0.1]":[0.0,1.0,0.0],"[0.7, 0.5, 0.9]":[1.0,0.0,0.0],"[0.8, 0.4, 0.3]":[0.0,1.0,0.0],"[0.4, 0.3, 0.7]":[1.0,0.0,0.0],"[0.2, 0.8, 0.8]":[0.0,1.0,0.0],"[0.1, 0.1, 0.2]":[0.500000242757725,0.49999975724227497,0.0],"[0.0, 0.9, 0.7]":[0.0,0.0,1.0],"[0.8, 0.7, 0.6]":[0.0,1.0,0.0],"[0.8, 0.8, 0.1]":[1.0,0.0,0.0],"[0.7, 0.3, 0.9]":[1.0,0.0,0.0],"[0.3, 0.0, 0.6]":[1.0,0.0,0.0],"[0.4, 0.8, 0.9]":[0.0,1.0,0.0],"[0.9, 0.2, 0.9]":[1.0,0.0,0.0],"[0.0, 0.7, 0.8]":[0.0,1.0,0.0],"[0.7, 0.4, 0.7]":[0.4791085464336984,0.0,0.5208914535663016],"[0.8, 0.1, 0.6]":[0.0,0.0,1.0],"[0.7, 0.6, 0.6]":[0.0,0.5071850249899206,0.4928149750100794],"[0.4, 0.9, 0.5]":[0.0,0.0,1.0],"[0.9, 0.8, 0.3]":[0.0,1.0,0.0],"[0.1, 0.6, 0.0]":[1.0,0.0,0.0],"[0.6, 0.6, 0.1]":[1.0,0.0,0.0],"[0.2, 0.4, 0.4]":[0.0,0.4999999648586688,0.5000000351413313],"[0.5, 0.6, 0.2]":[1.0,0.0,0.0],"[0.1, 0.4, 0.6]":[0.0,1.0,0.0],"[0.4, 0.7, 0.1]":[1.0,0.0,0.0],"[0.0, 0.1, 0.8]":[0.0,1.0,0.0],"[0.7, 0.7, 0.2]":[1.0,0.0,0.0],"[0.7, 0.2, 0.4]":[0.0,0.0,1.0],"[0.3, 0.5, 0.8]":[0.0,1.0,0.0],"[0.4, 0.5, 0.6]":[0.0,1.0,0.0],"[0.0, 0.0, 0.5]":[0.3333262234652497,0.3333262234652497,0.3333475530695007],"[0.3, 0.4, 0.2]":[1.0,0.0,0.0],"[0.4, 0.1, 0.1]":[0.0,0.4999999999999999,0.5000000000000002],"[0.0, 0.2, 0.7]":[0.0,1.0,0.0],"[0.5, 0.0, 0.6]":[1.0,0.0,0.0],"[0.6, 0.5, 0.2]":[0.0,1.0,0.0],"[0.3, 0.8, 0.5]":[0.0,0.0,1.0],"[0.7, 0.1, 0.2]":[0.0,0.0,1.0],"[0.8, 0.8, 0.4]":[1.0,0.0,0.0],"[0.8, 0.6, 0.8]":[0.0,0.0,1.0],"[0.2, 0.5, 0.7]":[0.0,1.0,0.0],"[0.1, 0.0, 0.8]":[1.0,0.0,0.0],"[0.8, 0.7, 0.0]":[0.0,1.0,0.0],"[0.3, 0.3, 0.8]":[0.49999999999999944,0.5000000000000006,0.0],"[0.4, 0.3, 0.6]":[1.0,0.0,0.0],"[0.3, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.5, 0.5]":[0.0,0.5004560941487721,0.4995439058512281],"[0.0, 0.9, 0.6]":[0.0,0.0,1.0],"[0.6, 0.3, 0.2]":[0.0,1.0,0.0],"[0.9, 0.6, 0.1]":[0.0,1.0,0.0],"[0.2, 0.3, 0.7]":[0.0,1.0,0.0],"[0.4, 0.2, 0.5]":[1.0,0.0,0.0],"[0.4, 0.0, 0.2]":[0.0,0.0,1.0],"[0.8, 0.1, 0.0]":[0.0,1.0,0.0],"[0.7, 0.6, 0.0]":[0.0,1.0,0.0],"[0.8, 0.3, 0.5]":[0.0,0.0,1.0],"[0.6, 0.6, 0.4]":[0.5001308373863612,0.4998691626136389,0.0],"[0.3, 0.9, 0.1]":[1.0,0.0,0.0],"[0.4, 0.7, 0.4]":[0.5000010322604801,0.0,0.49999896773952],"[0.7, 0.4, 0.6]":[0.0,0.0,1.0],"[0.1, 0.4, 0.0]":[1.0,0.0,0.0],"[0.5, 0.5, 0.8]":[0.49954388457016474,0.5004561154298353,0.0],"[0.1, 0.6, 0.3]":[0.0,0.0,1.0],"[0.2, 0.8, 0.9]":[0.0,1.0,0.0],"[0.9, 0.5, 0.2]":[0.0,1.0,0.0],"[0.4, 0.5, 0.0]":[1.0,0.0,0.0],"[0.6, 0.4, 0.1]":[0.0,1.0,0.0],"[0.5, 0.4, 0.2]":[0.0,1.0,0.0],"[0.5, 0.8, 0.5]":[0.5004560693003455,0.0,0.49954393069965475],"[0.1, 0.7, 0.7]":[0.0,1.0,0.0],"[0.2, 0.9, 0.5]":[0.0,0.0,1.0],"[0.4, 0.1, 0.4]":[0.49999528746039235,0.0,0.5000047125396077],"[0.3, 0.6, 0.7]":[0.0,1.0,0.0],"[0.5, 0.3, 0.8]":[1.0,0.0,0.0],"[0.5, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.3, 0.2]":[0.0,1.0,0.0],"[0.7, 0.0, 0.8]":[1.0,0.0,0.0],"[0.4, 0.3, 0.0]":[0.0,1.0,0.0],"[0.0, 0.7, 0.9]":[0.0,1.0,0.0],"[0.6, 0.8, 0.8]":[0.0,1.0,0.0],"[0.2, 0.7, 0.1]":[1.0,0.0,0.0],"[0.1, 0.1, 0.7]":[0.5000000000000001,0.4999999999999998,0.0],"[0.0, 0.2, 0.6]":[0.0,1.0,0.0],"[0.8, 0.9, 0.2]":[1.0,0.0,0.0],"[0.8, 0.4, 0.8]":[0.1641984301674213,0.0,0.8358015698325787],"[0.9, 0.6, 0.4]":[0.0,1.0,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.2, 0.5, 0.6]":[0.0,1.0,0.0],"[0.8, 0.7, 0.3]":[0.0,1.0,0.0],"[0.3, 0.0, 0.3]":[0.49999954307919015,0.0,0.5000004569208099],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.5, 0.9, 0.1]":[1.0,0.0,0.0],"[0.2, 0.1, 0.1]":[0.0,0.5000002427577411,0.499999757242259],"[0.3, 0.9, 0.4]":[0.0,0.0,1.0],"[0.3, 0.2, 0.1]":[0.0,1.0,0.0],"[0.9, 0.4, 0.1]":[0.0,1.0,0.0],"[0.3, 0.5, 0.9]":[0.0,1.0,0.0],"[0.2, 0.3, 0.6]":[0.0,1.0,0.0],"[0.7, 0.4, 0.0]":[0.0,1.0,0.0],"[0.8, 0.1, 0.3]":[0.0,0.0,1.0],"[0.0, 0.5, 0.1]":[0.0,0.0,1.0],"[0.7, 0.6, 0.3]":[0.0,1.0,0.0],"[0.6, 0.4, 0.4]":[0.0,0.5000013005099216,0.49999869949007836],"[0.5, 0.6, 0.7]":[0.0,1.0,0.0],"[0.8, 0.6, 0.9]":[1.0,0.0,0.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.3, 0.3, 0.9]":[0.4999999999549326,0.5000000000450673,0.0],"[0.9, 0.8, 0.8]":[0.0,1.0,0.0],"[0.2, 0.2, 0.5]":[0.4999933694943416,0.5000066305056584,0.0],"[0.7, 0.7, 0.7]":[0.3334424235510388,0.33327591400118484,0.33328166244777624],"[0.1, 0.4, 0.3]":[0.0,0.0,1.0],"[0.2, 0.0, 0.2]":[0.5000000010175979,0.0,0.4999999989824021],"[0.0, 0.3, 0.1]":[0.0,0.0,1.0],"[0.4, 0.5, 0.3]":[1.0,0.0,0.0],"[0.2, 0.7, 0.4]":[0.0,0.0,1.0],"[0.1, 0.7, 0.6]":[0.0,0.0,1.0],"[0.1, 0.8, 0.1]":[0.5,0.0,0.5000000000000001],"[0.0, 0.8, 0.2]":[0.0,0.0,1.0],"[0.3, 0.4, 0.7]":[0.0,1.0,0.0],"[0.3, 0.6, 0.6]":[0.0,0.49916812373343866,0.5008318762665613],"[0.6, 0.5, 0.7]":[1.0,0.0,0.0],"[0.7, 0.1, 0.7]":[0.0,0.0,1.0],"[0.8, 0.2, 0.2]":[0.0,0.5000000000000001,0.4999999999999999],"[0.0, 0.2, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.5, 0.0, 0.3]":[0.0,0.0,1.0],"[0.2, 0.5, 0.0]":[1.0,0.0,0.0],"[0.4, 0.3, 0.3]":[0.0,0.5003185575639222,0.4996814424360778],"[0.5, 0.9, 0.4]":[1.0,0.0,0.0],"[0.5, 0.2, 0.1]":[0.0,1.0,0.0],"[0.5, 0.5, 0.9]":[0.5000918182977969,0.4999081817022031,0.0],"[0.2, 0.1, 0.4]":[1.0,0.0,0.0],"[0.1, 0.1, 0.6]":[0.5000000000000001,0.4999999999999998,0.0],"[0.3, 0.7, 0.2]":[1.0,0.0,0.0],"[0.3, 0.2, 0.4]":[1.0,0.0,0.0],"[0.6, 0.3, 0.7]":[1.0,0.0,0.0],"[0.9, 0.4, 0.4]":[0.0,0.4999999849441542,0.5000000150558458],"[0.0, 0.9, 0.3]":[0.0,0.0,1.0],"[0.4, 0.0, 0.7]":[1.0,0.0,0.0],"[0.2, 0.3, 0.0]":[1.0,0.0,0.0],"[0.0, 0.5, 0.4]":[0.0,0.0,1.0],"[0.5, 0.3, 0.9]":[1.0,0.0,0.0],"[0.3, 0.1, 0.2]":[0.0,0.0,1.0],"[0.7, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.6, 0.5]":[0.0,0.0,1.0],"[0.6, 0.8, 0.9]":[0.0,1.0,0.0],"[0.0, 0.3, 0.4]":[0.0,1.0,0.0],"[0.7, 0.4, 0.3]":[0.0,1.0,0.0],"[0.9, 0.5, 0.7]":[0.0,0.0,1.0],"[0.5, 0.4, 0.7]":[1.0,0.0,0.0],"[0.8, 0.4, 0.9]":[1.0,0.0,0.0],"[0.5, 0.6, 0.6]":[0.0,0.5002096772921747,0.4997903227078253],"[0.6, 0.9, 0.5]":[1.0,0.0,0.0],"[0.1, 0.8, 0.4]":[0.0,0.0,1.0],"[0.7, 0.7, 0.6]":[0.5301478150665142,0.4698521849334858,0.0],"[0.1, 0.6, 0.8]":[0.0,1.0,0.0],"[0.7, 0.8, 0.1]":[1.0,0.0,0.0],"[0.1, 0.7, 0.0]":[1.0,0.0,0.0],"[0.3, 0.6, 0.0]":[1.0,0.0,0.0],"[0.9, 0.3, 0.7]":[0.0,0.0,1.0],"[0.1, 0.5, 0.5]":[0.0,0.5000000000000003,0.49999999999999956],"[0.6, 0.7, 0.1]":[1.0,0.0,0.0],"[0.5, 0.7, 0.2]":[1.0,0.0,0.0],"[0.5, 0.2, 0.4]":[0.0,0.0,1.0],"[0.3, 0.4, 0.6]":[0.0,1.0,0.0],"[0.6, 0.5, 0.6]":[0.5002624544244229,0.0,0.49973754557557715],"[0.7, 0.1, 0.6]":[0.0,0.0,1.0],"[0.4, 0.6, 0.2]":[1.0,0.0,0.0],"[0.8, 0.9, 0.7]":[1.0,0.0,0.0],"[0.1, 0.1, 0.0]":[0.49999999999958555,0.5000000000004143,0.0],"[0.0, 0.2, 0.3]":[0.0,1.0,0.0],"[0.1, 0.3, 0.5]":[0.0,1.0,0.0],"[0.2, 0.5, 0.3]":[0.0,0.0,1.0],"[0.6, 0.1, 0.1]":[0.0,0.5000000000000001,0.5],"[0.9, 0.8, 0.9]":[0.0,0.0,1.0],"[0.5, 0.1, 0.2]":[0.0,0.0,1.0],"[0.6, 0.3, 0.6]":[0.49776516332002685,0.0,0.5022348366799732],"[0.8, 0.7, 0.8]":[1.0,0.0,0.0],"[0.9, 0.9, 0.5]":[1.0,0.0,0.0],"[0.3, 0.0, 0.8]":[1.0,0.0,0.0],"[0.4, 0.0, 0.6]":[1.0,0.0,0.0],"[0.2, 0.3, 0.3]":[0.0,0.5000000000343765,0.4999999999656235],"[0.6, 0.2, 0.5]":[0.0,0.0,1.0],"[0.6, 0.0, 0.2]":[0.0,0.0,1.0],"[0.9, 0.7, 0.1]":[0.0,1.0,0.0],"[0.5, 0.6, 0.0]":[1.0,0.0,0.0],"[0.7, 0.8, 0.4]":[1.0,0.0,0.0],"[0.8, 0.1, 0.8]":[0.0,0.0,1.0],"[0.0, 0.4, 0.5]":[0.0,1.0,0.0],"[0.2, 0.0, 0.7]":[1.0,0.0,0.0],"[0.7, 0.6, 0.8]":[1.0,0.0,0.0],"[0.7, 0.7, 0.0]":[0.0,1.0,0.0],"[0.9, 0.5, 0.6]":[0.0,0.0,1.0],"[0.6, 0.7, 0.4]":[1.0,0.0,0.0],"[0.8, 0.0, 0.5]":[0.0,0.0,1.0],"[0.5, 0.4, 0.6]":[1.0,0.0,0.0],"[0.7, 0.5, 0.5]":[0.0,0.5118153293962622,0.4881846706037376],"[0.1, 0.9, 0.2]":[0.0,0.0,1.0],"[0.1, 0.4, 0.8]":[0.0,1.0,0.0],"[0.0, 0.8, 0.7]":[0.0,0.0,1.0],"[0.9, 0.1, 0.1]":[0.0,0.499999999999999,0.500000000000001],"[0.1, 0.7, 0.3]":[0.0,0.0,1.0],"[0.3, 0.4, 0.0]":[1.0,0.0,0.0],"[0.8, 0.2, 0.7]":[0.0,0.0,1.0],"[0.3, 0.6, 0.3]":[0.4997750183403473,0.0,0.5002249816596527],"[0.6, 0.5, 0.0]":[0.0,1.0,0.0],"[0.7, 0.1, 0.0]":[0.0,1.0,0.0],"[0.9, 0.3, 0.6]":[0.0,0.0,1.0],"[0.4, 0.5, 0.8]":[0.0,1.0,0.0],"[0.7, 0.3, 0.5]":[0.0,0.0,1.0],"[0.6, 0.1, 0.4]":[0.0,0.0,1.0],"[0.3, 0.7, 0.7]":[0.0,0.5543909690237655,0.4456090309762345],"[0.4, 0.4, 0.2]":[0.5000000152094337,0.4999999847905664,0.0],"[0.8, 0.9, 0.6]":[1.0,0.0,0.0],"[0.5, 0.0, 0.8]":[1.0,0.0,0.0],"[0.1, 0.1, 0.3]":[0.49999999999962774,0.5000000000003723,0.0],"[0.4, 0.8, 0.5]":[0.0,0.0,1.0],"[0.6, 0.3, 0.0]":[0.0,1.0,0.0],"[0.9, 0.2, 0.5]":[0.0,0.0,1.0],"[0.4, 0.3, 0.8]":[1.0,0.0,0.0],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.4, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.6, 0.9]":[0.0,1.0,0.0],"[0.2, 0.6, 0.2]":[0.49999999999228595,0.0,0.5000000000077139],"[0.0, 0.9, 0.8]":[0.0,0.0,1.0],"[0.3, 0.1, 0.7]":[1.0,0.0,0.0],"[0.9, 0.7, 0.4]":[0.0,1.0,0.0],"[0.9, 0.5, 0.0]":[0.0,1.0,0.0],"[0.5, 0.4, 0.0]":[0.0,1.0,0.0],"[0.1, 0.2, 0.2]":[0.0,0.4999999999909702,0.5000000000090299],"[0.4, 0.9, 0.1]":[1.0,0.0,0.0],"[0.5, 0.6, 0.3]":[1.0,0.0,0.0],"[0.7, 0.9, 0.2]":[1.0,0.0,0.0],"[0.7, 0.4, 0.8]":[1.0,0.0,0.0],"[0.2, 0.0, 0.6]":[1.0,0.0,0.0],"[0.9, 0.1, 0.4]":[0.0,0.0,1.0],"[0.7, 0.7, 0.3]":[0.5175084631867396,0.4824915368132604,0.0],"[0.9, 0.3, 0.0]":[0.0,1.0,0.0],"[0.5, 0.7, 0.7]":[0.0,0.5016408073963718,0.49835919260362815],"[0.8, 0.7, 0.9]":[1.0,0.0,0.0],"[0.0, 0.8, 0.6]":[0.0,0.0,1.0],"[0.3, 0.0, 0.9]":[1.0,0.0,0.0],"[0.4, 0.6, 0.7]":[0.0,1.0,0.0],"[0.8, 0.2, 0.6]":[0.0,0.0,1.0],"[0.3, 0.4, 0.3]":[0.5003185575220443,0.0,0.49968144247795565],"[0.0, 0.0, 0.1]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.5, 0.3]":[0.0,1.0,0.0],"[0.7, 0.1, 0.3]":[0.0,0.0,1.0],"[0.8, 0.9, 0.0]":[1.0,0.0,0.0],"[0.5, 0.1, 0.7]":[1.0,0.0,0.0],"[0.8, 0.1, 0.9]":[1.0,0.0,0.0],"[0.7, 0.6, 0.9]":[1.0,0.0,0.0],"[0.3, 0.7, 0.6]":[0.0,0.0,1.0],"[0.3, 0.8, 0.1]":[1.0,0.0,0.0],"[0.0, 0.2, 0.8]":[0.0,1.0,0.0],"[0.6, 0.3, 0.3]":[0.0,0.499775018336035,0.5002249816639649],"[0.2, 0.5, 0.8]":[0.0,1.0,0.0],"[0.8, 0.5, 0.1]":[0.0,1.0,0.0],"[0.4, 0.0, 0.3]":[0.0,0.0,1.0],"[0.1, 0.4, 0.9]":[0.0,1.0,0.0],"[0.2, 0.4, 0.2]":[0.49999080804191376,0.0,0.5000091919580862],"[0.3, 0.1, 0.6]":[1.0,0.0,0.0],"[0.2, 0.8, 0.5]":[0.0,0.0,1.0],"[0.4, 0.9, 0.4]":[0.5000000150373365,0.0,0.4999999849626635],"[0.6, 0.0, 0.7]":[1.0,0.0,0.0],"[0.4, 0.2, 0.1]":[0.0,1.0,0.0],"[0.4, 0.5, 0.9]":[0.0,1.0,0.0],"[0.7, 0.2, 0.2]":[0.0,0.5000000031546611,0.4999999968453388],"[0.2, 0.3, 0.8]":[0.0,1.0,0.0],"[0.2, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.3, 0.1]":[0.0,1.0,0.0],"[0.9, 0.5, 0.3]":[0.0,1.0,0.0],"[0.5, 0.0, 0.9]":[1.0,0.0,0.0],"[0.1, 0.9, 0.7]":[0.0,0.0,1.0],"[0.5, 0.4, 0.3]":[0.0,1.0,0.0],"[0.4, 0.3, 0.9]":[1.0,0.0,0.0],"[0.8, 0.8, 0.2]":[1.0,0.0,0.0],"[0.0, 0.7, 0.5]":[0.0,0.0,1.0],"[0.0, 0.8, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.0, 0.4]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.2, 0.0]":[0.0,1.0,0.0],"[0.9, 0.3, 0.3]":[0.0,0.5000000000451209,0.4999999999548791],"[0.0, 0.9, 0.9]":[0.0,0.0,1.0],"[0.5, 0.7, 0.6]":[0.0,0.0,1.0],"[0.5, 0.8, 0.1]":[1.0,0.0,0.0],"[0.2, 0.9, 0.1]":[1.0,0.0,0.0],"[0.1, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.8, 0.4]":[0.0,0.0,1.0],"[0.4, 0.4, 0.7]":[0.5000010323456122,0.49999896765438767,0.0],"[0.3, 0.6, 0.8]":[0.0,1.0,0.0],"[0.4, 0.6, 0.6]":[0.0,0.4999134979199964,0.5000865020800036],"[0.3, 0.7, 0.0]":[1.0,0.0,0.0],"[0.0, 0.1, 0.5]":[0.0,1.0,0.0],"[0.8, 0.9, 0.3]":[1.0,0.0,0.0],"[0.9, 0.0, 0.7]":[0.0,0.0,1.0],"[0.8, 0.5, 0.4]":[0.0,1.0,0.0],"[0.3, 0.5, 0.5]":[0.0,0.50000206538946,0.4999979346105399],"[0.5, 0.1, 0.6]":[1.0,0.0,0.0],"[0.6, 0.6, 0.2]":[0.5239396063382066,0.4760603936617934,0.0],"[0.7, 0.4, 0.9]":[1.0,0.0,0.0],"[0.2, 0.6, 0.7]":[0.0,1.0,0.0],"[0.1, 0.1, 0.8]":[0.5,0.5,0.0],"[0.4, 0.7, 0.2]":[1.0,0.0,0.0],"[0.4, 0.2, 0.4]":[0.49999998509395793,0.0,0.5000000149060421],"[0.3, 0.1, 0.0]":[0.0,1.0,0.0],"[0.8, 0.6, 0.5]":[0.0,1.0,0.0],"[0.1, 0.0, 0.5]":[1.0,0.0,0.0],"[0.8, 0.3, 0.4]":[0.0,0.0,1.0],"[0.3, 0.3, 0.5]":[0.5000012339455159,0.4999987660544841,0.0],"[0.6, 0.0, 0.6]":[1.0,0.0,0.0],"[0.1, 0.2, 0.7]":[0.0,1.0,0.0],"[0.4, 0.1, 0.2]":[0.0,0.0,1.0],"[0.7, 0.9, 0.7]":[1.0,0.0,0.0],"[0.2, 0.0, 0.3]":[1.0,0.0,0.0],"[0.5, 0.8, 0.4]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.2, 0.9, 0.4]":[0.0,0.0,1.0],"[0.5, 0.6, 0.8]":[0.0,1.0,0.0],"[0.1, 0.9, 0.6]":[0.0,0.0,1.0],"[0.2, 0.2, 0.1]":[0.5000000000025401,0.49999999999746003,0.0],"[0.2, 0.5, 0.9]":[0.0,1.0,0.0],"[0.5, 0.7, 0.0]":[1.0,0.0,0.0],"[0.7, 0.7, 0.8]":[0.6147917393289635,0.38520826067103653,0.0],"[0.9, 0.6, 0.2]":[0.0,1.0,0.0],"[0.0, 0.8, 0.3]":[0.0,0.0,1.0],"[0.4, 0.6, 0.0]":[1.0,0.0,0.0],"[0.5, 0.5, 0.5]":[0.33333329090108066,0.33333342141995537,0.3333332876789644],"[0.8, 0.2, 0.3]":[0.0,0.0,1.0],"[0.2, 0.3, 0.9]":[0.0,1.0,0.0],"[0.3, 0.9, 0.2]":[1.0,0.0,0.0],"[0.3, 0.4, 0.8]":[0.0,1.0,0.0],"[0.4, 0.4, 0.6]":[0.4999986989552647,0.5000013010447354,0.0],"[0.5, 0.1, 0.0]":[0.0,1.0,0.0],"[0.6, 0.5, 0.8]":[1.0,0.0,0.0],"[0.7, 0.1, 0.8]":[1.0,0.0,0.0],"[0.3, 0.7, 0.3]":[0.5000000194246246,0.0,0.4999999805753754],"[0.5, 0.3, 0.5]":[0.5000044998397601,0.0,0.49999550016023986],"[0.9, 0.0, 0.6]":[0.0,0.0,1.0],"[0.7, 0.0, 0.5]":[0.0,0.0,1.0],"[0.6, 0.4, 0.2]":[0.0,1.0,0.0],"[0.2, 0.4, 0.7]":[0.0,1.0,0.0],"[0.6, 0.8, 0.5]":[1.0,0.0,0.0],"[0.2, 0.6, 0.6]":[0.0,0.5045661469743149,0.4954338530256851],"[0.6, 0.3, 0.8]":[1.0,0.0,0.0],"[0.7, 0.2, 0.7]":[0.7709655252648201,0.0,0.2290344747351799],"[0.3, 0.1, 0.3]":[0.5000000041681845,0.0,0.49999999583181565],"[0.6, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.4, 0.5]":[0.0,0.0,1.0],"[0.4, 0.0, 0.8]":[1.0,0.0,0.0],"[0.1, 0.7, 0.9]":[0.0,1.0,0.0],"[0.3, 0.6, 0.9]":[0.0,1.0,0.0],"[0.2, 0.7, 0.2]":[0.5000000031546459,0.0,0.4999999968453541],"[0.2, 0.2, 0.4]":[0.49999080804219087,0.5000091919578091,0.0],"[0.1, 0.2, 0.6]":[0.0,1.0,0.0],"[0.7, 0.9, 0.6]":[1.0,0.0,0.0],"[0.0, 0.6, 0.1]":[0.0,0.0,1.0],"[0.8, 0.8, 0.7]":[1.0,0.0,0.0],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.5, 0.8]":[0.0,0.0,1.0],"[0.1, 0.1, 0.9]":[0.5000000000000001,0.5,0.0],"[0.6, 0.9, 0.1]":[1.0,0.0,0.0],"[0.5, 0.9, 0.2]":[1.0,0.0,0.0],"[0.5, 0.4, 0.8]":[1.0,0.0,0.0],"[0.2, 0.1, 0.2]":[0.5000000000150719,0.0,0.49999999998492817],"[0.5, 0.7, 0.3]":[1.0,0.0,0.0],"[0.3, 0.2, 0.2]":[0.0,0.4999902353156015,0.5000097646843986],"[0.9, 0.4, 0.2]":[0.0,1.0,0.0],"[0.9, 0.8, 0.5]":[0.0,1.0,0.0],"[0.4, 0.4, 0.0]":[0.500157146164096,0.499842853835904,0.0],"[0.1, 0.5, 0.1]":[0.5000000000000001,0.0,0.4999999999999999],"[0.4, 0.6, 0.3]":[1.0,0.0,0.0],"[0.0, 0.5, 0.2]":[0.0,0.0,1.0],"[0.9, 0.3, 0.8]":[0.0,0.0,1.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.6, 0.7]":[0.5071855476814338,0.49281445231856624,0.0],"[0.5, 0.1, 0.3]":[0.0,0.0,1.0],"[0.4, 0.7, 0.7]":[0.0,0.5057155442027138,0.4942844557972862],"[0.8, 0.9, 0.8]":[1.0,0.0,0.0],"[0.2, 0.6, 0.0]":[1.0,0.0,0.0],"[0.1, 0.3, 0.1]":[0.5000000000003717,0.0,0.4999999999996283],"[0.0, 0.3, 0.2]":[0.0,0.0,1.0],"[0.5, 0.6, 0.9]":[0.0,1.0,0.0],"[0.7, 0.7, 0.9]":[1.0,0.0,0.0],"[0.2, 0.4, 0.6]":[0.0,1.0,0.0],"[0.1, 0.8, 0.2]":[0.0,0.0,1.0],"[0.9, 0.9, 0.1]":[0.0,1.0,0.0],"[0.4, 0.1, 0.7]":[1.0,0.0,0.0],"[0.0, 0.6, 0.4]":[0.0,0.0,1.0],"[0.7, 0.2, 0.6]":[0.0,0.0,1.0],"[0.1, 0.2, 0.0]":[1.0,0.0,0.0],"[0.6, 0.0, 0.3]":[0.0,0.0,1.0],"[0.7, 0.9, 0.0]":[1.0,0.0,0.0],"[0.3, 0.4, 0.9]":[0.0,1.0,0.0],"[0.6, 0.9, 0.4]":[1.0,0.0,0.0],"[0.6, 0.2, 0.1]":[0.0,1.0,0.0],"[0.5, 0.2, 0.2]":[0.0,0.5000066303213005,0.49999336967869934],"[0.6, 0.5, 0.9]":[1.0,0.0,0.0],"[0.7, 0.1, 0.9]":[1.0,0.0,0.0],"[0.0, 0.4, 0.1]":[0.0,0.0,1.0],"[0.8, 0.8, 0.6]":[0.0,1.0,0.0],"[0.1, 0.9, 0.3]":[0.0,0.0,1.0],"[0.2, 0.0, 0.8]":[1.0,0.0,0.0],"[0.9, 0.6, 0.7]":[0.0,0.0,1.0],"[0.1, 0.5, 0.4]":[0.0,0.0,1.0],"[0.8, 0.0, 0.1]":[0.0,0.0,1.0],"[0.7, 0.5, 0.1]":[0.0,1.0,0.0],"[0.6, 0.3, 0.9]":[1.0,0.0,0.0],"[0.0, 0.8, 0.8]":[0.0,1.0,0.0],"[0.3, 0.9, 0.7]":[0.0,0.0,1.0],"[0.4, 0.0, 0.9]":[1.0,0.0,0.0],"[0.8, 0.2, 0.8]":[1.0,0.0,0.0],"[0.1, 0.6, 0.5]":[0.0,0.0,1.0],"[0.4, 0.4, 0.3]":[0.5000000097856692,0.49999999021433095,0.0],"[0.1, 0.3, 0.4]":[0.0,1.0,0.0],"[0.7, 0.3, 0.1]":[0.0,1.0,0.0],"[0.9, 0.0, 0.3]":[0.0,0.0,1.0],"[0.6, 0.4, 0.7]":[1.0,0.0,0.0],"[0.6, 0.6, 0.6]":[0.33332797160968086,0.3333448337890986,0.3333271946012205],"[0.3, 0.7, 0.8]":[0.0,1.0,0.0],"[0.4, 0.7, 0.6]":[0.0,0.0,1.0],"[0.4, 0.8, 0.1]":[1.0,0.0,0.0],"[0.2, 0.4, 0.0]":[1.0,0.0,0.0],"[0.7, 0.8, 0.2]":[1.0,0.0,0.0],"[0.9, 0.9, 0.4]":[1.0,0.0,0.0],"[0.9, 0.2, 0.1]":[0.0,1.0,0.0],"[0.2, 0.6, 0.3]":[0.0,0.0,1.0],"[0.9, 0.5, 0.9]":[0.0,0.0,1.0],"[0.7, 0.2, 0.0]":[0.0,1.0,0.0],"[0.5, 0.4, 0.9]":[1.0,0.0,0.0],"[0.6, 0.7, 0.2]":[1.0,0.0,0.0],"[0.6, 0.2, 0.4]":[0.0,0.0,1.0],"[0.2, 0.7, 0.7]":[0.0,0.0,1.0],"[0.0, 0.4, 0.4]":[0.0,0.4995592947645493,0.5004407052354508],"[0.3, 0.1, 0.8]":[1.0,0.0,0.0],"[0.4, 0.1, 0.6]":[1.0,0.0,0.0],"[0.9, 0.3, 0.9]":[1.0,0.0,0.0],"[0.1, 0.2, 0.3]":[0.0,1.0,0.0],"[0.8, 0.7, 0.5]":[0.0,1.0,0.0],"[0.7, 0.9, 0.3]":[1.0,0.0,0.0],"[0.8, 0.8, 0.0]":[1.0,0.0,0.0],"[0.8, 0.0, 0.4]":[0.0,0.0,1.0],"[0.3, 0.0, 0.5]":[1.0,0.0,0.0],"[0.7, 0.5, 0.4]":[0.0,1.0,0.0],"[0.6, 0.1, 0.2]":[0.0,0.0,1.0],"[0.5, 0.9, 0.7]":[0.0,0.0,1.0],"[0.8, 0.9, 0.9]":[0.0,0.0,1.0],"[0.2, 0.1, 0.7]":[1.0,0.0,0.0],"[0.3, 0.2, 0.7]":[1.0,0.0,0.0],"[0.9, 0.4, 0.7]":[0.0,0.0,1.0],"[0.9, 0.6, 0.6]":[0.0,0.5005012931943964,0.4994987068056036],"[0.8, 0.1, 0.5]":[0.0,0.0,1.0],"[0.7, 0.6, 0.5]":[0.0,1.0,0.0],"[0.0, 0.5, 0.7]":[0.0,1.0,0.0],"[0.7, 0.3, 0.4]":[0.0,0.0,1.0],"[0.5, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.9, 0.6]":[0.0,0.0,1.0],"[0.4, 0.8, 0.4]":[0.4999998192290215,0.0,0.5000001807709784],"[0.6, 0.6, 0.0]":[0.0,1.0,0.0],"[0.9, 0.7, 0.2]":[0.0,1.0,0.0],"[0.1, 0.4, 0.5]":[0.0,1.0,0.0],"[0.4, 0.6, 0.8]":[0.0,1.0,0.0],"[0.9, 0.2, 0.4]":[0.0,0.0,1.0],"[0.4, 0.7, 0.0]":[1.0,0.0,0.0],"[0.0, 0.3, 0.7]":[0.0,1.0,0.0],"[0.4, 0.5, 0.5]":[0.0,0.5000005297038124,0.49999947029618763],"[0.6, 0.4, 0.6]":[0.4997838050581739,0.0,0.5002161949418261],"[0.5, 0.1, 0.8]":[1.0,0.0,0.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.1, 0.8, 0.7]":[0.0,0.0,1.0],"[0.2, 0.4, 0.3]":[0.0,0.0,1.0],"[0.9, 0.1, 0.2]":[0.0,0.0,1.0],"[0.4, 0.1, 0.0]":[0.0,1.0,0.0],"[0.5, 0.0, 0.5]":[0.2651630786948418,0.0,0.7348369213051581],"[0.7, 0.2, 0.3]":[0.0,0.0,1.0],"[0.4, 0.3, 0.5]":[1.0,0.0,0.0],"[0.0, 0.8, 0.9]":[0.0,1.0,0.0],"[0.2, 0.7, 0.6]":[0.0,0.0,1.0],"[0.2, 0.8, 0.1]":[1.0,0.0,0.0],"[0.5, 0.2, 0.7]":[1.0,0.0,0.0],"[0.8, 0.2, 0.9]":[1.0,0.0,0.0],"[0.6, 0.0, 0.8]":[1.0,0.0,0.0],"[0.0, 0.9, 0.5]":[0.0,0.0,1.0],"[0.8, 0.8, 0.3]":[0.0,1.0,0.0],"[0.9, 0.6, 0.0]":[0.0,1.0,0.0],"[0.3, 0.7, 0.9]":[0.0,1.0,0.0],"[0.5, 0.9, 0.6]":[0.0,0.0,1.0],"[0.2, 0.1, 0.6]":[1.0,0.0,0.0],"[0.1, 0.9, 0.8]":[0.0,0.0,1.0],"[0.0, 0.7, 0.1]":[0.0,0.0,1.0],"[0.3, 0.2, 0.6]":[1.0,0.0,0.0],"[0.9, 0.4, 0.6]":[0.0,0.0,1.0],"[0.3, 0.9, 0.0]":[1.0,0.0,0.0],"[0.7, 0.4, 0.5]":[0.0,0.0,1.0],"[0.0, 0.5, 0.6]":[0.0,1.0,0.0],"[0.3, 0.1, 0.9]":[1.0,0.0,0.0],"[0.6, 0.4, 0.0]":[0.0,1.0,0.0],"[0.4, 0.9, 0.2]":[1.0,0.0,0.0],"[0.0, 0.1, 0.1]":[0.0,0.49999999999961675,0.5000000000003834],"[0.4, 0.4, 0.8]":[0.4999998577107576,0.5000001422892424,0.0],"[0.6, 0.6, 0.3]":[0.49956002224412077,0.5004399777558792,0.0],"[0.7, 0.8, 0.7]":[0.5000224219147038,0.0,0.4999775780852964],"[0.4, 0.7, 0.3]":[1.0,0.0,0.0],"[0.0, 0.3, 0.6]":[0.0,1.0,0.0],"[0.3, 0.5, 0.1]":[1.0,0.0,0.0],"[0.9, 0.0, 0.8]":[0.0,0.0,1.0],"[0.6, 0.7, 0.7]":[0.0,0.46865918021815434,0.5313408197818454],"[0.2, 0.8, 0.4]":[0.0,0.0,1.0],"[0.1, 0.8, 0.6]":[0.0,0.0,1.0],"[0.2, 0.6, 0.8]":[0.0,1.0,0.0],"[0.2, 0.7, 0.0]":[1.0,0.0,0.0],"[0.8, 0.6, 0.1]":[0.0,1.0,0.0],"[0.0, 0.2, 0.5]":[0.0,1.0,0.0],"[0.1, 0.0, 0.1]":[0.49999999999964706,0.0,0.5000000000003528],"[0.4, 0.1, 0.3]":[0.0,0.0,1.0],"[0.0, 0.0, 0.2]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.3, 0.3, 0.1]":[0.5000000069544247,0.4999999930455753,0.0],"[0.5, 0.7, 0.9]":[0.0,1.0,0.0],"[0.2, 0.5, 0.5]":[0.0,0.49981222047498897,0.500187779525011],"[0.6, 0.1, 0.7]":[1.0,0.0,0.0],"[0.5, 0.2, 0.6]":[1.0,0.0,0.0],"[0.4, 0.6, 0.9]":[0.0,1.0,0.0],"[0.3, 0.8, 0.2]":[1.0,0.0,0.0],"[0.5, 0.9, 0.0]":[1.0,0.0,0.0],"[0.0, 0.7, 0.4]":[0.0,0.0,1.0],"[0.1, 0.2, 0.8]":[0.0,1.0,0.0],"[0.2, 0.1, 0.0]":[0.0,1.0,0.0],"[0.7, 0.9, 0.8]":[0.0,0.0,1.0],"[0.3, 0.2, 0.0]":[0.0,1.0,0.0],"[0.9, 0.4, 0.0]":[0.0,1.0,0.0],"[0.2, 0.3, 0.5]":[0.0,1.0,0.0],"[0.9, 0.6, 0.3]":[0.0,1.0,0.0],"[0.5, 0.1, 0.9]":[1.0,0.0,0.0],"[0.8, 0.5, 0.2]":[0.0,1.0,0.0],"[0.0, 0.5, 0.0]":[0.3333262234652497,0.33334755306950054,0.3333262234652497],"[0.0, 0.1, 0.4]":[0.0,1.0,0.0],"[0.9, 0.7, 0.7]":[0.0,0.0,1.0],"[0.4, 0.2, 0.2]":[0.0,0.49999080804179985,0.5000091919582003],"[0.5, 0.5, 0.1]":[0.4967435432600944,0.5032564567399056,0.0],"[0.3, 0.9, 0.3]":[0.5000000000451094,0.0,0.49999999995489064],"[0.3, 0.5, 0.4]":[0.0,0.0,1.0],"[0.8, 0.3, 0.2]":[0.0,1.0,0.0],"[0.0, 0.3, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.0, 0.9]":[1.0,0.0,0.0],"[0.6, 0.4, 0.3]":[0.0,1.0,0.0],"[0.7, 0.8, 0.6]":[1.0,0.0,0.0],"[0.5, 0.3, 0.1]":[0.0,1.0,0.0],"[0.1, 0.7, 0.5]":[0.0,0.0,1.0],"[0.1, 0.8, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.7]":[0.0,0.0,1.0],"[0.8, 0.6, 0.4]":[0.0,1.0,0.0],"[0.1, 0.0, 0.4]":[1.0,0.0,0.0],"[0.3, 0.6, 0.5]":[0.0,0.0,1.0],"[0.3, 0.3, 0.4]":[0.49968144241998536,0.5003185575800146,0.0],"[0.7, 0.0, 0.1]":[0.0,0.0,1.0],"[0.1, 0.9, 0.9]":[0.0,0.0,1.0],"[0.6, 0.7, 0.6]":[0.5071848504983205,0.0,0.4928151495016797],"[0.6, 0.8, 0.1]":[1.0,0.0,0.0],"[0.5, 0.8, 0.2]":[1.0,0.0,0.0],"[0.2, 0.9, 0.2]":[0.5000000000000001,0.0,0.5],"[0.2, 0.4, 0.8]":[0.0,1.0,0.0],"[0.2, 0.7, 0.3]":[0.0,0.0,1.0],"[0.5, 0.2, 0.0]":[0.0,1.0,0.0],"[0.8, 0.4, 0.1]":[0.0,1.0,0.0],"[0.1, 0.1, 0.5]":[0.4999999999999998,0.5000000000000001,0.0],"[0.7, 0.2, 0.8]":[1.0,0.0,0.0]} \ No newline at end of file From faf87b7c430e5f74c6b5786cfafe8deaac1040aa Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Fri, 9 Feb 2024 14:51:43 -0600 Subject: [PATCH 19/35] cached r values to .1 precision --- data2.tmp | 1 + experiments/scout_visuals.jl | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 data2.tmp diff --git a/data2.tmp b/data2.tmp new file mode 100644 index 0000000..f73590e --- /dev/null +++ b/data2.tmp @@ -0,0 +1 @@ +{"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.1]":[0.0,0.5000000000000001,0.4999999999999998],"[0.1, 0.1, 0.9]":[0.5,0.5,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.1]":[0.4999999999999998,0.0,0.5000000000000002],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0]} \ No newline at end of file diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index e6ea608..c3cb6f6 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -39,7 +39,7 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. save_file = nothing if use_file - save_file = JSON3.read(open("data.tmp", "r"), Dict{Vector{Float64}, Vector{Float64}}) + save_file = JSON3.read(open("data2.tmp", "r"), Dict{String, Vector{Float64}}) println("read file") end @@ -165,7 +165,7 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. # Solve for scout_allocation, r observable_r = on(normalized_observable_p) do x if use_file - save_file[x] + save_file[string(round.(x))] else solve_r(x, attacker_preference) end @@ -218,7 +218,7 @@ end function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1, attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], - save_file_name = "data.tmp") + save_file_name = "data2.tmp") prior_range = round.(_prior_range, digits=1) # save_file = open(save_file_name, "w+") hashmap = Dict{Vector{Float64}, Vector{Float64}}() @@ -227,11 +227,14 @@ function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1, for prior_west in prior_range # print("calculating: ", [prior_north, prior_east, prior_west]) current_prior = [prior_north, prior_east, prior_west] - r = solve_r(current_prior, attacker_preference, verbose = false) - hashmap[current_prior] = r + if norm(current_prior, 1) <= 1.11 && norm(current_prior) >= .89 + r = solve_r(current_prior, attacker_preference, verbose = false) + hashmap[current_prior] = r + end end end end + hashmap[[0.0, 0.0, 0.0]] = [0.0, 0.0, 0.0] JSON3.write(save_file_name, hashmap) # write(save_file, hashmap) # close(save_file) From 48db525c6d64e62e09275ab74fa1e0b114faf9df Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Fri, 9 Feb 2024 14:55:13 -0600 Subject: [PATCH 20/35] fix 1 hot not showing up in hashmap --- experiments/scout_visuals.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index c3cb6f6..b1824a2 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -216,7 +216,7 @@ function demo_stage2() end -function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1, +function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1.1, attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], save_file_name = "data2.tmp") prior_range = round.(_prior_range, digits=1) From 8970484e328b8ef2b69ee166465d53b48b9f1992 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Fri, 9 Feb 2024 14:58:31 -0600 Subject: [PATCH 21/35] recomputed data2.tmp file --- data2.tmp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data2.tmp b/data2.tmp index f73590e..3e761a6 100644 --- a/data2.tmp +++ b/data2.tmp @@ -1 +1 @@ -{"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.1]":[0.0,0.5000000000000001,0.4999999999999998],"[0.1, 0.1, 0.9]":[0.5,0.5,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.1]":[0.4999999999999998,0.0,0.5000000000000002],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0]} \ No newline at end of file +{"[0.0, 1.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[1.0, 0.0, 0.1]":[0.0,0.0,1.0],"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.1]":[0.0,0.5000000000000001,0.4999999999999998],"[0.0, 1.0, 0.1]":[0.0,0.0,1.0],"[1.0, 0.1, 0.0]":[0.0,1.0,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.1, 0.9]":[0.5,0.5,0.0],"[0.1, 0.0, 1.0]":[1.0,0.0,0.0],"[0.1, 0.9, 0.1]":[0.4999999999999998,0.0,0.5000000000000002],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[1.0, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.1, 1.0]":[0.0,1.0,0.0],"[0.1, 1.0, 0.0]":[1.0,0.0,0.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.0, 0.0, 1.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0]} \ No newline at end of file From 98312a44dfe1deee9cb23c6e6a255036aa94b07d Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Fri, 9 Feb 2024 15:45:48 -0600 Subject: [PATCH 22/35] wip for stage 2 visuals --- experiments/scout_visuals.jl | 196 +++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index b1824a2..76deceb 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -213,7 +213,203 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. end function demo_stage2() + # Game Parameters + attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] + num_worlds = 3 + prior_range_step = 0.01 + prior_range_step_precision = 1 + prior_range = 0.01:prior_range_step:1 + save_file_name = "precomputed_r.txt" + save_precision = 4 + K = 100 + num_unit_scaling_factor = 20 + +# Axis parameters + # borders + ax_aspect = 1 + ax_limits = (0, 1, 0, 1) + # title + ax_titlegap = 1 + ax_titlesize = 30 + # x-axis + ax_xautolimitmargin = (0, 0) + ax_xgridwidth = 2 + ax_xticklabelsize = 0 + ax_xticks = -10:10 + ax_xticksize = 18 + # y-axis + ax_yautolimitmargin = (0, 0) + ax_ygridwidth = 2 + ax_yticklabelpad = 14 + ax_yticklabelsize = 0 + ax_yticks = -10:10 + ax_yticksize = 18 + + opacity = 0.5 + +# Initialize plot +fig = Figure() + +# Add axis for each direction +ax_north = Axis(fig[1,2], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "North", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +) +ax_west = Axis(fig[2,1], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "West", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +) +ax_east = Axis(fig[2,3], + # borders + aspect = ax_aspect, limits = ax_limits, + # title + title = "East", + titlegap = ax_titlegap, titlesize = ax_titlesize, + # x-axis + xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, + xticklabelsize = ax_xticklabelsize, + xticks = ax_xticks, xticksize = ax_xticksize, + # y-axis + yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, + yticklabelpad = ax_yticklabelpad, + yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +) + +ax_simplex = Axis3(fig[2,2], aspect = (1,1,1), + limits = ((0.0, 1.0, 0.0, 1.0, 0.0, 1.1)), + xreversed = true, + yreversed = true, + xlabel = "", + ylabel = "", + zlabel = "", +) + +hidedecorations!(ax_north) +hidedecorations!(ax_east) +hidedecorations!(ax_west) + +# Create sliders +sg = SliderGrid( + fig[3, 2], + (label = "prior_north", range = prior_range, format = x-> "", startvalue = 1.0), # z + (label = "prior_east", range = prior_range, format = x-> "", startvalue = 1.0), # y + (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0) # x +) +observable_prior_sliders = [s.value for s in sg.sliders] + +# Plot priors on the Simplex +scatterlines!(ax_simplex, [1;0;0;1], [0;1;0;0], [0;0;1;0], markersize = 15) + +# Normalize priors +normalized_observable_p = lift(observable_prior_sliders...) do a, b, c + round.(normalize([a,b,c], 1), digits = 2) +end +@lift println("priors: ", $normalized_observable_p) + +# p₁ : west, p₂ : east, p₃ : north +p1, p2, p3 = [lift((x,i)->x[i], normalized_observable_p, idx) for idx in 1:num_worlds] +scatter!(ax_simplex, p3, p2, p1 ; markersize = 15, color = :red) + +# Solve for scout_allocation, r +observable_r = on(normalized_observable_p) do x + if use_file + save_file[string(round.(x))] + else + solve_r(x, attacker_preference) + end +end +scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] + +function get_random_point_within_ball(; radius = 0.3, center = [ax_limits[2]/2, ax_limits[2]/2], num_points = 1) + # Check center is Tuple + @assert length(center) == 2 "Center must be a 2-element vector [x, y]" + x_coord, y_coord = center + + # Generate random angle in radians + angle = [2π * rand() for _ in 1:num_points] + + # Generate random distance within the specificed radius + r = [radius * sqrt(rand()) for _ in 1:num_points] + + # Calculate new x and y coordinates and create an array of Point2f objects + + [Point2f(x_coord + r[i] * cos(angle[i]), y_coord + r[i] * sin(angle[i])) for i in 1:num_points] +end + +# Check if scout_allocation results are normalized +@lift println("Scout allocation: ", [$scout_north, $scout_east, $scout_west]) + +# Display scout allocation as a text on the Figure +text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] +Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) +Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) +Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) + +signal_menu = Menu(fig[1:1], options = [0, 1, 2, 3], default = 0) +world_menu = Menu(fig[1:3], options=["World 1", "World 2", "World 3"], default = "World 2") + +# Plot scout allocation +# north_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_north) +# east_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_east) +# west_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_west) +# scatter!(ax_north, north_points, markersize = 15, color = (:orange, opacity)) +# scatter!(ax_east, east_points, markersize = 15, color = (:pink, opacity+0.2)) +# scatter!(ax_west, west_points, markersize = 15, color = (:green, opacity)) + +#TODO: Plot defense / attacker allocation + # Happens when menu changes or when priors change + +# TODO: change game when priors change + +game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) +# game = build_stage_2(normalized_observable_p[], attacker_preference) +b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game), + observable_r, normalized_observable_p, game) + +#TODO: plot using b_array +on(world_menu) do world + if world == "World 1" + else if world == "World 2" + else # world == "World 3" + end +end + +on(signal_menu) do signal + if signal == 0 + else if signal == 1 + else if signal == 2 + else #signal == 3 + end +end + +# scatter!(ax_north, north_points, markersize = 15, color = (:orange, opacity)) +# scatter!(ax_east, east_points, markersize = 15, color = (:pink, opacity+0.2)) +# scatter!(ax_west, west_points, markersize = 15, color = (:green, opacity)) + +display(fig, fullscreen = true) end function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1.1, From f985b224ddf772b4156e771486b7867025bdefdd Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 13 Feb 2024 09:40:14 -0600 Subject: [PATCH 23/35] fix syntax error if-elseif --- experiments/scout_visuals.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 76deceb..8529611 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -391,15 +391,15 @@ b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game), #TODO: plot using b_array on(world_menu) do world if world == "World 1" - else if world == "World 2" + elseif world == "World 2" else # world == "World 3" end end on(signal_menu) do signal if signal == 0 - else if signal == 1 - else if signal == 2 + elseif signal == 1 + elseif signal == 2 else #signal == 3 end end From 286e3ad4377cc41594865dd22547a2b1d002c75a Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:57:45 -0600 Subject: [PATCH 24/35] Create listerner for game and b_array --- experiments/scout_visuals.jl | 13 +++++-------- experiments/tower_defense.jl | 1 + 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 8529611..6be1357 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -367,8 +367,8 @@ Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) -signal_menu = Menu(fig[1:1], options = [0, 1, 2, 3], default = 0) -world_menu = Menu(fig[1:3], options=["World 1", "World 2", "World 3"], default = "World 2") +signal_menu = Menu(fig[1,1], options = [0, 1, 2, 3], default = 1) +world_menu = Menu(fig[1,3], options=["World 1", "World 2", "World 3"], default = "World 2") # Plot scout allocation # north_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_north) @@ -382,13 +382,10 @@ world_menu = Menu(fig[1:3], options=["World 1", "World 2", "World 3"], default = # Happens when menu changes or when priors change # TODO: change game when priors change - game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) -# game = build_stage_2(normalized_observable_p[], attacker_preference) -b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game), - observable_r, normalized_observable_p, game) - -#TODO: plot using b_array +b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1]), + observable_r.observable, normalized_observable_p, game) +#TODO: plot using b_array.val on(world_menu) do world if world == "World 1" elseif world == "World 2" diff --git a/experiments/tower_defense.jl b/experiments/tower_defense.jl index 07c8861..93c9989 100644 --- a/experiments/tower_defense.jl +++ b/experiments/tower_defense.jl @@ -299,6 +299,7 @@ Output: x: decision variables of Stage 2 given r. BlockedArray with a block per player """ function compute_stage_2(r, ps, βs, game; initial_guess = nothing, verbose=false) + Main.@infiltrate n = length(ps) # assume n_signals = n_worlds + 1 n_players = 1 + n^2 var_dim = n # TODO: Change this to be more general From e3c39feea03097f948995378e6b8b57b4225293f Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Thu, 15 Feb 2024 17:27:01 -0600 Subject: [PATCH 25/35] todo: make graphs refresh, draw triangles --- experiments/scout_visuals.jl | 113 +++++++++++++++++++++++++++++++---- experiments/tower_defense.jl | 2 +- 2 files changed, 103 insertions(+), 12 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 6be1357..02ff48b 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -212,7 +212,7 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. display(fig, fullscreen = true) end -function demo_stage2() +function demo_stage2(;use_file=true) # Game Parameters attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] num_worlds = 3 @@ -367,8 +367,11 @@ Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) -signal_menu = Menu(fig[1,1], options = [0, 1, 2, 3], default = 1) -world_menu = Menu(fig[1,3], options=["World 1", "World 2", "World 3"], default = "World 2") +signal_menu = Menu(fig[0,1], options = [0, 1, 2, 3], default = 1) + +world_menu = Menu(fig[0,3], options=["World 1", "World 2", "World 3"], default = "World 1") +use_world_menu = true +# Main.@infiltrate # Plot scout allocation # north_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_north) @@ -385,22 +388,90 @@ world_menu = Menu(fig[1,3], options=["World 1", "World 2", "World 3"], default = game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1]), observable_r.observable, normalized_observable_p, game) -#TODO: plot using b_array.val -on(world_menu) do world - if world == "World 1" - elseif world == "World 2" - else # world == "World 3" - end -end -on(signal_menu) do signal +# Create an array of observables from b_array +# b_array_obs = [lift((x,i,j) -> x[Block(i)][j], b_array, i,j) for j in 1:3 for i in 1:10] + +b_array_obs_f = (n, m) -> lift((x, i, j) -> x[Block(i)][j], b_array, n, m) +axes = [ax_north, ax_east, ax_west] +defender_colors = [(:orange, opacity), (:pink, opacity+.2), (:green, opacity)] +# Main.@infiltrate + +on(signal_menu.selection, priority = 1) do signal + # print("signal menu selection") if signal == 0 + use_world_menu = true + world_menu.selection = "World 1" elseif signal == 1 + use_world_menu = false + world_menu.selection = "World 1" elseif signal == 2 + use_world_menu = false + world_menu.selection = "World 2" else #signal == 3 + use_world_menu = false + world_menu.selection = "World 3" end + # return Consume() end +on(world_menu.selection, priority = 0) do world + print("World menu selection " * world_menu.selection[]*"\n") + print("World menu selection " * world *"\n") + # Box(fig[1,2], color=(:white)) + # Box(fig[2,1], color=(:white)) + # Box(fig[2,3], color=(:white)) + #TODO make scatter functions use observables for points, instead of values. It is not refreshing. + # maybe enemy scatter overwrites defender scatter? + #TODO make world menu disappear when signal != 0 + #TODO make triangles not scatter + if use_world_menu # signal = 0 + # plotting defender (same for all worlds when signal = 0 + for idx in 1:3 + scatter!(axes[idx], b_array_obs_f(1, idx), b_array_obs_f(1, idx), + markersize = 15, color = defender_colors[idx]) + end + # plotting attacker, changes per world + if world == "World 1" + print("Using World: 1\n") + + for idx in 1:3 + scatter!(axes[idx], b_array_obs_f(5, idx), b_array_obs_f(5, idx), + markersize = 15, color = (:red, opacity)) + end + elseif world == "World 2" + print("Using World: 2\n") + for idx in 1:3 + scatter!(axes[idx], b_array_obs_f(6, idx), b_array_obs_f(6, idx), + markersize = 15, color = (:red, opacity)) + end + else # world == "World 3" + print("Using World: 3\n") + for idx in 1:3 + scatter!(axes[idx], b_array_obs_f(7, idx), b_array_obs_f(7, idx), + markersize = 15, color = (:red, opacity)) + end + end + + else + for idx in 1:3 + scatter!(axes[idx], b_array_obs_f(4 + signal_menu.selection[], idx), + b_array_obs_f(4 + signal_menu.selection[], idx), + markersize = 15, color = defender_colors(idx)) + end + for idx in 1:3 + scatter!(axes[idx], b_array_obs_f(7 + signal_menu.selection[], idx), + b_array_obs_f(7 + signal_menu.selection[], idx), + markersize = 15, color = (:red, opacity)) + end + # b_array.val[Block(1 + signal_menu.selection[])], + # v = b_array.val[Block(7 + signal_menu.selection[])], + # fig = fig, ax_n = ax_north, ax_e = ax_east, ax_w = ax_west) + end +end + + + # scatter!(ax_north, north_points, markersize = 15, color = (:orange, opacity)) # scatter!(ax_east, east_points, markersize = 15, color = (:pink, opacity+0.2)) # scatter!(ax_west, west_points, markersize = 15, color = (:green, opacity)) @@ -409,6 +480,26 @@ end display(fig, fullscreen = true) end +function draw_world(;u, v, fig, ax_n, ax_e, ax_w) + u = round.(u, digits = 2) + v = round.(v, digits = 2) + opacity = 0.5 + + print("\nU:\n") + print(u) + print("\nV:\n") + print(v) + + scatter!(ax_n, u, u, markersize = 15, color = (:orange, opacity)) + scatter!(ax_e, u, u, markersize = 15, color = (:pink, opacity + .2)) + scatter!(ax_w, u, u, markersize = 15, color = (:green, opacity)) + + scatter!(ax_n, v, v, markersize = 15, color = (:red, opacity)) + scatter!(ax_e, v, v, markersize = 15, color = (:red, opacity)) + scatter!(ax_w, v, v, markersize = 15, color = (:red, opacity)) +end + + function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1.1, attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], save_file_name = "data2.tmp") diff --git a/experiments/tower_defense.jl b/experiments/tower_defense.jl index 93c9989..d8f6a89 100644 --- a/experiments/tower_defense.jl +++ b/experiments/tower_defense.jl @@ -299,7 +299,7 @@ Output: x: decision variables of Stage 2 given r. BlockedArray with a block per player """ function compute_stage_2(r, ps, βs, game; initial_guess = nothing, verbose=false) - Main.@infiltrate + n = length(ps) # assume n_signals = n_worlds + 1 n_players = 1 + n^2 var_dim = n # TODO: Change this to be more general From 35e876dc32aee62322ee240bdeb07414ad437208 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Tue, 20 Feb 2024 18:25:28 -0600 Subject: [PATCH 26/35] done --- experiments/scout_visuals.jl | 279 +++++++++++++++++++++++------------ 1 file changed, 183 insertions(+), 96 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 02ff48b..ec7acf4 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -213,6 +213,11 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. end function demo_stage2(;use_file=true) + save_file = nothing + if use_file + save_file = JSON3.read(open("data2.tmp", "r"), Dict{String, Vector{Float64}}) + println("read file") + end # Game Parameters attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] num_worlds = 3 @@ -227,7 +232,7 @@ function demo_stage2(;use_file=true) # Axis parameters # borders ax_aspect = 1 - ax_limits = (0, 1, 0, 1) + ax_limits = (0, 2, 0, 2) # title ax_titlegap = 1 ax_titlesize = 30 @@ -367,24 +372,10 @@ Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) -signal_menu = Menu(fig[0,1], options = [0, 1, 2, 3], default = 1) - -world_menu = Menu(fig[0,3], options=["World 1", "World 2", "World 3"], default = "World 1") -use_world_menu = true # Main.@infiltrate +menu = Menu(fig[0,1], options = zip(["Signal 0 World 1", "Signal 0 World 2", "Signal 0 World 3", "Signal 1 World 1", "Signal 2 World 2", "Signal 3 World 3"], +[0, 1, 2, 3, 4 ,5])) -# Plot scout allocation -# north_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_north) -# east_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_east) -# west_points = lift(x->get_random_point_within_ball(; radius = x*0.5, num_points = round(Int, 100*x)), scout_west) -# scatter!(ax_north, north_points, markersize = 15, color = (:orange, opacity)) -# scatter!(ax_east, east_points, markersize = 15, color = (:pink, opacity+0.2)) -# scatter!(ax_west, west_points, markersize = 15, color = (:green, opacity)) - -#TODO: Plot defense / attacker allocation - # Happens when menu changes or when priors change - -# TODO: change game when priors change game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1]), observable_r.observable, normalized_observable_p, game) @@ -392,103 +383,198 @@ b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1 # Create an array of observables from b_array # b_array_obs = [lift((x,i,j) -> x[Block(i)][j], b_array, i,j) for j in 1:3 for i in 1:10] -b_array_obs_f = (n, m) -> lift((x, i, j) -> x[Block(i)][j], b_array, n, m) -axes = [ax_north, ax_east, ax_west] -defender_colors = [(:orange, opacity), (:pink, opacity+.2), (:green, opacity)] +b_array_obs_f = (i, x) -> x[][Block(i)] +b_array_obs_f_block = (i) -> b_array[][Block(i)] + # Main.@infiltrate -on(signal_menu.selection, priority = 1) do signal - # print("signal menu selection") - if signal == 0 - use_world_menu = true - world_menu.selection = "World 1" - elseif signal == 1 - use_world_menu = false - world_menu.selection = "World 1" - elseif signal == 2 - use_world_menu = false - world_menu.selection = "World 2" - else #signal == 3 - use_world_menu = false - world_menu.selection = "World 3" +u_north = Observable(0.0) +u_east = Observable(0.0) +u_west = Observable(0.0) +v_north = Observable(0.0) +v_east = Observable(0.0) +v_west = Observable(0.0) + +on(b_array) do y + x = menu.selection[] + if x == 0 #s 0 w 1 + # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(5), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(5), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(5), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(5), digits=2)[3] + # v[] = round.(b_array_obs_f_block(5), digits=2) + elseif x == 1 + # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(6), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(1), digits=2) + # v[] = round.(b_array_obs_f_block(6), digits=2) + + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(6), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(6), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(6), digits=2)[3] + elseif x == 2 + # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(7), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(1), digits=2) + # v[] = round.(b_array_obs_f_block(7), digits=2) + + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(7), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(7), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(7), digits=2)[3] + elseif x == 3 + # draw_world(;u = b_array_obs_f_block(2), v = b_array_obs_f_block(8), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(1), digits=2) + # v[] = round.(b_array_obs_f_block(8), digits=2) + + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(8), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(8), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(8), digits=2)[3] + elseif x == 4 + # draw_world(;u = b_array_obs_f_block(3), v = b_array_obs_f_block(9), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(3), digits=2) + # v[] = round.(b_array_obs_f_block(9), digits=2) + u_north[] = round.(b_array_obs_f_block(3), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(3), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(3), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(9), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(9), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(9), digits=2)[3] + elseif x == 5 + # draw_world(;u = b_array_obs_f_block(4), v = b_array_obs_f_block(10), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(4), digits=2) + # v[] = round.(b_array_obs_f_block(10), digits=2) + u_north[] = round.(b_array_obs_f_block(4), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(4), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(4), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(10), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(10), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] end - # return Consume() end -on(world_menu.selection, priority = 0) do world - print("World menu selection " * world_menu.selection[]*"\n") - print("World menu selection " * world *"\n") - # Box(fig[1,2], color=(:white)) - # Box(fig[2,1], color=(:white)) - # Box(fig[2,3], color=(:white)) - #TODO make scatter functions use observables for points, instead of values. It is not refreshing. - # maybe enemy scatter overwrites defender scatter? - #TODO make world menu disappear when signal != 0 - #TODO make triangles not scatter - if use_world_menu # signal = 0 - # plotting defender (same for all worlds when signal = 0 - for idx in 1:3 - scatter!(axes[idx], b_array_obs_f(1, idx), b_array_obs_f(1, idx), - markersize = 15, color = defender_colors[idx]) - end - # plotting attacker, changes per world - if world == "World 1" - print("Using World: 1\n") - - for idx in 1:3 - scatter!(axes[idx], b_array_obs_f(5, idx), b_array_obs_f(5, idx), - markersize = 15, color = (:red, opacity)) - end - elseif world == "World 2" - print("Using World: 2\n") - for idx in 1:3 - scatter!(axes[idx], b_array_obs_f(6, idx), b_array_obs_f(6, idx), - markersize = 15, color = (:red, opacity)) - end - else # world == "World 3" - print("Using World: 3\n") - for idx in 1:3 - scatter!(axes[idx], b_array_obs_f(7, idx), b_array_obs_f(7, idx), - markersize = 15, color = (:red, opacity)) - end - end - - else - for idx in 1:3 - scatter!(axes[idx], b_array_obs_f(4 + signal_menu.selection[], idx), - b_array_obs_f(4 + signal_menu.selection[], idx), - markersize = 15, color = defender_colors(idx)) - end - for idx in 1:3 - scatter!(axes[idx], b_array_obs_f(7 + signal_menu.selection[], idx), - b_array_obs_f(7 + signal_menu.selection[], idx), - markersize = 15, color = (:red, opacity)) - end - # b_array.val[Block(1 + signal_menu.selection[])], - # v = b_array.val[Block(7 + signal_menu.selection[])], - # fig = fig, ax_n = ax_north, ax_e = ax_east, ax_w = ax_west) +on(menu.selection) do x + if x == 0 #s 0 w 1 + # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(5), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(5), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(5), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(5), digits=2)[3] + # v[] = round.(b_array_obs_f_block(5), digits=2) + elseif x == 1 + # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(6), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(1), digits=2) + # v[] = round.(b_array_obs_f_block(6), digits=2) + + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(6), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(6), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(6), digits=2)[3] + elseif x == 2 + # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(7), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(1), digits=2) + # v[] = round.(b_array_obs_f_block(7), digits=2) + + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(7), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(7), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(7), digits=2)[3] + elseif x == 3 + # draw_world(;u = b_array_obs_f_block(2), v = b_array_obs_f_block(8), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(1), digits=2) + # v[] = round.(b_array_obs_f_block(8), digits=2) + + u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(8), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(8), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(8), digits=2)[3] + elseif x == 4 + # draw_world(;u = b_array_obs_f_block(3), v = b_array_obs_f_block(9), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(3), digits=2) + # v[] = round.(b_array_obs_f_block(9), digits=2) + u_north[] = round.(b_array_obs_f_block(3), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(3), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(3), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(9), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(9), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(9), digits=2)[3] + elseif x == 5 + # draw_world(;u = b_array_obs_f_block(4), v = b_array_obs_f_block(10), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) + # u[] = round.(b_array_obs_f_block(4), digits=2) + # v[] = round.(b_array_obs_f_block(10), digits=2) + u_north[] = round.(b_array_obs_f_block(4), digits=2)[1] + u_east[] = round.(b_array_obs_f_block(4), digits=2)[2] + u_west[] = round.(b_array_obs_f_block(4), digits=2)[3] + + v_north[] = round.(b_array_obs_f_block(10), digits=2)[1] + v_east[] = round.(b_array_obs_f_block(10), digits=2)[2] + v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] end end +defender_triangle_north = @lift Point2f[(1 - $u_north, 0), (1 + $u_north, 0), (1, 1 * $u_north)] +enemy_triangle_north = @lift Point2f[(1 - $v_north, 2), (1 + $v_north, 2), (1, 2 - (1 * $v_north))] +poly!(ax_north, defender_triangle_north, color = (:orange, opacity)) +poly!(ax_north, enemy_triangle_north, color = (:red, opacity)) + +defender_triangle_east = @lift Point2f[(0, 1 - $u_east * 1), (0, 1 + 1 * $u_east), (1 * $u_east, 1)] +enemy_triangle_east = @lift Point2f[(2, 1 - $v_east * 1), (2, 1 + 1 * $v_east), (2 - (1 * $v_east), 1)] +poly!(ax_east, defender_triangle_east, color = (:orange, opacity)) +poly!(ax_east, enemy_triangle_east, color = (:red, opacity)) +defender_triangle_west = @lift Point2f[(2, 1 - $u_west * 1), (2, 1 + 1 * $u_west), (2 - 1 * $u_west, 1)] +enemy_triangle_west = @lift Point2f[(0, 1 - $v_west * 1), (0, 1 + 1 * $v_west), (1 - (1 * $v_west), 1)] +poly!(ax_west, defender_triangle_west, color = (:orange, opacity)) +poly!(ax_west, enemy_triangle_west, color = (:red, opacity)) -# scatter!(ax_north, north_points, markersize = 15, color = (:orange, opacity)) -# scatter!(ax_east, east_points, markersize = 15, color = (:pink, opacity+0.2)) -# scatter!(ax_west, west_points, markersize = 15, color = (:green, opacity)) +# scatter!(ax_east, u_east, u_east, markersize = 15, color = (:pink, opacity + .2)) +# scatter!(ax_west, u_west, u_west, markersize = 15, color = (:green, opacity)) + +# # scatter!(ax_north, v_north, v_north, markersize = 15, color = (:red, opacity)) +# scatter!(ax_east, v_east, v_east, markersize = 15, color = (:red, opacity)) +# scatter!(ax_west, v_west, v_west, markersize = 15, color = (:red, opacity)) display(fig, fullscreen = true) end function draw_world(;u, v, fig, ax_n, ax_e, ax_w) - u = round.(u, digits = 2) - v = round.(v, digits = 2) + # u = round.(u, digits = 2) + # v = round.(v, digits = 2) opacity = 0.5 - print("\nU:\n") - print(u) - print("\nV:\n") - print(v) + # print("\nU:\n") + # print(u) + # print("\nV:\n") + # print(v) scatter!(ax_n, u, u, markersize = 15, color = (:orange, opacity)) scatter!(ax_e, u, u, markersize = 15, color = (:pink, opacity + .2)) @@ -497,6 +583,7 @@ function draw_world(;u, v, fig, ax_n, ax_e, ax_w) scatter!(ax_n, v, v, markersize = 15, color = (:red, opacity)) scatter!(ax_e, v, v, markersize = 15, color = (:red, opacity)) scatter!(ax_w, v, v, markersize = 15, color = (:red, opacity)) + display(fig) end From 5b39fc7efdbab721d6beb604d4ab46ac05b62894 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Sun, 25 Feb 2024 17:02:55 -0600 Subject: [PATCH 27/35] fixed west plot breaking --- experiments/scout_visuals.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index ec7acf4..12fdcab 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -539,7 +539,7 @@ on(menu.selection) do x v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] end end - +@lift print("u: ", [$u_north, $u_east, $u_west], "\nv: ", [$v_north, $v_east, $v_west]) defender_triangle_north = @lift Point2f[(1 - $u_north, 0), (1 + $u_north, 0), (1, 1 * $u_north)] enemy_triangle_north = @lift Point2f[(1 - $v_north, 2), (1 + $v_north, 2), (1, 2 - (1 * $v_north))] poly!(ax_north, defender_triangle_north, color = (:orange, opacity)) @@ -551,7 +551,7 @@ poly!(ax_east, defender_triangle_east, color = (:orange, opacity)) poly!(ax_east, enemy_triangle_east, color = (:red, opacity)) defender_triangle_west = @lift Point2f[(2, 1 - $u_west * 1), (2, 1 + 1 * $u_west), (2 - 1 * $u_west, 1)] -enemy_triangle_west = @lift Point2f[(0, 1 - $v_west * 1), (0, 1 + 1 * $v_west), (1 - (1 * $v_west), 1)] +enemy_triangle_west = @lift Point2f[(0, 1 - $v_west * 1), (0, 1 + 1 * $v_west), (1 * $v_west, 1)] poly!(ax_west, defender_triangle_west, color = (:orange, opacity)) poly!(ax_west, enemy_triangle_west, color = (:red, opacity)) From 08ea65168fd2a14e041c7e0b83d79fcfe6d7eb80 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Sun, 25 Feb 2024 17:11:07 -0600 Subject: [PATCH 28/35] some clean up --- data.tmp | 1 - data2.tmp | 1 - experiments/data.tmp | 1 + experiments/scout_visuals.jl | 189 ++--------------------------------- 4 files changed, 8 insertions(+), 184 deletions(-) delete mode 100644 data.tmp delete mode 100644 data2.tmp create mode 100644 experiments/data.tmp diff --git a/data.tmp b/data.tmp deleted file mode 100644 index 266fab8..0000000 --- a/data.tmp +++ /dev/null @@ -1 +0,0 @@ -{"[0.6, 0.1, 0.6]":[1.0,0.0,0.0],"[0.4, 0.4, 0.9]":[0.5000000077505603,0.4999999922494396,0.0],"[0.5, 0.9, 0.3]":[1.0,0.0,0.0],"[0.2, 0.1, 0.3]":[1.0,0.0,0.0],"[0.8, 0.8, 0.8]":[0.33169342945663427,0.33541083897858137,0.3328957315647847],"[0.9, 0.0, 0.9]":[1.0,0.0,0.0],"[0.5, 0.5, 0.4]":[0.5000010169408886,0.4999989830591113,0.0],"[0.3, 0.2, 0.3]":[0.5000000006396236,0.0,0.4999999993603764],"[0.9, 0.4, 0.3]":[0.0,1.0,0.0],"[0.2, 0.6, 0.9]":[0.0,1.0,0.0],"[0.0, 0.5, 0.3]":[0.0,0.0,1.0],"[0.9, 0.7, 0.6]":[0.0,1.0,0.0],"[0.4, 0.9, 0.7]":[0.0,0.0,1.0],"[0.5, 0.6, 0.5]":[0.500000000000028,0.0,0.499999999999972],"[0.9, 0.8, 0.1]":[0.0,1.0,0.0],"[0.5, 0.3, 0.4]":[0.0,0.0,1.0],"[0.7, 0.7, 0.5]":[0.5019686180300313,0.49803138196996866,0.0],"[0.7, 0.8, 0.0]":[1.0,0.0,0.0],"[0.7, 0.0, 0.4]":[0.0,0.0,1.0],"[0.0, 0.3, 0.3]":[0.0,0.49999882569010157,0.5000011743098984],"[0.6, 0.8, 0.4]":[1.0,0.0,0.0],"[0.1, 0.2, 0.9]":[0.0,1.0,0.0],"[0.7, 0.9, 0.9]":[0.0,0.0,1.0],"[0.6, 0.6, 0.8]":[0.49999992129947635,0.5000000787005237,0.0],"[0.2, 0.2, 0.2]":[0.33333333333308035,0.33333333333184945,0.3333333333350703],"[0.6, 0.7, 0.0]":[1.0,0.0,0.0],"[0.4, 0.7, 0.8]":[0.0,1.0,0.0],"[0.9, 0.1, 0.6]":[0.0,0.0,1.0],"[0.1, 0.8, 0.3]":[0.0,0.0,1.0],"[0.8, 0.4, 0.4]":[0.0,0.500000180685116,0.499999819314884],"[0.3, 0.4, 0.5]":[0.0,1.0,0.0],"[0.6, 0.5, 0.5]":[0.0,0.4999999999998642,0.5000000000001358],"[0.7, 0.1, 0.5]":[0.0,0.0,1.0],"[0.0, 0.0, 0.7]":[0.2924750419847143,0.2924750419847143,0.41504991603057134],"[0.6, 0.1, 0.0]":[0.0,1.0,0.0],"[0.3, 0.8, 0.7]":[0.0,0.0,1.0],"[0.5, 0.2, 0.3]":[0.0,0.0,1.0],"[0.4, 0.1, 0.8]":[1.0,0.0,0.0],"[0.6, 0.3, 0.5]":[0.0,0.0,1.0],"[0.4, 0.0, 0.5]":[1.0,0.0,0.0],"[0.8, 0.5, 0.7]":[0.0,0.0,1.0],"[0.9, 0.8, 0.4]":[0.0,1.0,0.0],"[0.4, 0.2, 0.7]":[1.0,0.0,0.0],"[0.9, 0.6, 0.8]":[0.0,0.0,1.0],"[0.9, 0.7, 0.0]":[0.0,1.0,0.0],"[0.8, 0.3, 0.7]":[0.0,0.0,1.0],"[0.2, 0.4, 0.9]":[0.0,1.0,0.0],"[0.9, 0.5, 0.5]":[0.0,0.49990817332058657,0.5000918266794134],"[0.7, 0.2, 0.9]":[1.0,0.0,0.0],"[0.5, 0.4, 0.5]":[0.4999985389107886,0.0,0.5000014610892114],"[0.3, 0.9, 0.8]":[0.0,0.0,1.0],"[0.4, 0.9, 0.6]":[0.0,0.0,1.0],"[0.1, 0.6, 0.1]":[0.499999999999993,0.0,0.5000000000000071],"[0.0, 0.6, 0.2]":[0.0,0.0,1.0],"[0.7, 0.8, 0.3]":[1.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0],"[0.9, 0.3, 0.5]":[0.0,0.0,1.0],"[0.6, 0.9, 0.2]":[1.0,0.0,0.0],"[0.6, 0.4, 0.8]":[1.0,0.0,0.0],"[0.5, 0.8, 0.7]":[0.0,0.0,1.0],"[0.8, 0.8, 0.9]":[0.0,1.0,0.0],"[0.2, 0.9, 0.7]":[0.0,0.0,1.0],"[0.6, 0.7, 0.3]":[1.0,0.0,0.0],"[0.0, 0.0, 0.6]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.9, 0.5]":[1.0,0.0,0.0],"[0.1, 0.5, 0.2]":[0.0,0.0,1.0],"[0.2, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.8, 0.6]":[0.0,0.0,1.0],"[0.6, 0.1, 0.3]":[0.0,0.0,1.0],"[0.8, 0.7, 0.1]":[0.0,1.0,0.0],"[0.1, 0.3, 0.2]":[0.0,0.0,1.0],"[0.3, 0.0, 0.1]":[0.0,0.0,1.0],"[0.6, 0.6, 0.9]":[0.4994988515805705,0.5005011484194295,0.0],"[0.8, 0.5, 0.6]":[0.0,0.0,1.0],"[0.4, 0.7, 0.9]":[0.0,1.0,0.0],"[0.5, 0.9, 0.8]":[0.0,0.0,1.0],"[0.2, 0.1, 0.8]":[1.0,0.0,0.0],"[0.9, 0.9, 0.2]":[0.0,1.0,0.0],"[0.1, 0.6, 0.4]":[0.0,0.0,1.0],"[0.3, 0.2, 0.8]":[1.0,0.0,0.0],"[0.4, 0.2, 0.6]":[1.0,0.0,0.0],"[0.9, 0.4, 0.8]":[0.0,0.0,1.0],"[0.8, 0.1, 0.1]":[0.0,0.5,0.4999999999999999],"[0.7, 0.6, 0.1]":[0.0,1.0,0.0],"[0.4, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.7, 0.3]":[0.0,1.0,0.0],"[0.2, 0.0, 0.5]":[1.0,0.0,0.0],"[0.0, 0.5, 0.8]":[0.0,1.0,0.0],"[0.8, 0.3, 0.6]":[0.0,0.0,1.0],"[0.4, 0.1, 0.9]":[1.0,0.0,0.0],"[0.6, 0.2, 0.2]":[0.0,0.49999999999230316,0.5000000000076967],"[0.2, 0.2, 0.7]":[0.49999999684535534,0.5000000031546447,0.0],"[0.1, 0.4, 0.1]":[0.5,0.0,0.5000000000000001],"[0.0, 0.4, 0.2]":[0.0,0.0,1.0],"[0.0, 0.8, 0.5]":[0.0,0.0,1.0],"[0.9, 0.1, 0.3]":[0.0,0.0,1.0],"[0.0, 0.3, 0.8]":[0.0,1.0,0.0],"[0.8, 0.2, 0.5]":[0.0,0.0,1.0],"[0.4, 0.5, 0.1]":[1.0,0.0,0.0],"[0.8, 0.0, 0.2]":[0.0,0.0,1.0],"[0.7, 0.5, 0.2]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.5, 0.8, 0.6]":[0.0,0.0,1.0],"[0.2, 0.9, 0.6]":[0.0,0.0,1.0],"[0.9, 0.6, 0.9]":[1.0,0.0,0.0],"[0.1, 0.8, 0.8]":[0.0,0.0,1.0],"[0.5, 0.0, 0.1]":[0.0,0.0,1.0],"[0.8, 0.7, 0.4]":[0.0,1.0,0.0],"[0.3, 0.7, 0.5]":[0.0,0.0,1.0],"[0.3, 0.8, 0.0]":[1.0,0.0,0.0],"[0.3, 0.0, 0.4]":[1.0,0.0,0.0],"[0.4, 0.3, 0.1]":[0.0,1.0,0.0],"[0.7, 0.3, 0.2]":[0.0,1.0,0.0],"[0.3, 0.9, 0.9]":[0.0,1.0,0.0],"[0.8, 0.5, 0.0]":[0.0,1.0,0.0],"[0.5, 0.2, 0.8]":[1.0,0.0,0.0],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.4, 0.8, 0.2]":[1.0,0.0,0.0],"[0.9, 0.2, 0.2]":[0.0,0.49999999999999944,0.5000000000000006],"[0.8, 0.1, 0.4]":[0.0,0.0,1.0],"[0.3, 0.1, 0.5]":[1.0,0.0,0.0],"[0.7, 0.6, 0.4]":[0.0,1.0,0.0],"[0.4, 0.2, 0.0]":[0.0,1.0,0.0],"[0.6, 0.4, 0.9]":[1.0,0.0,0.0],"[0.8, 0.3, 0.0]":[0.0,1.0,0.0],"[0.1, 0.4, 0.4]":[0.0,0.5000054138479915,0.4999945861520084],"[0.7, 0.4, 0.1]":[0.0,1.0,0.0],"[0.0, 0.6, 0.7]":[0.0,1.0,0.0],"[0.4, 0.9, 0.3]":[1.0,0.0,0.0],"[0.4, 0.5, 0.4]":[0.525511614814011,0.0,0.4744883851859889],"[0.2, 0.7, 0.9]":[0.0,1.0,0.0],"[0.6, 0.9, 0.7]":[0.0,0.0,1.0],"[0.2, 0.2, 0.6]":[0.4999999999923366,0.5000000000076634,0.0],"[0.5, 0.7, 0.5]":[0.48818461446100414,0.0,0.5118153855389957],"[0.5, 0.8, 0.0]":[1.0,0.0,0.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.5, 0.0, 0.4]":[0.0,0.0,1.0],"[0.7, 0.8, 0.8]":[0.0,0.0,1.0],"[0.4, 0.6, 0.5]":[0.0,0.0,1.0],"[0.1, 0.5, 0.7]":[0.0,1.0,0.0],"[0.4, 0.3, 0.4]":[0.49999997951431263,0.0,0.5000000204856874],"[0.5, 0.9, 0.9]":[0.0,1.0,0.0],"[0.2, 0.1, 0.9]":[1.0,0.0,0.0],"[0.0, 0.0, 0.3]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.2, 0.9]":[1.0,0.0,0.0],"[0.9, 0.4, 0.9]":[0.0,0.0,1.0],"[0.5, 0.1, 0.5]":[0.5004627141978825,0.0,0.49953728580211754],"[0.0, 0.9, 0.4]":[0.0,0.0,1.0],"[0.0, 0.2, 0.1]":[0.0,0.0,1.0],"[0.0, 0.5, 0.9]":[0.0,1.0,0.0],"[0.3, 0.8, 0.3]":[0.5000000000004963,0.0,0.49999999999950373],"[0.2, 0.5, 0.1]":[1.0,0.0,0.0],"[0.1, 0.3, 0.7]":[0.0,1.0,0.0],"[0.6, 0.1, 0.8]":[1.0,0.0,0.0],"[0.8, 0.5, 0.3]":[0.0,1.0,0.0],"[0.0, 0.3, 0.9]":[0.0,1.0,0.0],"[0.9, 0.9, 0.7]":[1.0,0.0,0.0],"[0.7, 0.4, 0.4]":[0.0,0.5000010324180174,0.4999989675819826],"[0.2, 0.3, 0.1]":[1.0,0.0,0.0],"[0.6, 0.0, 0.5]":[0.0,0.0,1.0],"[0.4, 0.2, 0.3]":[0.0,0.0,1.0],"[0.1, 0.8, 0.9]":[0.0,1.0,0.0],"[0.8, 0.3, 0.3]":[0.0,0.49999999999999944,0.5000000000000004],"[0.6, 0.2, 0.7]":[1.0,0.0,0.0],"[0.2, 0.8, 0.2]":[0.49999999999999967,0.0,0.5000000000000003],"[0.0, 0.4, 0.7]":[0.0,1.0,0.0],"[0.9, 0.7, 0.8]":[0.0,0.0,1.0],"[0.0, 0.6, 0.6]":[0.0,1.0,0.0],"[0.1, 0.9, 0.5]":[0.0,0.0,1.0],"[0.2, 0.2, 0.0]":[0.49999999999999967,0.5000000000000002,0.0],"[0.5, 0.2, 0.9]":[1.0,0.0,0.0],"[0.8, 0.0, 0.7]":[0.0,0.0,1.0],"[0.7, 0.5, 0.7]":[0.49915287649094453,0.0,0.5008471235090552],"[0.6, 0.9, 0.6]":[0.5005013648897552,0.0,0.49949863511024484],"[0.1, 0.7, 0.1]":[0.4999999999999998,0.0,0.5000000000000002],"[0.5, 0.8, 0.3]":[1.0,0.0,0.0],"[0.0, 0.7, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.3]":[0.0,0.0,1.0],"[0.0, 0.2, 0.4]":[0.0,1.0,0.0],"[0.3, 0.6, 0.1]":[1.0,0.0,0.0],"[0.9, 0.1, 0.8]":[0.0,0.0,1.0],"[0.4, 0.4, 0.5]":[0.5255116166193949,0.47448838338060517,0.0],"[0.2, 0.5, 0.4]":[0.0,0.0,1.0],"[0.1, 0.5, 0.6]":[0.0,1.0,0.0],"[0.7, 0.3, 0.7]":[0.45129020446250856,0.0,0.5487097955374914],"[0.9, 0.0, 0.5]":[0.0,0.0,1.0],"[0.1, 0.1, 0.1]":[0.3333333333333334,0.3333333333333333,0.33333333333333337],"[0.0, 0.1, 0.2]":[0.0,1.0,0.0],"[0.4, 0.8, 0.7]":[0.0,0.0,1.0],"[0.2, 0.6, 0.5]":[0.0,0.0,1.0],"[0.9, 0.2, 0.7]":[0.0,0.0,1.0],"[0.2, 0.3, 0.4]":[0.0,1.0,0.0],"[0.1, 0.3, 0.6]":[0.0,1.0,0.0],"[0.3, 0.5, 0.2]":[1.0,0.0,0.0],"[0.7, 0.8, 0.9]":[0.0,1.0,0.0],"[0.9, 0.9, 0.6]":[0.0,1.0,0.0],"[0.1, 0.2, 0.5]":[0.0,1.0,0.0],"[0.8, 0.6, 0.2]":[0.0,1.0,0.0],"[0.1, 0.0, 0.2]":[1.0,0.0,0.0],"[0.7, 0.9, 0.5]":[1.0,0.0,0.0],"[0.3, 0.3, 0.2]":[0.5000000008141167,0.49999999918588334,0.0],"[0.0, 0.6, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.7, 0.9]":[0.0,1.0,0.0],"[0.6, 0.2, 0.6]":[0.47922117945743936,0.0,0.5207788205425606],"[0.5, 0.6, 0.1]":[1.0,0.0,0.0],"[0.6, 0.9, 0.0]":[1.0,0.0,0.0],"[0.1, 0.7, 0.4]":[0.0,0.0,1.0],"[0.0, 0.4, 0.6]":[0.0,1.0,0.0],"[0.4, 0.9, 0.8]":[0.0,0.0,1.0],"[0.7, 0.7, 0.1]":[1.0,0.0,0.0],"[0.3, 0.6, 0.4]":[0.0,0.0,1.0],"[0.2, 0.2, 0.3]":[0.4999902353156671,0.5000097646843329,0.0],"[0.6, 0.1, 0.9]":[1.0,0.0,0.0],"[0.8, 0.0, 0.6]":[0.0,0.0,1.0],"[0.7, 0.5, 0.6]":[0.0,0.0,1.0],"[0.1, 0.5, 0.0]":[1.0,0.0,0.0],"[0.1, 0.1, 0.4]":[0.5000000000000002,0.4999999999999998,0.0],"[0.3, 0.4, 0.1]":[1.0,0.0,0.0],"[0.6, 0.5, 0.1]":[0.0,1.0,0.0],"[0.7, 0.1, 0.1]":[0.0,0.4999999999999931,0.5000000000000069],"[0.5, 0.5, 0.2]":[0.4999533720258884,0.5000466279741116,0.0],"[0.0, 0.0, 0.8]":[0.30001451754304154,0.30001451754304154,0.39997096491391704],"[0.7, 0.3, 0.6]":[0.0,0.0,1.0],"[0.1, 0.3, 0.0]":[1.0,0.0,0.0],"[0.9, 0.7, 0.9]":[1.0,0.0,0.0],"[0.3, 0.8, 0.8]":[0.0,0.0,1.0],"[0.4, 0.8, 0.6]":[0.0,0.0,1.0],"[0.2, 0.4, 0.5]":[0.0,1.0,0.0],"[0.6, 0.3, 0.1]":[0.0,1.0,0.0],"[0.5, 0.3, 0.2]":[0.0,1.0,0.0],"[0.9, 0.2, 0.6]":[0.0,0.0,1.0],"[0.9, 0.9, 0.0]":[0.0,1.0,0.0],"[0.4, 0.0, 0.1]":[0.0,0.0,1.0],"[0.7, 0.2, 0.5]":[0.0,0.0,1.0],"[0.7, 0.0, 0.2]":[0.0,0.0,1.0],"[0.8, 0.5, 0.8]":[1.0,0.0,0.0],"[0.6, 0.8, 0.2]":[1.0,0.0,0.0],"[0.9, 0.1, 0.9]":[1.0,0.0,0.0],"[0.2, 0.8, 0.7]":[0.0,0.0,1.0],"[0.5, 0.6, 0.4]":[1.0,0.0,0.0],"[0.6, 0.2, 0.0]":[0.0,1.0,0.0],"[0.7, 0.7, 0.4]":[0.4992843517430079,0.500715648256992,0.0],"[0.4, 0.2, 0.8]":[1.0,0.0,0.0],"[0.8, 0.4, 0.2]":[0.0,1.0,0.0],"[0.0, 0.4, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.8, 0.5]":[1.0,0.0,0.0],"[0.0, 0.6, 0.3]":[0.0,0.0,1.0],"[0.8, 0.3, 0.8]":[0.0,0.0,1.0],"[0.9, 0.5, 0.1]":[0.0,1.0,0.0],"[0.8, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.5, 0.4, 0.1]":[0.0,1.0,0.0],"[0.7, 0.5, 0.0]":[0.0,1.0,0.0],"[0.6, 0.9, 0.3]":[1.0,0.0,0.0],"[0.0, 0.7, 0.7]":[0.0,0.0,1.0],"[0.3, 0.4, 0.4]":[0.0,0.5000000160599674,0.49999998394003264],"[0.6, 0.5, 0.4]":[0.0,1.0,0.0],"[0.7, 0.1, 0.4]":[0.0,0.0,1.0],"[0.9, 0.3, 0.1]":[0.0,1.0,0.0],"[0.1, 0.5, 0.3]":[0.0,0.0,1.0],"[0.7, 0.3, 0.0]":[0.0,1.0,0.0],"[0.5, 0.8, 0.8]":[0.0,0.0,1.0],"[0.2, 0.9, 0.8]":[0.0,0.0,1.0],"[0.6, 0.6, 0.5]":[0.4997338610506261,0.5002661389493739,0.0],"[0.9, 0.8, 0.2]":[0.0,1.0,0.0],"[0.0, 0.1, 0.7]":[0.0,1.0,0.0],"[0.6, 0.3, 0.4]":[0.0,0.0,1.0],"[0.8, 0.9, 0.1]":[1.0,0.0,0.0],"[0.4, 0.7, 0.5]":[0.0,0.0,1.0],"[0.4, 0.8, 0.0]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.4, 0.0, 0.4]":[0.49967103916341193,0.0,0.5003289608365882],"[0.3, 0.5, 0.7]":[0.0,1.0,0.0],"[0.1, 0.3, 0.3]":[0.0,0.5000000157945836,0.49999998420541647],"[0.4, 0.9, 0.9]":[0.0,1.0,0.0],"[0.4, 0.1, 0.5]":[1.0,0.0,0.0],"[0.8, 0.6, 0.7]":[0.0,0.0,1.0],"[0.1, 0.0, 0.7]":[1.0,0.0,0.0],"[0.9, 0.9, 0.3]":[0.0,1.0,0.0],"[0.3, 0.3, 0.7]":[0.49999998057494255,0.5000000194250575,0.0],"[0.9, 0.5, 0.4]":[0.0,1.0,0.0],"[0.5, 0.4, 0.4]":[0.0,0.5255116158680251,0.4744883841319749],"[0.2, 0.8, 0.6]":[0.0,0.0,1.0],"[0.6, 0.2, 0.3]":[0.0,0.0,1.0],"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.2, 0.0, 0.1]":[0.0,0.0,1.0],"[0.0, 0.4, 0.3]":[0.0,0.0,1.0],"[0.9, 0.6, 0.5]":[0.0,1.0,0.0],"[0.9, 0.3, 0.4]":[0.0,0.0,1.0],"[0.3, 0.8, 0.9]":[0.0,1.0,0.0],"[0.8, 0.0, 0.3]":[0.0,0.0,1.0],"[0.7, 0.5, 0.3]":[0.0,1.0,0.0],"[0.2, 0.2, 0.8]":[0.5000000000000006,0.49999999999999944,0.0],"[0.0, 0.7, 0.6]":[0.0,0.0,1.0],"[0.0, 0.8, 0.1]":[0.0,0.0,1.0],"[0.8, 0.9, 0.4]":[1.0,0.0,0.0],"[0.3, 0.9, 0.5]":[0.0,0.0,1.0],"[0.5, 0.5, 0.7]":[0.5118154575601646,0.48818454243983567,0.0],"[0.8, 0.2, 0.1]":[0.0,1.0,0.0],"[0.8, 0.5, 0.9]":[1.0,0.0,0.0],"[0.7, 0.3, 0.3]":[0.0,0.5000000194235866,0.49999998057641337],"[0.4, 0.2, 0.9]":[1.0,0.0,0.0],"[0.6, 0.4, 0.5]":[0.0,0.0,1.0],"[0.3, 0.7, 0.1]":[1.0,0.0,0.0],"[0.0, 0.1, 0.6]":[0.0,1.0,0.0],"[0.1, 0.6, 0.2]":[0.0,0.0,1.0],"[0.5, 0.3, 0.7]":[1.0,0.0,0.0],"[0.8, 0.3, 0.9]":[1.0,0.0,0.0],"[0.4, 0.8, 0.3]":[1.0,0.0,0.0],"[0.9, 0.2, 0.3]":[0.0,0.0,1.0],"[0.3, 0.5, 0.6]":[0.0,1.0,0.0],"[0.7, 0.0, 0.7]":[0.0,0.0,1.0],"[0.6, 0.8, 0.7]":[0.0,0.0,1.0],"[0.2, 0.7, 0.5]":[0.0,0.0,1.0],"[0.2, 0.8, 0.0]":[1.0,0.0,0.0],"[0.3, 0.1, 0.1]":[0.0,0.5000000000003715,0.49999999999962863],"[0.8, 0.4, 0.7]":[0.0,0.0,1.0],"[0.2, 0.0, 0.4]":[1.0,0.0,0.0],"[0.8, 0.6, 0.6]":[0.0,0.5000003394252299,0.4999996605747701],"[0.1, 0.0, 0.6]":[1.0,0.0,0.0],"[0.3, 0.3, 0.6]":[0.49977501833596605,0.500224981664034,0.0],"[0.5, 0.8, 0.9]":[0.0,1.0,0.0],"[0.2, 0.9, 0.9]":[0.0,0.0,1.0],"[0.5, 0.9, 0.5]":[0.49990816607341304,0.0,0.500091833926587],"[0.0, 0.8, 0.4]":[0.0,0.0,1.0],"[0.2, 0.1, 0.5]":[1.0,0.0,0.0],"[0.8, 0.7, 0.2]":[0.0,1.0,0.0],"[0.0, 0.6, 0.8]":[0.0,1.0,0.0],"[0.0, 0.7, 0.0]":[0.3000481869141004,0.39990362617179914,0.3000481869141004],"[0.8, 0.2, 0.4]":[0.0,0.0,1.0],"[0.3, 0.2, 0.5]":[1.0,0.0,0.0],"[0.9, 0.4, 0.5]":[0.0,0.0,1.0],"[0.3, 0.0, 0.2]":[0.0,0.0,1.0],"[0.0, 0.5, 0.5]":[0.0,0.544461608176789,0.455538391823211],"[0.6, 0.9, 0.8]":[0.0,0.0,1.0],"[0.5, 0.7, 0.1]":[1.0,0.0,0.0],"[0.3, 0.7, 0.4]":[0.0,0.0,1.0],"[0.9, 0.8, 0.7]":[0.0,1.0,0.0],"[0.4, 0.6, 0.1]":[1.0,0.0,0.0],"[0.5, 0.5, 0.6]":[0.4999999999999254,0.5000000000000747,0.0],"[0.8, 0.1, 0.2]":[0.0,0.0,1.0],"[0.7, 0.6, 0.2]":[0.0,1.0,0.0],"[0.0, 0.1, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.5, 0.8]":[0.0,1.0,0.0],"[0.0, 0.3, 0.5]":[0.0,1.0,0.0],"[0.3, 0.5, 0.0]":[1.0,0.0,0.0],"[0.5, 0.1, 0.1]":[0.0,0.5000000000000002,0.4999999999999998],"[0.1, 0.4, 0.2]":[0.0,0.0,1.0],"[0.3, 0.1, 0.4]":[1.0,0.0,0.0],"[0.5, 0.3, 0.6]":[1.0,0.0,0.0],"[0.1, 0.8, 0.5]":[0.0,0.0,1.0],"[0.1, 0.3, 0.8]":[0.0,1.0,0.0],"[0.7, 0.0, 0.6]":[0.0,0.0,1.0],"[0.4, 0.5, 0.2]":[1.0,0.0,0.0],"[0.8, 0.6, 0.0]":[0.0,1.0,0.0],"[0.1, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.3, 0.3, 0.0]":[0.4999996330701194,0.5000003669298807,0.0],"[0.2, 0.2, 0.9]":[0.49999999999999956,0.5000000000000004,0.0],"[0.6, 0.8, 0.6]":[0.5000000159064093,0.0,0.4999999840935909],"[0.5, 0.2, 0.5]":[0.5000438751874834,0.0,0.4999561248125166],"[0.2, 0.8, 0.3]":[0.0,0.0,1.0],"[0.6, 0.0, 0.1]":[0.0,0.0,1.0],"[0.5, 0.0, 0.2]":[0.0,0.0,1.0],"[0.8, 0.4, 0.6]":[0.0,0.0,1.0],"[0.9, 0.9, 0.8]":[0.0,1.0,0.0],"[0.4, 0.3, 0.2]":[0.0,1.0,0.0],"[0.5, 0.7, 0.4]":[1.0,0.0,0.0],"[0.6, 0.2, 0.8]":[1.0,0.0,0.0],"[0.1, 0.9, 0.1]":[0.5,0.0,0.5],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.0, 0.4, 0.8]":[0.0,1.0,0.0],"[0.4, 0.6, 0.4]":[0.5000013004714524,0.0,0.4999986995285476],"[0.0, 0.7, 0.3]":[0.0,0.0,1.0],"[0.5, 0.5, 0.0]":[0.38602213002540053,0.6139778699745995,0.0],"[0.8, 0.0, 0.8]":[1.0,0.0,0.0],"[0.7, 0.5, 0.8]":[1.0,0.0,0.0],"[0.5, 0.1, 0.4]":[0.0,0.0,1.0],"[0.9, 0.8, 0.6]":[0.0,1.0,0.0],"[0.4, 0.4, 0.1]":[0.49998961436166756,0.5000103856383324,0.0],"[0.1, 0.6, 0.7]":[0.0,1.0,0.0],"[0.7, 0.4, 0.2]":[0.0,1.0,0.0],"[0.0, 0.1, 0.3]":[0.0,1.0,0.0],"[0.7, 0.8, 0.5]":[1.0,0.0,0.0],"[0.5, 0.3, 0.0]":[0.0,1.0,0.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[0.7, 0.3, 0.8]":[1.0,0.0,0.0],"[0.3, 0.5, 0.3]":[0.5000012339347999,0.0,0.4999987660652002],"[0.7, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.6, 0.9]":[0.0,1.0,0.0],"[0.6, 0.7, 0.5]":[1.0,0.0,0.0],"[0.6, 0.8, 0.0]":[1.0,0.0,0.0],"[0.2, 0.6, 0.1]":[1.0,0.0,0.0],"[0.4, 0.8, 0.8]":[0.0,0.8885595996419731,0.11144040035802694],"[0.6, 0.0, 0.4]":[0.0,0.0,1.0],"[0.9, 0.2, 0.8]":[0.0,0.0,1.0],"[0.6, 0.9, 0.9]":[0.0,0.0,1.0],"[0.8, 0.4, 0.0]":[0.0,1.0,0.0],"[0.8, 0.6, 0.3]":[0.0,1.0,0.0],"[0.1, 0.0, 0.3]":[1.0,0.0,0.0],"[0.3, 0.3, 0.3]":[0.33333333340668475,0.33333333324390607,0.33333333334940923],"[0.6, 0.1, 0.5]":[0.0,0.0,1.0],"[0.1, 0.9, 0.4]":[0.0,0.0,1.0],"[0.1, 0.2, 0.1]":[0.5000002427577386,0.0,0.4999997572422614],"[0.0, 0.2, 0.2]":[0.0,0.4999999995779131,0.5000000004220869],"[0.1, 0.5, 0.9]":[0.0,1.0,0.0],"[0.7, 0.9, 0.1]":[1.0,0.0,0.0],"[0.8, 0.7, 0.7]":[0.0,1.0,0.0],"[0.2, 0.5, 0.2]":[0.5000066303213249,0.0,0.49999336967867514],"[0.3, 0.0, 0.7]":[1.0,0.0,0.0],"[0.1, 0.3, 0.9]":[0.0,1.0,0.0],"[0.4, 0.4, 0.4]":[0.33333332827294304,0.33333333623744255,0.3333333354896144],"[0.2, 0.3, 0.2]":[0.5000097646839672,0.0,0.4999902353160328],"[0.8, 0.1, 0.7]":[0.0,0.0,1.0],"[0.7, 0.6, 0.7]":[0.46944641094303496,0.0,0.530553589056965],"[0.9, 0.7, 0.5]":[0.0,1.0,0.0],"[0.9, 0.8, 0.0]":[0.0,1.0,0.0],"[0.5, 0.5, 0.3]":[0.4999990599094176,0.5000009400905823,0.0],"[0.9, 0.0, 0.4]":[0.0,0.0,1.0],"[0.9, 0.9, 0.9]":[0.28924749591705357,0.37907426662590604,0.33167823745704084],"[0.1, 0.4, 0.7]":[0.0,1.0,0.0],"[0.2, 0.6, 0.4]":[0.0,0.0,1.0],"[0.1, 0.6, 0.6]":[0.0,1.0,0.0],"[0.9, 0.1, 0.5]":[0.0,0.0,1.0],"[0.5, 0.3, 0.3]":[0.0,0.49999876604950166,0.5000012339504983],"[0.6, 0.2, 0.9]":[1.0,0.0,0.0],"[0.4, 0.5, 0.7]":[0.0,1.0,0.0],"[0.0, 0.4, 0.9]":[0.0,1.0,0.0],"[0.7, 0.0, 0.3]":[0.0,0.0,1.0],"[0.2, 0.4, 0.1]":[1.0,0.0,0.0],"[0.6, 0.8, 0.3]":[1.0,0.0,0.0],"[0.1, 0.7, 0.2]":[0.0,0.0,1.0],"[0.1, 0.2, 0.4]":[0.0,1.0,0.0],"[0.3, 0.6, 0.2]":[1.0,0.0,0.0],"[0.5, 0.0, 0.7]":[1.0,0.0,0.0],"[0.7, 0.9, 0.4]":[1.0,0.0,0.0],"[0.8, 0.0, 0.9]":[1.0,0.0,0.0],"[0.7, 0.2, 0.1]":[0.0,1.0,0.0],"[0.7, 0.5, 0.9]":[1.0,0.0,0.0],"[0.8, 0.4, 0.3]":[0.0,1.0,0.0],"[0.4, 0.3, 0.7]":[1.0,0.0,0.0],"[0.2, 0.8, 0.8]":[0.0,1.0,0.0],"[0.1, 0.1, 0.2]":[0.500000242757725,0.49999975724227497,0.0],"[0.0, 0.9, 0.7]":[0.0,0.0,1.0],"[0.8, 0.7, 0.6]":[0.0,1.0,0.0],"[0.8, 0.8, 0.1]":[1.0,0.0,0.0],"[0.7, 0.3, 0.9]":[1.0,0.0,0.0],"[0.3, 0.0, 0.6]":[1.0,0.0,0.0],"[0.4, 0.8, 0.9]":[0.0,1.0,0.0],"[0.9, 0.2, 0.9]":[1.0,0.0,0.0],"[0.0, 0.7, 0.8]":[0.0,1.0,0.0],"[0.7, 0.4, 0.7]":[0.4791085464336984,0.0,0.5208914535663016],"[0.8, 0.1, 0.6]":[0.0,0.0,1.0],"[0.7, 0.6, 0.6]":[0.0,0.5071850249899206,0.4928149750100794],"[0.4, 0.9, 0.5]":[0.0,0.0,1.0],"[0.9, 0.8, 0.3]":[0.0,1.0,0.0],"[0.1, 0.6, 0.0]":[1.0,0.0,0.0],"[0.6, 0.6, 0.1]":[1.0,0.0,0.0],"[0.2, 0.4, 0.4]":[0.0,0.4999999648586688,0.5000000351413313],"[0.5, 0.6, 0.2]":[1.0,0.0,0.0],"[0.1, 0.4, 0.6]":[0.0,1.0,0.0],"[0.4, 0.7, 0.1]":[1.0,0.0,0.0],"[0.0, 0.1, 0.8]":[0.0,1.0,0.0],"[0.7, 0.7, 0.2]":[1.0,0.0,0.0],"[0.7, 0.2, 0.4]":[0.0,0.0,1.0],"[0.3, 0.5, 0.8]":[0.0,1.0,0.0],"[0.4, 0.5, 0.6]":[0.0,1.0,0.0],"[0.0, 0.0, 0.5]":[0.3333262234652497,0.3333262234652497,0.3333475530695007],"[0.3, 0.4, 0.2]":[1.0,0.0,0.0],"[0.4, 0.1, 0.1]":[0.0,0.4999999999999999,0.5000000000000002],"[0.0, 0.2, 0.7]":[0.0,1.0,0.0],"[0.5, 0.0, 0.6]":[1.0,0.0,0.0],"[0.6, 0.5, 0.2]":[0.0,1.0,0.0],"[0.3, 0.8, 0.5]":[0.0,0.0,1.0],"[0.7, 0.1, 0.2]":[0.0,0.0,1.0],"[0.8, 0.8, 0.4]":[1.0,0.0,0.0],"[0.8, 0.6, 0.8]":[0.0,0.0,1.0],"[0.2, 0.5, 0.7]":[0.0,1.0,0.0],"[0.1, 0.0, 0.8]":[1.0,0.0,0.0],"[0.8, 0.7, 0.0]":[0.0,1.0,0.0],"[0.3, 0.3, 0.8]":[0.49999999999999944,0.5000000000000006,0.0],"[0.4, 0.3, 0.6]":[1.0,0.0,0.0],"[0.3, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.5, 0.5]":[0.0,0.5004560941487721,0.4995439058512281],"[0.0, 0.9, 0.6]":[0.0,0.0,1.0],"[0.6, 0.3, 0.2]":[0.0,1.0,0.0],"[0.9, 0.6, 0.1]":[0.0,1.0,0.0],"[0.2, 0.3, 0.7]":[0.0,1.0,0.0],"[0.4, 0.2, 0.5]":[1.0,0.0,0.0],"[0.4, 0.0, 0.2]":[0.0,0.0,1.0],"[0.8, 0.1, 0.0]":[0.0,1.0,0.0],"[0.7, 0.6, 0.0]":[0.0,1.0,0.0],"[0.8, 0.3, 0.5]":[0.0,0.0,1.0],"[0.6, 0.6, 0.4]":[0.5001308373863612,0.4998691626136389,0.0],"[0.3, 0.9, 0.1]":[1.0,0.0,0.0],"[0.4, 0.7, 0.4]":[0.5000010322604801,0.0,0.49999896773952],"[0.7, 0.4, 0.6]":[0.0,0.0,1.0],"[0.1, 0.4, 0.0]":[1.0,0.0,0.0],"[0.5, 0.5, 0.8]":[0.49954388457016474,0.5004561154298353,0.0],"[0.1, 0.6, 0.3]":[0.0,0.0,1.0],"[0.2, 0.8, 0.9]":[0.0,1.0,0.0],"[0.9, 0.5, 0.2]":[0.0,1.0,0.0],"[0.4, 0.5, 0.0]":[1.0,0.0,0.0],"[0.6, 0.4, 0.1]":[0.0,1.0,0.0],"[0.5, 0.4, 0.2]":[0.0,1.0,0.0],"[0.5, 0.8, 0.5]":[0.5004560693003455,0.0,0.49954393069965475],"[0.1, 0.7, 0.7]":[0.0,1.0,0.0],"[0.2, 0.9, 0.5]":[0.0,0.0,1.0],"[0.4, 0.1, 0.4]":[0.49999528746039235,0.0,0.5000047125396077],"[0.3, 0.6, 0.7]":[0.0,1.0,0.0],"[0.5, 0.3, 0.8]":[1.0,0.0,0.0],"[0.5, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.3, 0.2]":[0.0,1.0,0.0],"[0.7, 0.0, 0.8]":[1.0,0.0,0.0],"[0.4, 0.3, 0.0]":[0.0,1.0,0.0],"[0.0, 0.7, 0.9]":[0.0,1.0,0.0],"[0.6, 0.8, 0.8]":[0.0,1.0,0.0],"[0.2, 0.7, 0.1]":[1.0,0.0,0.0],"[0.1, 0.1, 0.7]":[0.5000000000000001,0.4999999999999998,0.0],"[0.0, 0.2, 0.6]":[0.0,1.0,0.0],"[0.8, 0.9, 0.2]":[1.0,0.0,0.0],"[0.8, 0.4, 0.8]":[0.1641984301674213,0.0,0.8358015698325787],"[0.9, 0.6, 0.4]":[0.0,1.0,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.2, 0.5, 0.6]":[0.0,1.0,0.0],"[0.8, 0.7, 0.3]":[0.0,1.0,0.0],"[0.3, 0.0, 0.3]":[0.49999954307919015,0.0,0.5000004569208099],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.5, 0.9, 0.1]":[1.0,0.0,0.0],"[0.2, 0.1, 0.1]":[0.0,0.5000002427577411,0.499999757242259],"[0.3, 0.9, 0.4]":[0.0,0.0,1.0],"[0.3, 0.2, 0.1]":[0.0,1.0,0.0],"[0.9, 0.4, 0.1]":[0.0,1.0,0.0],"[0.3, 0.5, 0.9]":[0.0,1.0,0.0],"[0.2, 0.3, 0.6]":[0.0,1.0,0.0],"[0.7, 0.4, 0.0]":[0.0,1.0,0.0],"[0.8, 0.1, 0.3]":[0.0,0.0,1.0],"[0.0, 0.5, 0.1]":[0.0,0.0,1.0],"[0.7, 0.6, 0.3]":[0.0,1.0,0.0],"[0.6, 0.4, 0.4]":[0.0,0.5000013005099216,0.49999869949007836],"[0.5, 0.6, 0.7]":[0.0,1.0,0.0],"[0.8, 0.6, 0.9]":[1.0,0.0,0.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.3, 0.3, 0.9]":[0.4999999999549326,0.5000000000450673,0.0],"[0.9, 0.8, 0.8]":[0.0,1.0,0.0],"[0.2, 0.2, 0.5]":[0.4999933694943416,0.5000066305056584,0.0],"[0.7, 0.7, 0.7]":[0.3334424235510388,0.33327591400118484,0.33328166244777624],"[0.1, 0.4, 0.3]":[0.0,0.0,1.0],"[0.2, 0.0, 0.2]":[0.5000000010175979,0.0,0.4999999989824021],"[0.0, 0.3, 0.1]":[0.0,0.0,1.0],"[0.4, 0.5, 0.3]":[1.0,0.0,0.0],"[0.2, 0.7, 0.4]":[0.0,0.0,1.0],"[0.1, 0.7, 0.6]":[0.0,0.0,1.0],"[0.1, 0.8, 0.1]":[0.5,0.0,0.5000000000000001],"[0.0, 0.8, 0.2]":[0.0,0.0,1.0],"[0.3, 0.4, 0.7]":[0.0,1.0,0.0],"[0.3, 0.6, 0.6]":[0.0,0.49916812373343866,0.5008318762665613],"[0.6, 0.5, 0.7]":[1.0,0.0,0.0],"[0.7, 0.1, 0.7]":[0.0,0.0,1.0],"[0.8, 0.2, 0.2]":[0.0,0.5000000000000001,0.4999999999999999],"[0.0, 0.2, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.5, 0.0, 0.3]":[0.0,0.0,1.0],"[0.2, 0.5, 0.0]":[1.0,0.0,0.0],"[0.4, 0.3, 0.3]":[0.0,0.5003185575639222,0.4996814424360778],"[0.5, 0.9, 0.4]":[1.0,0.0,0.0],"[0.5, 0.2, 0.1]":[0.0,1.0,0.0],"[0.5, 0.5, 0.9]":[0.5000918182977969,0.4999081817022031,0.0],"[0.2, 0.1, 0.4]":[1.0,0.0,0.0],"[0.1, 0.1, 0.6]":[0.5000000000000001,0.4999999999999998,0.0],"[0.3, 0.7, 0.2]":[1.0,0.0,0.0],"[0.3, 0.2, 0.4]":[1.0,0.0,0.0],"[0.6, 0.3, 0.7]":[1.0,0.0,0.0],"[0.9, 0.4, 0.4]":[0.0,0.4999999849441542,0.5000000150558458],"[0.0, 0.9, 0.3]":[0.0,0.0,1.0],"[0.4, 0.0, 0.7]":[1.0,0.0,0.0],"[0.2, 0.3, 0.0]":[1.0,0.0,0.0],"[0.0, 0.5, 0.4]":[0.0,0.0,1.0],"[0.5, 0.3, 0.9]":[1.0,0.0,0.0],"[0.3, 0.1, 0.2]":[0.0,0.0,1.0],"[0.7, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.6, 0.5]":[0.0,0.0,1.0],"[0.6, 0.8, 0.9]":[0.0,1.0,0.0],"[0.0, 0.3, 0.4]":[0.0,1.0,0.0],"[0.7, 0.4, 0.3]":[0.0,1.0,0.0],"[0.9, 0.5, 0.7]":[0.0,0.0,1.0],"[0.5, 0.4, 0.7]":[1.0,0.0,0.0],"[0.8, 0.4, 0.9]":[1.0,0.0,0.0],"[0.5, 0.6, 0.6]":[0.0,0.5002096772921747,0.4997903227078253],"[0.6, 0.9, 0.5]":[1.0,0.0,0.0],"[0.1, 0.8, 0.4]":[0.0,0.0,1.0],"[0.7, 0.7, 0.6]":[0.5301478150665142,0.4698521849334858,0.0],"[0.1, 0.6, 0.8]":[0.0,1.0,0.0],"[0.7, 0.8, 0.1]":[1.0,0.0,0.0],"[0.1, 0.7, 0.0]":[1.0,0.0,0.0],"[0.3, 0.6, 0.0]":[1.0,0.0,0.0],"[0.9, 0.3, 0.7]":[0.0,0.0,1.0],"[0.1, 0.5, 0.5]":[0.0,0.5000000000000003,0.49999999999999956],"[0.6, 0.7, 0.1]":[1.0,0.0,0.0],"[0.5, 0.7, 0.2]":[1.0,0.0,0.0],"[0.5, 0.2, 0.4]":[0.0,0.0,1.0],"[0.3, 0.4, 0.6]":[0.0,1.0,0.0],"[0.6, 0.5, 0.6]":[0.5002624544244229,0.0,0.49973754557557715],"[0.7, 0.1, 0.6]":[0.0,0.0,1.0],"[0.4, 0.6, 0.2]":[1.0,0.0,0.0],"[0.8, 0.9, 0.7]":[1.0,0.0,0.0],"[0.1, 0.1, 0.0]":[0.49999999999958555,0.5000000000004143,0.0],"[0.0, 0.2, 0.3]":[0.0,1.0,0.0],"[0.1, 0.3, 0.5]":[0.0,1.0,0.0],"[0.2, 0.5, 0.3]":[0.0,0.0,1.0],"[0.6, 0.1, 0.1]":[0.0,0.5000000000000001,0.5],"[0.9, 0.8, 0.9]":[0.0,0.0,1.0],"[0.5, 0.1, 0.2]":[0.0,0.0,1.0],"[0.6, 0.3, 0.6]":[0.49776516332002685,0.0,0.5022348366799732],"[0.8, 0.7, 0.8]":[1.0,0.0,0.0],"[0.9, 0.9, 0.5]":[1.0,0.0,0.0],"[0.3, 0.0, 0.8]":[1.0,0.0,0.0],"[0.4, 0.0, 0.6]":[1.0,0.0,0.0],"[0.2, 0.3, 0.3]":[0.0,0.5000000000343765,0.4999999999656235],"[0.6, 0.2, 0.5]":[0.0,0.0,1.0],"[0.6, 0.0, 0.2]":[0.0,0.0,1.0],"[0.9, 0.7, 0.1]":[0.0,1.0,0.0],"[0.5, 0.6, 0.0]":[1.0,0.0,0.0],"[0.7, 0.8, 0.4]":[1.0,0.0,0.0],"[0.8, 0.1, 0.8]":[0.0,0.0,1.0],"[0.0, 0.4, 0.5]":[0.0,1.0,0.0],"[0.2, 0.0, 0.7]":[1.0,0.0,0.0],"[0.7, 0.6, 0.8]":[1.0,0.0,0.0],"[0.7, 0.7, 0.0]":[0.0,1.0,0.0],"[0.9, 0.5, 0.6]":[0.0,0.0,1.0],"[0.6, 0.7, 0.4]":[1.0,0.0,0.0],"[0.8, 0.0, 0.5]":[0.0,0.0,1.0],"[0.5, 0.4, 0.6]":[1.0,0.0,0.0],"[0.7, 0.5, 0.5]":[0.0,0.5118153293962622,0.4881846706037376],"[0.1, 0.9, 0.2]":[0.0,0.0,1.0],"[0.1, 0.4, 0.8]":[0.0,1.0,0.0],"[0.0, 0.8, 0.7]":[0.0,0.0,1.0],"[0.9, 0.1, 0.1]":[0.0,0.499999999999999,0.500000000000001],"[0.1, 0.7, 0.3]":[0.0,0.0,1.0],"[0.3, 0.4, 0.0]":[1.0,0.0,0.0],"[0.8, 0.2, 0.7]":[0.0,0.0,1.0],"[0.3, 0.6, 0.3]":[0.4997750183403473,0.0,0.5002249816596527],"[0.6, 0.5, 0.0]":[0.0,1.0,0.0],"[0.7, 0.1, 0.0]":[0.0,1.0,0.0],"[0.9, 0.3, 0.6]":[0.0,0.0,1.0],"[0.4, 0.5, 0.8]":[0.0,1.0,0.0],"[0.7, 0.3, 0.5]":[0.0,0.0,1.0],"[0.6, 0.1, 0.4]":[0.0,0.0,1.0],"[0.3, 0.7, 0.7]":[0.0,0.5543909690237655,0.4456090309762345],"[0.4, 0.4, 0.2]":[0.5000000152094337,0.4999999847905664,0.0],"[0.8, 0.9, 0.6]":[1.0,0.0,0.0],"[0.5, 0.0, 0.8]":[1.0,0.0,0.0],"[0.1, 0.1, 0.3]":[0.49999999999962774,0.5000000000003723,0.0],"[0.4, 0.8, 0.5]":[0.0,0.0,1.0],"[0.6, 0.3, 0.0]":[0.0,1.0,0.0],"[0.9, 0.2, 0.5]":[0.0,0.0,1.0],"[0.4, 0.3, 0.8]":[1.0,0.0,0.0],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.4, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.6, 0.9]":[0.0,1.0,0.0],"[0.2, 0.6, 0.2]":[0.49999999999228595,0.0,0.5000000000077139],"[0.0, 0.9, 0.8]":[0.0,0.0,1.0],"[0.3, 0.1, 0.7]":[1.0,0.0,0.0],"[0.9, 0.7, 0.4]":[0.0,1.0,0.0],"[0.9, 0.5, 0.0]":[0.0,1.0,0.0],"[0.5, 0.4, 0.0]":[0.0,1.0,0.0],"[0.1, 0.2, 0.2]":[0.0,0.4999999999909702,0.5000000000090299],"[0.4, 0.9, 0.1]":[1.0,0.0,0.0],"[0.5, 0.6, 0.3]":[1.0,0.0,0.0],"[0.7, 0.9, 0.2]":[1.0,0.0,0.0],"[0.7, 0.4, 0.8]":[1.0,0.0,0.0],"[0.2, 0.0, 0.6]":[1.0,0.0,0.0],"[0.9, 0.1, 0.4]":[0.0,0.0,1.0],"[0.7, 0.7, 0.3]":[0.5175084631867396,0.4824915368132604,0.0],"[0.9, 0.3, 0.0]":[0.0,1.0,0.0],"[0.5, 0.7, 0.7]":[0.0,0.5016408073963718,0.49835919260362815],"[0.8, 0.7, 0.9]":[1.0,0.0,0.0],"[0.0, 0.8, 0.6]":[0.0,0.0,1.0],"[0.3, 0.0, 0.9]":[1.0,0.0,0.0],"[0.4, 0.6, 0.7]":[0.0,1.0,0.0],"[0.8, 0.2, 0.6]":[0.0,0.0,1.0],"[0.3, 0.4, 0.3]":[0.5003185575220443,0.0,0.49968144247795565],"[0.0, 0.0, 0.1]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.5, 0.3]":[0.0,1.0,0.0],"[0.7, 0.1, 0.3]":[0.0,0.0,1.0],"[0.8, 0.9, 0.0]":[1.0,0.0,0.0],"[0.5, 0.1, 0.7]":[1.0,0.0,0.0],"[0.8, 0.1, 0.9]":[1.0,0.0,0.0],"[0.7, 0.6, 0.9]":[1.0,0.0,0.0],"[0.3, 0.7, 0.6]":[0.0,0.0,1.0],"[0.3, 0.8, 0.1]":[1.0,0.0,0.0],"[0.0, 0.2, 0.8]":[0.0,1.0,0.0],"[0.6, 0.3, 0.3]":[0.0,0.499775018336035,0.5002249816639649],"[0.2, 0.5, 0.8]":[0.0,1.0,0.0],"[0.8, 0.5, 0.1]":[0.0,1.0,0.0],"[0.4, 0.0, 0.3]":[0.0,0.0,1.0],"[0.1, 0.4, 0.9]":[0.0,1.0,0.0],"[0.2, 0.4, 0.2]":[0.49999080804191376,0.0,0.5000091919580862],"[0.3, 0.1, 0.6]":[1.0,0.0,0.0],"[0.2, 0.8, 0.5]":[0.0,0.0,1.0],"[0.4, 0.9, 0.4]":[0.5000000150373365,0.0,0.4999999849626635],"[0.6, 0.0, 0.7]":[1.0,0.0,0.0],"[0.4, 0.2, 0.1]":[0.0,1.0,0.0],"[0.4, 0.5, 0.9]":[0.0,1.0,0.0],"[0.7, 0.2, 0.2]":[0.0,0.5000000031546611,0.4999999968453388],"[0.2, 0.3, 0.8]":[0.0,1.0,0.0],"[0.2, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.3, 0.1]":[0.0,1.0,0.0],"[0.9, 0.5, 0.3]":[0.0,1.0,0.0],"[0.5, 0.0, 0.9]":[1.0,0.0,0.0],"[0.1, 0.9, 0.7]":[0.0,0.0,1.0],"[0.5, 0.4, 0.3]":[0.0,1.0,0.0],"[0.4, 0.3, 0.9]":[1.0,0.0,0.0],"[0.8, 0.8, 0.2]":[1.0,0.0,0.0],"[0.0, 0.7, 0.5]":[0.0,0.0,1.0],"[0.0, 0.8, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.0, 0.4]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.2, 0.0]":[0.0,1.0,0.0],"[0.9, 0.3, 0.3]":[0.0,0.5000000000451209,0.4999999999548791],"[0.0, 0.9, 0.9]":[0.0,0.0,1.0],"[0.5, 0.7, 0.6]":[0.0,0.0,1.0],"[0.5, 0.8, 0.1]":[1.0,0.0,0.0],"[0.2, 0.9, 0.1]":[1.0,0.0,0.0],"[0.1, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.8, 0.4]":[0.0,0.0,1.0],"[0.4, 0.4, 0.7]":[0.5000010323456122,0.49999896765438767,0.0],"[0.3, 0.6, 0.8]":[0.0,1.0,0.0],"[0.4, 0.6, 0.6]":[0.0,0.4999134979199964,0.5000865020800036],"[0.3, 0.7, 0.0]":[1.0,0.0,0.0],"[0.0, 0.1, 0.5]":[0.0,1.0,0.0],"[0.8, 0.9, 0.3]":[1.0,0.0,0.0],"[0.9, 0.0, 0.7]":[0.0,0.0,1.0],"[0.8, 0.5, 0.4]":[0.0,1.0,0.0],"[0.3, 0.5, 0.5]":[0.0,0.50000206538946,0.4999979346105399],"[0.5, 0.1, 0.6]":[1.0,0.0,0.0],"[0.6, 0.6, 0.2]":[0.5239396063382066,0.4760603936617934,0.0],"[0.7, 0.4, 0.9]":[1.0,0.0,0.0],"[0.2, 0.6, 0.7]":[0.0,1.0,0.0],"[0.1, 0.1, 0.8]":[0.5,0.5,0.0],"[0.4, 0.7, 0.2]":[1.0,0.0,0.0],"[0.4, 0.2, 0.4]":[0.49999998509395793,0.0,0.5000000149060421],"[0.3, 0.1, 0.0]":[0.0,1.0,0.0],"[0.8, 0.6, 0.5]":[0.0,1.0,0.0],"[0.1, 0.0, 0.5]":[1.0,0.0,0.0],"[0.8, 0.3, 0.4]":[0.0,0.0,1.0],"[0.3, 0.3, 0.5]":[0.5000012339455159,0.4999987660544841,0.0],"[0.6, 0.0, 0.6]":[1.0,0.0,0.0],"[0.1, 0.2, 0.7]":[0.0,1.0,0.0],"[0.4, 0.1, 0.2]":[0.0,0.0,1.0],"[0.7, 0.9, 0.7]":[1.0,0.0,0.0],"[0.2, 0.0, 0.3]":[1.0,0.0,0.0],"[0.5, 0.8, 0.4]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.2, 0.9, 0.4]":[0.0,0.0,1.0],"[0.5, 0.6, 0.8]":[0.0,1.0,0.0],"[0.1, 0.9, 0.6]":[0.0,0.0,1.0],"[0.2, 0.2, 0.1]":[0.5000000000025401,0.49999999999746003,0.0],"[0.2, 0.5, 0.9]":[0.0,1.0,0.0],"[0.5, 0.7, 0.0]":[1.0,0.0,0.0],"[0.7, 0.7, 0.8]":[0.6147917393289635,0.38520826067103653,0.0],"[0.9, 0.6, 0.2]":[0.0,1.0,0.0],"[0.0, 0.8, 0.3]":[0.0,0.0,1.0],"[0.4, 0.6, 0.0]":[1.0,0.0,0.0],"[0.5, 0.5, 0.5]":[0.33333329090108066,0.33333342141995537,0.3333332876789644],"[0.8, 0.2, 0.3]":[0.0,0.0,1.0],"[0.2, 0.3, 0.9]":[0.0,1.0,0.0],"[0.3, 0.9, 0.2]":[1.0,0.0,0.0],"[0.3, 0.4, 0.8]":[0.0,1.0,0.0],"[0.4, 0.4, 0.6]":[0.4999986989552647,0.5000013010447354,0.0],"[0.5, 0.1, 0.0]":[0.0,1.0,0.0],"[0.6, 0.5, 0.8]":[1.0,0.0,0.0],"[0.7, 0.1, 0.8]":[1.0,0.0,0.0],"[0.3, 0.7, 0.3]":[0.5000000194246246,0.0,0.4999999805753754],"[0.5, 0.3, 0.5]":[0.5000044998397601,0.0,0.49999550016023986],"[0.9, 0.0, 0.6]":[0.0,0.0,1.0],"[0.7, 0.0, 0.5]":[0.0,0.0,1.0],"[0.6, 0.4, 0.2]":[0.0,1.0,0.0],"[0.2, 0.4, 0.7]":[0.0,1.0,0.0],"[0.6, 0.8, 0.5]":[1.0,0.0,0.0],"[0.2, 0.6, 0.6]":[0.0,0.5045661469743149,0.4954338530256851],"[0.6, 0.3, 0.8]":[1.0,0.0,0.0],"[0.7, 0.2, 0.7]":[0.7709655252648201,0.0,0.2290344747351799],"[0.3, 0.1, 0.3]":[0.5000000041681845,0.0,0.49999999583181565],"[0.6, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.8, 0.4, 0.5]":[0.0,0.0,1.0],"[0.4, 0.0, 0.8]":[1.0,0.0,0.0],"[0.1, 0.7, 0.9]":[0.0,1.0,0.0],"[0.3, 0.6, 0.9]":[0.0,1.0,0.0],"[0.2, 0.7, 0.2]":[0.5000000031546459,0.0,0.4999999968453541],"[0.2, 0.2, 0.4]":[0.49999080804219087,0.5000091919578091,0.0],"[0.1, 0.2, 0.6]":[0.0,1.0,0.0],"[0.7, 0.9, 0.6]":[1.0,0.0,0.0],"[0.0, 0.6, 0.1]":[0.0,0.0,1.0],"[0.8, 0.8, 0.7]":[1.0,0.0,0.0],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.5, 0.8]":[0.0,0.0,1.0],"[0.1, 0.1, 0.9]":[0.5000000000000001,0.5,0.0],"[0.6, 0.9, 0.1]":[1.0,0.0,0.0],"[0.5, 0.9, 0.2]":[1.0,0.0,0.0],"[0.5, 0.4, 0.8]":[1.0,0.0,0.0],"[0.2, 0.1, 0.2]":[0.5000000000150719,0.0,0.49999999998492817],"[0.5, 0.7, 0.3]":[1.0,0.0,0.0],"[0.3, 0.2, 0.2]":[0.0,0.4999902353156015,0.5000097646843986],"[0.9, 0.4, 0.2]":[0.0,1.0,0.0],"[0.9, 0.8, 0.5]":[0.0,1.0,0.0],"[0.4, 0.4, 0.0]":[0.500157146164096,0.499842853835904,0.0],"[0.1, 0.5, 0.1]":[0.5000000000000001,0.0,0.4999999999999999],"[0.4, 0.6, 0.3]":[1.0,0.0,0.0],"[0.0, 0.5, 0.2]":[0.0,0.0,1.0],"[0.9, 0.3, 0.8]":[0.0,0.0,1.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.6, 0.7]":[0.5071855476814338,0.49281445231856624,0.0],"[0.5, 0.1, 0.3]":[0.0,0.0,1.0],"[0.4, 0.7, 0.7]":[0.0,0.5057155442027138,0.4942844557972862],"[0.8, 0.9, 0.8]":[1.0,0.0,0.0],"[0.2, 0.6, 0.0]":[1.0,0.0,0.0],"[0.1, 0.3, 0.1]":[0.5000000000003717,0.0,0.4999999999996283],"[0.0, 0.3, 0.2]":[0.0,0.0,1.0],"[0.5, 0.6, 0.9]":[0.0,1.0,0.0],"[0.7, 0.7, 0.9]":[1.0,0.0,0.0],"[0.2, 0.4, 0.6]":[0.0,1.0,0.0],"[0.1, 0.8, 0.2]":[0.0,0.0,1.0],"[0.9, 0.9, 0.1]":[0.0,1.0,0.0],"[0.4, 0.1, 0.7]":[1.0,0.0,0.0],"[0.0, 0.6, 0.4]":[0.0,0.0,1.0],"[0.7, 0.2, 0.6]":[0.0,0.0,1.0],"[0.1, 0.2, 0.0]":[1.0,0.0,0.0],"[0.6, 0.0, 0.3]":[0.0,0.0,1.0],"[0.7, 0.9, 0.0]":[1.0,0.0,0.0],"[0.3, 0.4, 0.9]":[0.0,1.0,0.0],"[0.6, 0.9, 0.4]":[1.0,0.0,0.0],"[0.6, 0.2, 0.1]":[0.0,1.0,0.0],"[0.5, 0.2, 0.2]":[0.0,0.5000066303213005,0.49999336967869934],"[0.6, 0.5, 0.9]":[1.0,0.0,0.0],"[0.7, 0.1, 0.9]":[1.0,0.0,0.0],"[0.0, 0.4, 0.1]":[0.0,0.0,1.0],"[0.8, 0.8, 0.6]":[0.0,1.0,0.0],"[0.1, 0.9, 0.3]":[0.0,0.0,1.0],"[0.2, 0.0, 0.8]":[1.0,0.0,0.0],"[0.9, 0.6, 0.7]":[0.0,0.0,1.0],"[0.1, 0.5, 0.4]":[0.0,0.0,1.0],"[0.8, 0.0, 0.1]":[0.0,0.0,1.0],"[0.7, 0.5, 0.1]":[0.0,1.0,0.0],"[0.6, 0.3, 0.9]":[1.0,0.0,0.0],"[0.0, 0.8, 0.8]":[0.0,1.0,0.0],"[0.3, 0.9, 0.7]":[0.0,0.0,1.0],"[0.4, 0.0, 0.9]":[1.0,0.0,0.0],"[0.8, 0.2, 0.8]":[1.0,0.0,0.0],"[0.1, 0.6, 0.5]":[0.0,0.0,1.0],"[0.4, 0.4, 0.3]":[0.5000000097856692,0.49999999021433095,0.0],"[0.1, 0.3, 0.4]":[0.0,1.0,0.0],"[0.7, 0.3, 0.1]":[0.0,1.0,0.0],"[0.9, 0.0, 0.3]":[0.0,0.0,1.0],"[0.6, 0.4, 0.7]":[1.0,0.0,0.0],"[0.6, 0.6, 0.6]":[0.33332797160968086,0.3333448337890986,0.3333271946012205],"[0.3, 0.7, 0.8]":[0.0,1.0,0.0],"[0.4, 0.7, 0.6]":[0.0,0.0,1.0],"[0.4, 0.8, 0.1]":[1.0,0.0,0.0],"[0.2, 0.4, 0.0]":[1.0,0.0,0.0],"[0.7, 0.8, 0.2]":[1.0,0.0,0.0],"[0.9, 0.9, 0.4]":[1.0,0.0,0.0],"[0.9, 0.2, 0.1]":[0.0,1.0,0.0],"[0.2, 0.6, 0.3]":[0.0,0.0,1.0],"[0.9, 0.5, 0.9]":[0.0,0.0,1.0],"[0.7, 0.2, 0.0]":[0.0,1.0,0.0],"[0.5, 0.4, 0.9]":[1.0,0.0,0.0],"[0.6, 0.7, 0.2]":[1.0,0.0,0.0],"[0.6, 0.2, 0.4]":[0.0,0.0,1.0],"[0.2, 0.7, 0.7]":[0.0,0.0,1.0],"[0.0, 0.4, 0.4]":[0.0,0.4995592947645493,0.5004407052354508],"[0.3, 0.1, 0.8]":[1.0,0.0,0.0],"[0.4, 0.1, 0.6]":[1.0,0.0,0.0],"[0.9, 0.3, 0.9]":[1.0,0.0,0.0],"[0.1, 0.2, 0.3]":[0.0,1.0,0.0],"[0.8, 0.7, 0.5]":[0.0,1.0,0.0],"[0.7, 0.9, 0.3]":[1.0,0.0,0.0],"[0.8, 0.8, 0.0]":[1.0,0.0,0.0],"[0.8, 0.0, 0.4]":[0.0,0.0,1.0],"[0.3, 0.0, 0.5]":[1.0,0.0,0.0],"[0.7, 0.5, 0.4]":[0.0,1.0,0.0],"[0.6, 0.1, 0.2]":[0.0,0.0,1.0],"[0.5, 0.9, 0.7]":[0.0,0.0,1.0],"[0.8, 0.9, 0.9]":[0.0,0.0,1.0],"[0.2, 0.1, 0.7]":[1.0,0.0,0.0],"[0.3, 0.2, 0.7]":[1.0,0.0,0.0],"[0.9, 0.4, 0.7]":[0.0,0.0,1.0],"[0.9, 0.6, 0.6]":[0.0,0.5005012931943964,0.4994987068056036],"[0.8, 0.1, 0.5]":[0.0,0.0,1.0],"[0.7, 0.6, 0.5]":[0.0,1.0,0.0],"[0.0, 0.5, 0.7]":[0.0,1.0,0.0],"[0.7, 0.3, 0.4]":[0.0,0.0,1.0],"[0.5, 0.7, 0.8]":[0.0,1.0,0.0],"[0.3, 0.9, 0.6]":[0.0,0.0,1.0],"[0.4, 0.8, 0.4]":[0.4999998192290215,0.0,0.5000001807709784],"[0.6, 0.6, 0.0]":[0.0,1.0,0.0],"[0.9, 0.7, 0.2]":[0.0,1.0,0.0],"[0.1, 0.4, 0.5]":[0.0,1.0,0.0],"[0.4, 0.6, 0.8]":[0.0,1.0,0.0],"[0.9, 0.2, 0.4]":[0.0,0.0,1.0],"[0.4, 0.7, 0.0]":[1.0,0.0,0.0],"[0.0, 0.3, 0.7]":[0.0,1.0,0.0],"[0.4, 0.5, 0.5]":[0.0,0.5000005297038124,0.49999947029618763],"[0.6, 0.4, 0.6]":[0.4997838050581739,0.0,0.5002161949418261],"[0.5, 0.1, 0.8]":[1.0,0.0,0.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.1, 0.8, 0.7]":[0.0,0.0,1.0],"[0.2, 0.4, 0.3]":[0.0,0.0,1.0],"[0.9, 0.1, 0.2]":[0.0,0.0,1.0],"[0.4, 0.1, 0.0]":[0.0,1.0,0.0],"[0.5, 0.0, 0.5]":[0.2651630786948418,0.0,0.7348369213051581],"[0.7, 0.2, 0.3]":[0.0,0.0,1.0],"[0.4, 0.3, 0.5]":[1.0,0.0,0.0],"[0.0, 0.8, 0.9]":[0.0,1.0,0.0],"[0.2, 0.7, 0.6]":[0.0,0.0,1.0],"[0.2, 0.8, 0.1]":[1.0,0.0,0.0],"[0.5, 0.2, 0.7]":[1.0,0.0,0.0],"[0.8, 0.2, 0.9]":[1.0,0.0,0.0],"[0.6, 0.0, 0.8]":[1.0,0.0,0.0],"[0.0, 0.9, 0.5]":[0.0,0.0,1.0],"[0.8, 0.8, 0.3]":[0.0,1.0,0.0],"[0.9, 0.6, 0.0]":[0.0,1.0,0.0],"[0.3, 0.7, 0.9]":[0.0,1.0,0.0],"[0.5, 0.9, 0.6]":[0.0,0.0,1.0],"[0.2, 0.1, 0.6]":[1.0,0.0,0.0],"[0.1, 0.9, 0.8]":[0.0,0.0,1.0],"[0.0, 0.7, 0.1]":[0.0,0.0,1.0],"[0.3, 0.2, 0.6]":[1.0,0.0,0.0],"[0.9, 0.4, 0.6]":[0.0,0.0,1.0],"[0.3, 0.9, 0.0]":[1.0,0.0,0.0],"[0.7, 0.4, 0.5]":[0.0,0.0,1.0],"[0.0, 0.5, 0.6]":[0.0,1.0,0.0],"[0.3, 0.1, 0.9]":[1.0,0.0,0.0],"[0.6, 0.4, 0.0]":[0.0,1.0,0.0],"[0.4, 0.9, 0.2]":[1.0,0.0,0.0],"[0.0, 0.1, 0.1]":[0.0,0.49999999999961675,0.5000000000003834],"[0.4, 0.4, 0.8]":[0.4999998577107576,0.5000001422892424,0.0],"[0.6, 0.6, 0.3]":[0.49956002224412077,0.5004399777558792,0.0],"[0.7, 0.8, 0.7]":[0.5000224219147038,0.0,0.4999775780852964],"[0.4, 0.7, 0.3]":[1.0,0.0,0.0],"[0.0, 0.3, 0.6]":[0.0,1.0,0.0],"[0.3, 0.5, 0.1]":[1.0,0.0,0.0],"[0.9, 0.0, 0.8]":[0.0,0.0,1.0],"[0.6, 0.7, 0.7]":[0.0,0.46865918021815434,0.5313408197818454],"[0.2, 0.8, 0.4]":[0.0,0.0,1.0],"[0.1, 0.8, 0.6]":[0.0,0.0,1.0],"[0.2, 0.6, 0.8]":[0.0,1.0,0.0],"[0.2, 0.7, 0.0]":[1.0,0.0,0.0],"[0.8, 0.6, 0.1]":[0.0,1.0,0.0],"[0.0, 0.2, 0.5]":[0.0,1.0,0.0],"[0.1, 0.0, 0.1]":[0.49999999999964706,0.0,0.5000000000003528],"[0.4, 0.1, 0.3]":[0.0,0.0,1.0],"[0.0, 0.0, 0.2]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.3, 0.3, 0.1]":[0.5000000069544247,0.4999999930455753,0.0],"[0.5, 0.7, 0.9]":[0.0,1.0,0.0],"[0.2, 0.5, 0.5]":[0.0,0.49981222047498897,0.500187779525011],"[0.6, 0.1, 0.7]":[1.0,0.0,0.0],"[0.5, 0.2, 0.6]":[1.0,0.0,0.0],"[0.4, 0.6, 0.9]":[0.0,1.0,0.0],"[0.3, 0.8, 0.2]":[1.0,0.0,0.0],"[0.5, 0.9, 0.0]":[1.0,0.0,0.0],"[0.0, 0.7, 0.4]":[0.0,0.0,1.0],"[0.1, 0.2, 0.8]":[0.0,1.0,0.0],"[0.2, 0.1, 0.0]":[0.0,1.0,0.0],"[0.7, 0.9, 0.8]":[0.0,0.0,1.0],"[0.3, 0.2, 0.0]":[0.0,1.0,0.0],"[0.9, 0.4, 0.0]":[0.0,1.0,0.0],"[0.2, 0.3, 0.5]":[0.0,1.0,0.0],"[0.9, 0.6, 0.3]":[0.0,1.0,0.0],"[0.5, 0.1, 0.9]":[1.0,0.0,0.0],"[0.8, 0.5, 0.2]":[0.0,1.0,0.0],"[0.0, 0.5, 0.0]":[0.3333262234652497,0.33334755306950054,0.3333262234652497],"[0.0, 0.1, 0.4]":[0.0,1.0,0.0],"[0.9, 0.7, 0.7]":[0.0,0.0,1.0],"[0.4, 0.2, 0.2]":[0.0,0.49999080804179985,0.5000091919582003],"[0.5, 0.5, 0.1]":[0.4967435432600944,0.5032564567399056,0.0],"[0.3, 0.9, 0.3]":[0.5000000000451094,0.0,0.49999999995489064],"[0.3, 0.5, 0.4]":[0.0,0.0,1.0],"[0.8, 0.3, 0.2]":[0.0,1.0,0.0],"[0.0, 0.3, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.6, 0.0, 0.9]":[1.0,0.0,0.0],"[0.6, 0.4, 0.3]":[0.0,1.0,0.0],"[0.7, 0.8, 0.6]":[1.0,0.0,0.0],"[0.5, 0.3, 0.1]":[0.0,1.0,0.0],"[0.1, 0.7, 0.5]":[0.0,0.0,1.0],"[0.1, 0.8, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.7]":[0.0,0.0,1.0],"[0.8, 0.6, 0.4]":[0.0,1.0,0.0],"[0.1, 0.0, 0.4]":[1.0,0.0,0.0],"[0.3, 0.6, 0.5]":[0.0,0.0,1.0],"[0.3, 0.3, 0.4]":[0.49968144241998536,0.5003185575800146,0.0],"[0.7, 0.0, 0.1]":[0.0,0.0,1.0],"[0.1, 0.9, 0.9]":[0.0,0.0,1.0],"[0.6, 0.7, 0.6]":[0.5071848504983205,0.0,0.4928151495016797],"[0.6, 0.8, 0.1]":[1.0,0.0,0.0],"[0.5, 0.8, 0.2]":[1.0,0.0,0.0],"[0.2, 0.9, 0.2]":[0.5000000000000001,0.0,0.5],"[0.2, 0.4, 0.8]":[0.0,1.0,0.0],"[0.2, 0.7, 0.3]":[0.0,0.0,1.0],"[0.5, 0.2, 0.0]":[0.0,1.0,0.0],"[0.8, 0.4, 0.1]":[0.0,1.0,0.0],"[0.1, 0.1, 0.5]":[0.4999999999999998,0.5000000000000001,0.0],"[0.7, 0.2, 0.8]":[1.0,0.0,0.0]} \ No newline at end of file diff --git a/data2.tmp b/data2.tmp deleted file mode 100644 index 3e761a6..0000000 --- a/data2.tmp +++ /dev/null @@ -1 +0,0 @@ -{"[0.0, 1.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[1.0, 0.0, 0.1]":[0.0,0.0,1.0],"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.1]":[0.0,0.5000000000000001,0.4999999999999998],"[0.0, 1.0, 0.1]":[0.0,0.0,1.0],"[1.0, 0.1, 0.0]":[0.0,1.0,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.1, 0.9]":[0.5,0.5,0.0],"[0.1, 0.0, 1.0]":[1.0,0.0,0.0],"[0.1, 0.9, 0.1]":[0.4999999999999998,0.0,0.5000000000000002],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[1.0, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.1, 1.0]":[0.0,1.0,0.0],"[0.1, 1.0, 0.0]":[1.0,0.0,0.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.0, 0.0, 1.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0]} \ No newline at end of file diff --git a/experiments/data.tmp b/experiments/data.tmp new file mode 100644 index 0000000..b500336 --- /dev/null +++ b/experiments/data.tmp @@ -0,0 +1 @@ +{"[0.0, 1.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[1.0, 0.0, 0.1]":[0.0,0.0,1.0],"[0.0, 0.0, 0.9]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.9, 0.0, 0.2]":[0.0,0.0,1.0],"[0.2, 0.9, 0.0]":[1.0,0.0,0.0],"[0.9, 0.1, 0.1]":[0.0,0.499999999999999,0.500000000000001],"[0.0, 1.0, 0.1]":[0.0,0.0,1.0],"[1.0, 0.1, 0.0]":[0.0,1.0,0.0],"[0.0, 0.9, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.1, 0.1, 0.9]":[0.5000000000000001,0.5,0.0],"[0.1, 0.0, 1.0]":[1.0,0.0,0.0],"[0.1, 0.9, 0.1]":[0.5,0.0,0.5],"[0.0, 0.9, 0.2]":[0.0,0.0,1.0],"[0.9, 0.0, 0.1]":[0.0,0.0,1.0],"[1.0, 0.0, 0.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.1, 1.0]":[0.0,1.0,0.0],"[0.1, 1.0, 0.0]":[1.0,0.0,0.0],"[0.1, 0.0, 0.9]":[1.0,0.0,0.0],"[0.0, 0.2, 0.9]":[0.0,1.0,0.0],"[0.0, 0.1, 0.9]":[0.0,1.0,0.0],"[0.0, 0.0, 1.0]":[0.3333333333333333,0.3333333333333333,0.3333333333333333],"[0.0, 0.9, 0.1]":[0.0,0.0,1.0],"[0.2, 0.0, 0.9]":[1.0,0.0,0.0],"[0.9, 0.2, 0.0]":[0.0,1.0,0.0],"[0.0, 0.0, 0.0]":[0.0,0.0,0.0],"[0.9, 0.1, 0.0]":[0.0,1.0,0.0]} \ No newline at end of file diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 12fdcab..d0b87f6 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -215,7 +215,7 @@ end function demo_stage2(;use_file=true) save_file = nothing if use_file - save_file = JSON3.read(open("data2.tmp", "r"), Dict{String, Vector{Float64}}) + save_file = JSON3.read(open("./experiments/data.tmp", "r"), Dict{String, Vector{Float64}}) println("read file") end # Game Parameters @@ -331,7 +331,6 @@ scatterlines!(ax_simplex, [1;0;0;1], [0;1;0;0], [0;0;1;0], markersize = 15) normalized_observable_p = lift(observable_prior_sliders...) do a, b, c round.(normalize([a,b,c], 1), digits = 2) end -@lift println("priors: ", $normalized_observable_p) # p₁ : west, p₂ : east, p₃ : north p1, p2, p3 = [lift((x,i)->x[i], normalized_observable_p, idx) for idx in 1:num_worlds] @@ -347,24 +346,6 @@ observable_r = on(normalized_observable_p) do x end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] -function get_random_point_within_ball(; radius = 0.3, center = [ax_limits[2]/2, ax_limits[2]/2], num_points = 1) - # Check center is Tuple - @assert length(center) == 2 "Center must be a 2-element vector [x, y]" - x_coord, y_coord = center - - # Generate random angle in radians - angle = [2π * rand() for _ in 1:num_points] - - # Generate random distance within the specificed radius - r = [radius * sqrt(rand()) for _ in 1:num_points] - - # Calculate new x and y coordinates and create an array of Point2f objects - - [Point2f(x_coord + r[i] * cos(angle[i]), y_coord + r[i] * sin(angle[i])) for i in 1:num_points] -end - -# Check if scout_allocation results are normalized -@lift println("Scout allocation: ", [$scout_north, $scout_east, $scout_west]) # Display scout allocation as a text on the Figure text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] @@ -380,14 +361,9 @@ game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_ b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1]), observable_r.observable, normalized_observable_p, game) -# Create an array of observables from b_array -# b_array_obs = [lift((x,i,j) -> x[Block(i)][j], b_array, i,j) for j in 1:3 for i in 1:10] - b_array_obs_f = (i, x) -> x[][Block(i)] b_array_obs_f_block = (i) -> b_array[][Block(i)] -# Main.@infiltrate - u_north = Observable(0.0) u_east = Observable(0.0) u_west = Observable(0.0) @@ -398,7 +374,6 @@ v_west = Observable(0.0) on(b_array) do y x = menu.selection[] if x == 0 #s 0 w 1 - # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(5), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -406,12 +381,7 @@ on(b_array) do y v_north[] = round.(b_array_obs_f_block(5), digits=2)[1] v_east[] = round.(b_array_obs_f_block(5), digits=2)[2] v_west[] = round.(b_array_obs_f_block(5), digits=2)[3] - # v[] = round.(b_array_obs_f_block(5), digits=2) - elseif x == 1 - # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(6), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(1), digits=2) - # v[] = round.(b_array_obs_f_block(6), digits=2) - + elseif x == 1 #s 0 w 2 u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -419,11 +389,7 @@ on(b_array) do y v_north[] = round.(b_array_obs_f_block(6), digits=2)[1] v_east[] = round.(b_array_obs_f_block(6), digits=2)[2] v_west[] = round.(b_array_obs_f_block(6), digits=2)[3] - elseif x == 2 - # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(7), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(1), digits=2) - # v[] = round.(b_array_obs_f_block(7), digits=2) - + elseif x == 2 #s 0 w 3 u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -431,11 +397,7 @@ on(b_array) do y v_north[] = round.(b_array_obs_f_block(7), digits=2)[1] v_east[] = round.(b_array_obs_f_block(7), digits=2)[2] v_west[] = round.(b_array_obs_f_block(7), digits=2)[3] - elseif x == 3 - # draw_world(;u = b_array_obs_f_block(2), v = b_array_obs_f_block(8), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(1), digits=2) - # v[] = round.(b_array_obs_f_block(8), digits=2) - + elseif x == 3 #s 1 w 1 u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -443,10 +405,7 @@ on(b_array) do y v_north[] = round.(b_array_obs_f_block(8), digits=2)[1] v_east[] = round.(b_array_obs_f_block(8), digits=2)[2] v_west[] = round.(b_array_obs_f_block(8), digits=2)[3] - elseif x == 4 - # draw_world(;u = b_array_obs_f_block(3), v = b_array_obs_f_block(9), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(3), digits=2) - # v[] = round.(b_array_obs_f_block(9), digits=2) + elseif x == 4 #s 2 w 2 u_north[] = round.(b_array_obs_f_block(3), digits=2)[1] u_east[] = round.(b_array_obs_f_block(3), digits=2)[2] u_west[] = round.(b_array_obs_f_block(3), digits=2)[3] @@ -454,10 +413,7 @@ on(b_array) do y v_north[] = round.(b_array_obs_f_block(9), digits=2)[1] v_east[] = round.(b_array_obs_f_block(9), digits=2)[2] v_west[] = round.(b_array_obs_f_block(9), digits=2)[3] - elseif x == 5 - # draw_world(;u = b_array_obs_f_block(4), v = b_array_obs_f_block(10), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(4), digits=2) - # v[] = round.(b_array_obs_f_block(10), digits=2) + elseif x == 5 #s 3 w 3 u_north[] = round.(b_array_obs_f_block(4), digits=2)[1] u_east[] = round.(b_array_obs_f_block(4), digits=2)[2] u_west[] = round.(b_array_obs_f_block(4), digits=2)[3] @@ -470,7 +426,6 @@ end on(menu.selection) do x if x == 0 #s 0 w 1 - # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(5), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -478,12 +433,7 @@ on(menu.selection) do x v_north[] = round.(b_array_obs_f_block(5), digits=2)[1] v_east[] = round.(b_array_obs_f_block(5), digits=2)[2] v_west[] = round.(b_array_obs_f_block(5), digits=2)[3] - # v[] = round.(b_array_obs_f_block(5), digits=2) elseif x == 1 - # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(6), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(1), digits=2) - # v[] = round.(b_array_obs_f_block(6), digits=2) - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -492,10 +442,6 @@ on(menu.selection) do x v_east[] = round.(b_array_obs_f_block(6), digits=2)[2] v_west[] = round.(b_array_obs_f_block(6), digits=2)[3] elseif x == 2 - # draw_world(;u = b_array_obs_f_block(1), v = b_array_obs_f_block(7), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(1), digits=2) - # v[] = round.(b_array_obs_f_block(7), digits=2) - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -504,10 +450,6 @@ on(menu.selection) do x v_east[] = round.(b_array_obs_f_block(7), digits=2)[2] v_west[] = round.(b_array_obs_f_block(7), digits=2)[3] elseif x == 3 - # draw_world(;u = b_array_obs_f_block(2), v = b_array_obs_f_block(8), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(1), digits=2) - # v[] = round.(b_array_obs_f_block(8), digits=2) - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] @@ -516,9 +458,6 @@ on(menu.selection) do x v_east[] = round.(b_array_obs_f_block(8), digits=2)[2] v_west[] = round.(b_array_obs_f_block(8), digits=2)[3] elseif x == 4 - # draw_world(;u = b_array_obs_f_block(3), v = b_array_obs_f_block(9), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(3), digits=2) - # v[] = round.(b_array_obs_f_block(9), digits=2) u_north[] = round.(b_array_obs_f_block(3), digits=2)[1] u_east[] = round.(b_array_obs_f_block(3), digits=2)[2] u_west[] = round.(b_array_obs_f_block(3), digits=2)[3] @@ -527,9 +466,6 @@ on(menu.selection) do x v_east[] = round.(b_array_obs_f_block(9), digits=2)[2] v_west[] = round.(b_array_obs_f_block(9), digits=2)[3] elseif x == 5 - # draw_world(;u = b_array_obs_f_block(4), v = b_array_obs_f_block(10), fig=fig, ax_n=ax_north, ax_e=ax_east, ax_w=ax_west) - # u[] = round.(b_array_obs_f_block(4), digits=2) - # v[] = round.(b_array_obs_f_block(10), digits=2) u_north[] = round.(b_array_obs_f_block(4), digits=2)[1] u_east[] = round.(b_array_obs_f_block(4), digits=2)[2] u_west[] = round.(b_array_obs_f_block(4), digits=2)[3] @@ -539,7 +475,6 @@ on(menu.selection) do x v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] end end -@lift print("u: ", [$u_north, $u_east, $u_west], "\nv: ", [$v_north, $v_east, $v_west]) defender_triangle_north = @lift Point2f[(1 - $u_north, 0), (1 + $u_north, 0), (1, 1 * $u_north)] enemy_triangle_north = @lift Point2f[(1 - $v_north, 2), (1 + $v_north, 2), (1, 2 - (1 * $v_north))] poly!(ax_north, defender_triangle_north, color = (:orange, opacity)) @@ -555,41 +490,12 @@ enemy_triangle_west = @lift Point2f[(0, 1 - $v_west * 1), (0, 1 + 1 * $v_west), poly!(ax_west, defender_triangle_west, color = (:orange, opacity)) poly!(ax_west, enemy_triangle_west, color = (:red, opacity)) -# scatter!(ax_east, u_east, u_east, markersize = 15, color = (:pink, opacity + .2)) -# scatter!(ax_west, u_west, u_west, markersize = 15, color = (:green, opacity)) - -# # scatter!(ax_north, v_north, v_north, markersize = 15, color = (:red, opacity)) -# scatter!(ax_east, v_east, v_east, markersize = 15, color = (:red, opacity)) -# scatter!(ax_west, v_west, v_west, markersize = 15, color = (:red, opacity)) - - display(fig, fullscreen = true) end -function draw_world(;u, v, fig, ax_n, ax_e, ax_w) - # u = round.(u, digits = 2) - # v = round.(v, digits = 2) - opacity = 0.5 - - # print("\nU:\n") - # print(u) - # print("\nV:\n") - # print(v) - - scatter!(ax_n, u, u, markersize = 15, color = (:orange, opacity)) - scatter!(ax_e, u, u, markersize = 15, color = (:pink, opacity + .2)) - scatter!(ax_w, u, u, markersize = 15, color = (:green, opacity)) - - scatter!(ax_n, v, v, markersize = 15, color = (:red, opacity)) - scatter!(ax_e, v, v, markersize = 15, color = (:red, opacity)) - scatter!(ax_w, v, v, markersize = 15, color = (:red, opacity)) - display(fig) -end - - function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1.1, attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], - save_file_name = "data2.tmp") + save_file_name = "./experiments/data.tmp") prior_range = round.(_prior_range, digits=1) # save_file = open(save_file_name, "w+") hashmap = Dict{Vector{Float64}, Vector{Float64}}() @@ -611,86 +517,5 @@ function compute_all_r_save_to_file(;_prior_range = 0.01:.1:1.1, # close(save_file) end -function draw_given() - # saved_computations = open(save_file_name, "r") - # hashmap = read(save_file, Dict{Tuple{Float64, Float64, Float64}, Tuple{Float64, Float64, Float64}}) - saved_computations = read(save_file_name, String) - hashmap = JSON3.read(saved_computations, Dict{Tuple{Float64, Float64, Float64}, Tuple{Float64, Float64, Float64}}) - - - fig = Figure(; size = (3840, 2160)) - - # Add axis for each direction - ax_north = Axis(fig[1,2], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "North", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize - ) - ax_east = Axis(fig[2,1], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "East", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize - ) - ax_west = Axis(fig[2,3], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "West", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize - ) - - # Create sliders - sg = SliderGrid( - fig[3, 2], - (label = "prior_north", range = prior_range, format = "{:.2f}", startvalue = 0), - (label = "prior_east", range = prior_range, format = "{:.2f}", startvalue = 0), - (label = "prior_west", range = prior_range, format = "{:.2f}", startvalue = 0) - ) - - prior_north_listener = sg.sliders[1].value - prior_east_listener = sg.sliders[2].value - prior_west_listener = sg.sliders[3].value - - # TODO: We want normalized priors to appear on GUI (next to slider) - priors = @lift(round.(normalize([$prior_north_listener; $prior_east_listener; $prior_west_listener]), - digits = prior_range_step_precision)) - - get_r(x) = hashmap[x[]] - - r = lift(get_r, priors) - - # print(r) - scat1 = scatter!(ax_north, r, r, markersize = 10, color = :red) - display(fig) -end - #module end end \ No newline at end of file From 417c6ce2d13ff7bb0a800401c4a30b0331607ff3 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:39:51 -0600 Subject: [PATCH 29/35] merge current version --- Manifest.toml | 2 +- Project.toml | 1 + experiments/scout_visuals.jl | 10 +++++++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index f5c9ae2..5263e46 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.10.0" manifest_format = "2.0" -project_hash = "7d7b3c1186cf1c68f85209fdd2012a14aa1bd1c5" +project_hash = "6651d87bed9f6ba81348658b8508b267c9c2a0de" [[deps.ADTypes]] git-tree-sha1 = "f5c25e8a5b29b5e941b7408bc8cc79fea4d9ef9a" diff --git a/Project.toml b/Project.toml index 8744aa9..17d7672 100644 --- a/Project.toml +++ b/Project.toml @@ -7,6 +7,7 @@ version = "0.1.0" BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index d0b87f6..819d56e 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -3,7 +3,7 @@ module scout_visuals using GamesVoI using GLMakie using LinearAlgebra -using JSON3 +using JSON3, FileIO include("tower_defense.jl") Makie.inline!(false) @@ -475,11 +475,15 @@ on(menu.selection) do x v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] end end +# Plot +## defender_triangle_north = @lift Point2f[(1 - $u_north, 0), (1 + $u_north, 0), (1, 1 * $u_north)] enemy_triangle_north = @lift Point2f[(1 - $v_north, 2), (1 + $v_north, 2), (1, 2 - (1 * $v_north))] -poly!(ax_north, defender_triangle_north, color = (:orange, opacity)) -poly!(ax_north, enemy_triangle_north, color = (:red, opacity)) +stage2_map = load("./experiments/stage2_map.jpg") +hidedecorations!(ax_north) +image!(ax_north, stage2_map) +## defender_triangle_east = @lift Point2f[(0, 1 - $u_east * 1), (0, 1 + 1 * $u_east), (1 * $u_east, 1)] enemy_triangle_east = @lift Point2f[(2, 1 - $v_east * 1), (2, 1 + 1 * $v_east), (2 - (1 * $v_east), 1)] poly!(ax_east, defender_triangle_east, color = (:orange, opacity)) From 58bc5aec0a3aa47e7f3725fed4aae0834888c679 Mon Sep 17 00:00:00 2001 From: leedh0124 <35527664+leedh0124@users.noreply.github.com> Date: Tue, 27 Feb 2024 16:40:02 -0600 Subject: [PATCH 30/35] stage2_map --- experiments/stage2_map.jpg | Bin 0 -> 41660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 experiments/stage2_map.jpg diff --git a/experiments/stage2_map.jpg b/experiments/stage2_map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8c5880854df883474ee655ce7628b58db9b8da2 GIT binary patch literal 41660 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 Date: Thu, 29 Feb 2024 16:34:55 -0600 Subject: [PATCH 31/35] import battlemap image --- experiments/scout_visuals.jl | 22 ++++++++-------------- experiments/stage2_map.jpg | Bin 41660 -> 58016 bytes 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 819d56e..6dae582 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -258,18 +258,9 @@ fig = Figure() # Add axis for each direction ax_north = Axis(fig[1,2], # borders - aspect = ax_aspect, limits = ax_limits, + aspect = DataAspect(), # title - title = "North", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize + title = "North" ) ax_west = Axis(fig[2,1], # borders @@ -479,10 +470,13 @@ end ## defender_triangle_north = @lift Point2f[(1 - $u_north, 0), (1 + $u_north, 0), (1, 1 * $u_north)] enemy_triangle_north = @lift Point2f[(1 - $v_north, 2), (1 + $v_north, 2), (1, 2 - (1 * $v_north))] -stage2_map = load("./experiments/stage2_map.jpg") +stage2_map = load("./experiments/stage2_map.jpg") #832x1132 hidedecorations!(ax_north) -image!(ax_north, stage2_map) - +image!(ax_north, rotr90(stage2_map)) +# Suppose u_north = 3, v_north = 4 +scatter!(ax_north, Observable([Point2f(567,550), Point2f(587,550)]), marker = :rect, markersize = 10, color = :blue) +scatter!(ax_north, Point2f(567,650), marker = :dtriangle, markersize = 10, color = :red) +# Main.@infiltrate ## defender_triangle_east = @lift Point2f[(0, 1 - $u_east * 1), (0, 1 + 1 * $u_east), (1 * $u_east, 1)] enemy_triangle_east = @lift Point2f[(2, 1 - $v_east * 1), (2, 1 + 1 * $v_east), (2 - (1 * $v_east), 1)] diff --git a/experiments/stage2_map.jpg b/experiments/stage2_map.jpg index d8c5880854df883474ee655ce7628b58db9b8da2..689bedddddf1664916861b50d215172c76c80daf 100644 GIT binary patch literal 58016 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 YV!a+j*(!9L$r;-b`G3bzWBE1tZ<36ScmMzZ literal 41660 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 Date: Thu, 29 Feb 2024 16:36:42 -0600 Subject: [PATCH 32/35] merge --- experiments/scout_visuals.jl | 115 +++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 52 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 6dae582..fa86e3f 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -212,22 +212,20 @@ function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0. display(fig, fullscreen = true) end -function demo_stage2(;use_file=true) +function demo_stage2(;use_file=true, attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) save_file = nothing if use_file save_file = JSON3.read(open("./experiments/data.tmp", "r"), Dict{String, Vector{Float64}}) println("read file") + else + println("warning: save file not found, please run scout_visuals.compute_all_r_save_to_file()") end # Game Parameters - attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] + # attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] num_worlds = 3 prior_range_step = 0.01 - prior_range_step_precision = 1 prior_range = 0.01:prior_range_step:1 - save_file_name = "precomputed_r.txt" - save_precision = 4 K = 100 - num_unit_scaling_factor = 20 # Axis parameters # borders @@ -256,44 +254,57 @@ function demo_stage2(;use_file=true) fig = Figure() # Add axis for each direction -ax_north = Axis(fig[1,2], - # borders - aspect = DataAspect(), - # title - title = "North" -) -ax_west = Axis(fig[2,1], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "West", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -) -ax_east = Axis(fig[2,3], - # borders - aspect = ax_aspect, limits = ax_limits, - # title - title = "East", - titlegap = ax_titlegap, titlesize = ax_titlesize, - # x-axis - xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, - xticklabelsize = ax_xticklabelsize, - xticks = ax_xticks, xticksize = ax_xticksize, - # y-axis - yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, - yticklabelpad = ax_yticklabelpad, - yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -) - -ax_simplex = Axis3(fig[2,2], aspect = (1,1,1), +# ax_north = Axis(fig[1,2], +# # borders +# aspect = ax_aspect, limits = ax_limits, +# # title +# title = "North", +# titlegap = ax_titlegap, titlesize = ax_titlesize, +# # x-axis +# xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, +# xticklabelsize = ax_xticklabelsize, +# xticks = ax_xticks, xticksize = ax_xticksize, +# # y-axis +# yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, +# yticklabelpad = ax_yticklabelpad, +# yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +# ) +# ax_west = Axis(fig[2,1], +# # borders +# aspect = ax_aspect, limits = ax_limits, +# # title +# title = "West", +# titlegap = ax_titlegap, titlesize = ax_titlesize, +# # x-axis +# xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, +# xticklabelsize = ax_xticklabelsize, +# xticks = ax_xticks, xticksize = ax_xticksize, +# # y-axis +# yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, +# yticklabelpad = ax_yticklabelpad, +# yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +# ) +# ax_east = Axis(fig[2,3], +# # borders +# aspect = ax_aspect, limits = ax_limits, +# # title +# title = "East", +# titlegap = ax_titlegap, titlesize = ax_titlesize, +# # x-axis +# xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, +# xticklabelsize = ax_xticklabelsize, +# xticks = ax_xticks, xticksize = ax_xticksize, +# # y-axis +# yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, +# yticklabelpad = ax_yticklabelpad, +# yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize +# ) +world_signal_pairs = [(1, 0), (2, 0), (3, 0), (1, 1), (2, 2), (3, 3)] +axes = [Axis(fig[2 ? x[2] != 0 : 1, x[1]], aspect = DataAspect(), title= ("World $(i), Signal $(j)", x[1], x[2])) for x in world_signal_pairs] +for ax in axes + hidedecorations!(ax) +end +ax_simplex = Axis3(fig[1,1], aspect = (1,1,1), limits = ((0.0, 1.0, 0.0, 1.0, 0.0, 1.1)), xreversed = true, yreversed = true, @@ -302,13 +313,13 @@ ax_simplex = Axis3(fig[2,2], aspect = (1,1,1), zlabel = "", ) -hidedecorations!(ax_north) -hidedecorations!(ax_east) -hidedecorations!(ax_west) +# hidedecorations!(ax_north) +# hidedecorations!(ax_east) +# hidedecorations!(ax_west) # Create sliders sg = SliderGrid( - fig[3, 2], + fig[2, 1], (label = "prior_north", range = prior_range, format = x-> "", startvalue = 1.0), # z (label = "prior_east", range = prior_range, format = x-> "", startvalue = 1.0), # y (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0) # x @@ -339,10 +350,10 @@ scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable # Display scout allocation as a text on the Figure -text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] -Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) -Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) -Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) +# text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] +# Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) +# Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) +# Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) # Main.@infiltrate menu = Menu(fig[0,1], options = zip(["Signal 0 World 1", "Signal 0 World 2", "Signal 0 World 3", "Signal 1 World 1", "Signal 2 World 2", "Signal 3 World 3"], From 5cc3064e6abdc016f4528d2de6968e177f9abe62 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Thu, 29 Feb 2024 18:07:31 -0600 Subject: [PATCH 33/35] made observable for one map --- experiments/scout_visuals.jl | 270 ++++++++++------------------------- 1 file changed, 77 insertions(+), 193 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index fa86e3f..55dbf55 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -251,58 +251,16 @@ function demo_stage2(;use_file=true, attacker_preference = [[0.9; 0.05; 0.05], [ opacity = 0.5 # Initialize plot -fig = Figure() - -# Add axis for each direction -# ax_north = Axis(fig[1,2], -# # borders -# aspect = ax_aspect, limits = ax_limits, -# # title -# title = "North", -# titlegap = ax_titlegap, titlesize = ax_titlesize, -# # x-axis -# xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, -# xticklabelsize = ax_xticklabelsize, -# xticks = ax_xticks, xticksize = ax_xticksize, -# # y-axis -# yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, -# yticklabelpad = ax_yticklabelpad, -# yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -# ) -# ax_west = Axis(fig[2,1], -# # borders -# aspect = ax_aspect, limits = ax_limits, -# # title -# title = "West", -# titlegap = ax_titlegap, titlesize = ax_titlesize, -# # x-axis -# xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, -# xticklabelsize = ax_xticklabelsize, -# xticks = ax_xticks, xticksize = ax_xticksize, -# # y-axis -# yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, -# yticklabelpad = ax_yticklabelpad, -# yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -# ) -# ax_east = Axis(fig[2,3], -# # borders -# aspect = ax_aspect, limits = ax_limits, -# # title -# title = "East", -# titlegap = ax_titlegap, titlesize = ax_titlesize, -# # x-axis -# xautolimitmargin = ax_xautolimitmargin, xgridwidth = ax_xgridwidth, -# xticklabelsize = ax_xticklabelsize, -# xticks = ax_xticks, xticksize = ax_xticksize, -# # y-axis -# yautolimitmargin = ax_yautolimitmargin, ygridwidth = ax_ygridwidth, -# yticklabelpad = ax_yticklabelpad, -# yticklabelsize = ax_yticklabelsize, yticks = ax_yticks, yticksize = ax_yticksize -# ) +fig = Figure(figure_padding = 0) + +#TODO: fix row white space world_signal_pairs = [(1, 0), (2, 0), (3, 0), (1, 1), (2, 2), (3, 3)] -axes = [Axis(fig[2 ? x[2] != 0 : 1, x[1]], aspect = DataAspect(), title= ("World $(i), Signal $(j)", x[1], x[2])) for x in world_signal_pairs] +axes = [Axis(fig[x[2] != 0 ? 2 : 1, x[1] + 1], aspect = DataAspect(), + title= "World $(x[1]), Signal $(x[2])", titlesize = 40, titlegap = 0, + tellheight = false, tellwidth = false) for x in world_signal_pairs] for ax in axes hidedecorations!(ax) + # rowgap!(ax.GridLayout(), 5) end ax_simplex = Axis3(fig[1,1], aspect = (1,1,1), limits = ((0.0, 1.0, 0.0, 1.0, 0.0, 1.1)), @@ -311,18 +269,17 @@ ax_simplex = Axis3(fig[1,1], aspect = (1,1,1), xlabel = "", ylabel = "", zlabel = "", + tellheight = false, + tellwidth = false ) - -# hidedecorations!(ax_north) -# hidedecorations!(ax_east) -# hidedecorations!(ax_west) - # Create sliders sg = SliderGrid( fig[2, 1], (label = "prior_north", range = prior_range, format = x-> "", startvalue = 1.0), # z (label = "prior_east", range = prior_range, format = x-> "", startvalue = 1.0), # y - (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0) # x + (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0), # x + tellheight = false, + tellwidth = false ) observable_prior_sliders = [s.value for s in sg.sliders] @@ -349,16 +306,6 @@ end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] -# Display scout allocation as a text on the Figure -# text_directions = [lift((x) -> "$(round(Int, x*K))%", scout) for scout in [scout_north, scout_east, scout_west]] -# Label(fig[1,2], text_directions[1], fontsize = 20, tellwidth = false, tellheight = false) -# Label(fig[2,3], text_directions[2], fontsize = 20, tellwidth = false, tellheight = false) -# Label(fig[2,1], text_directions[3], fontsize = 20, tellwidth = false, tellheight = false) - -# Main.@infiltrate -menu = Menu(fig[0,1], options = zip(["Signal 0 World 1", "Signal 0 World 2", "Signal 0 World 3", "Signal 1 World 1", "Signal 2 World 2", "Signal 3 World 3"], -[0, 1, 2, 3, 4 ,5])) - game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1]), observable_r.observable, normalized_observable_p, game) @@ -366,138 +313,75 @@ b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1 b_array_obs_f = (i, x) -> x[][Block(i)] b_array_obs_f_block = (i) -> b_array[][Block(i)] -u_north = Observable(0.0) -u_east = Observable(0.0) -u_west = Observable(0.0) -v_north = Observable(0.0) -v_east = Observable(0.0) -v_west = Observable(0.0) - -on(b_array) do y - x = menu.selection[] - if x == 0 #s 0 w 1 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(5), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(5), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(5), digits=2)[3] - elseif x == 1 #s 0 w 2 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(6), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(6), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(6), digits=2)[3] - elseif x == 2 #s 0 w 3 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(7), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(7), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(7), digits=2)[3] - elseif x == 3 #s 1 w 1 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(8), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(8), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(8), digits=2)[3] - elseif x == 4 #s 2 w 2 - u_north[] = round.(b_array_obs_f_block(3), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(3), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(3), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(9), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(9), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(9), digits=2)[3] - elseif x == 5 #s 3 w 3 - u_north[] = round.(b_array_obs_f_block(4), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(4), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(4), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(10), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(10), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] +function bval2int(defender, attacker) + # @Main.infiltrate + num_d = round(defender * 10, digits = 0) + num_a = round(attacker * 10, digits = 0) + if num_a == num_d + if attacker > defender + if num_a == 10 + num_d -= 1 + else + num_a += 1 + end + else #attacker < defender + if num_d == 10 + num_a -= 1 + else + num_d += 1 + end + end end -end -on(menu.selection) do x - if x == 0 #s 0 w 1 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(5), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(5), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(5), digits=2)[3] - elseif x == 1 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(6), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(6), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(6), digits=2)[3] - elseif x == 2 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(7), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(7), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(7), digits=2)[3] - elseif x == 3 - u_north[] = round.(b_array_obs_f_block(1), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(1), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(1), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(8), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(8), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(8), digits=2)[3] - elseif x == 4 - u_north[] = round.(b_array_obs_f_block(3), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(3), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(3), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(9), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(9), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(9), digits=2)[3] - elseif x == 5 - u_north[] = round.(b_array_obs_f_block(4), digits=2)[1] - u_east[] = round.(b_array_obs_f_block(4), digits=2)[2] - u_west[] = round.(b_array_obs_f_block(4), digits=2)[3] - - v_north[] = round.(b_array_obs_f_block(10), digits=2)[1] - v_east[] = round.(b_array_obs_f_block(10), digits=2)[2] - v_west[] = round.(b_array_obs_f_block(10), digits=2)[3] - end + return (Int(num_d), Int(num_a)) end -# Plot -## -defender_triangle_north = @lift Point2f[(1 - $u_north, 0), (1 + $u_north, 0), (1, 1 * $u_north)] -enemy_triangle_north = @lift Point2f[(1 - $v_north, 2), (1 + $v_north, 2), (1, 2 - (1 * $v_north))] + stage2_map = load("./experiments/stage2_map.jpg") #832x1132 -hidedecorations!(ax_north) -image!(ax_north, rotr90(stage2_map)) -# Suppose u_north = 3, v_north = 4 -scatter!(ax_north, Observable([Point2f(567,550), Point2f(587,550)]), marker = :rect, markersize = 10, color = :blue) -scatter!(ax_north, Point2f(567,650), marker = :dtriangle, markersize = 10, color = :red) -# Main.@infiltrate -## -defender_triangle_east = @lift Point2f[(0, 1 - $u_east * 1), (0, 1 + 1 * $u_east), (1 * $u_east, 1)] -enemy_triangle_east = @lift Point2f[(2, 1 - $v_east * 1), (2, 1 + 1 * $v_east), (2 - (1 * $v_east), 1)] -poly!(ax_east, defender_triangle_east, color = (:orange, opacity)) -poly!(ax_east, enemy_triangle_east, color = (:red, opacity)) - -defender_triangle_west = @lift Point2f[(2, 1 - $u_west * 1), (2, 1 + 1 * $u_west), (2 - 1 * $u_west, 1)] -enemy_triangle_west = @lift Point2f[(0, 1 - $v_west * 1), (0, 1 + 1 * $v_west), (1 * $v_west, 1)] -poly!(ax_west, defender_triangle_west, color = (:orange, opacity)) -poly!(ax_west, enemy_triangle_west, color = (:red, opacity)) +# hidedecorations!(ax_north) +for i in axes + image!(i, rotr90(stage2_map)) +end +a_north = 565 +b_north = 600 +increment = 60 +top_increment = 80 +point_positions_north = [(a_north, b_north), (a_north + top_increment,b_north), (a_north - top_increment,b_north), (a_north + 2top_increment, b_north), (a_north - 2top_increment, b_north), + (a_north, b_north - increment), (a_north + increment,b_north - increment), (a_north - increment,b_north - increment), (a_north + 2increment, b_north - increment), (a_north - 2increment, b_north - increment)] +# North +north_defenders = @lift bval2int($b_array[Block(1)][1], $b_array[Block(5)][1])[1] +north_atker = @lift bval2int($b_array[Block(1)][1], $b_array[Block(5)][1])[2] +@lift println("n def: ", $north_defenders, " atk: ", $north_atker) +north_defenders_points = @lift [Point2f(x[1], x[2]) for x in point_positions_north[1:$north_defenders]] +north_atker_points = @lift [Point2f(x[1], x[2] + 150) for x in point_positions_north[1:$north_atker]] +# @Main.infiltrate +scatter!(axes[1], north_defenders_points, marker = :rect, markersize = 15, color = :blue) +scatter!(axes[1], north_atker_points, marker = :dtriangle, markersize = 15, color = :red) + +# East +a_east = 350 +b_east = 250 +point_positions_east = [(a_east, b_east), (a_east, increment + b_east), (a_east, -increment + b_east), (a_east, 2increment + b_east), (a_east, -2increment + b_east), + (a_east - increment, b_east), (a_east - increment, b_east + top_increment), (a_east - increment, b_east - top_increment), (a_east - increment, b_east + 2top_increment), (a_east - increment, b_east - 2top_increment)] + +east_defenders = @lift bval2int($b_array[Block(1)][2], $b_array[Block(5)][2])[1] +east_atker = @lift bval2int($b_array[Block(1)][2], $b_array[Block(5)][2])[2] +@lift println("e def: ", $east_defenders, " atk: ", $east_atker) +east_defenders_points = @lift [Point2f(x[1], x[2]) for x in point_positions_east[1:$east_defenders]] +east_atker_points = @lift [Point2f(x[1], x[2] + 150) for x in point_positions_east[1:$east_atker]] + +scatter!(axes[1], east_defenders_points, marker = :rect, markersize = 15, color = :blue) +scatter!(axes[1], east_atker_points, marker = :rtriangle, markersize = 15, color = :red) + +# West +west_defenders = @lift bval2int($b_array[Block(1)][3], $b_array[Block(5)][3])[1] +west_atker = @lift bval2int($b_array[Block(1)][3], $b_array[Block(5)][3])[2] +@lift println("w def: ", $west_defenders, " atk: ", $west_atker) +west_defenders_points = @lift [Point2f(1130 - x[1], x[2]) for x in point_positions_east[1:$west_defenders]] +west_atker_points = @lift [Point2f(1130 - x[1] + 150, x[2]) for x in point_positions_east[1:$west_atker]] + +scatter!(axes[1], west_defenders_points, marker = :rect, markersize = 15, color = :blue) +scatter!(axes[1], west_atker_points, marker = :ltriangle, markersize = 15, color = :red) +# # Main.@infiltrate display(fig, fullscreen = true) end From 937c70f24d58c12d6bf1e61739996cc242f861a8 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Thu, 29 Feb 2024 19:47:48 -0600 Subject: [PATCH 34/35] minor behavior fixes and drawing on all world+signal maps --- experiments/scout_visuals.jl | 143 ++++++++++++----------------------- 1 file changed, 50 insertions(+), 93 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index 55dbf55..e66da12 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -8,33 +8,6 @@ include("tower_defense.jl") Makie.inline!(false) -# Visual parameters - # Axis parameters - # borders - ax_aspect = 1 - ax_limits = (0, 2, 0, 2) - # title - ax_titlegap = 1 - ax_titlesize = 30 - # x-axis - ax_xautolimitmargin = (0, 0) - ax_xgridwidth = 2 - ax_xticklabelsize = 0 - ax_xticks = -10:10 - ax_xticksize = 18 - # y-axis - ax_yautolimitmargin = (0, 0) - ax_ygridwidth = 2 - ax_yticklabelpad = 14 - ax_yticklabelsize = 0 - ax_yticks = -10:10 - ax_yticksize = 18 - -""" TODO: -1. Do visualiation for each given world/signal received by Player 1 -2. Solve for all different combinations and store them in a "look-up dictionary" so that you dont have to solve the game all the time -""" - function demo(; attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]], use_file=false) save_file = nothing @@ -214,6 +187,7 @@ end function demo_stage2(;use_file=true, attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]]) save_file = nothing + if use_file save_file = JSON3.read(open("./experiments/data.tmp", "r"), Dict{String, Vector{Float64}}) println("read file") @@ -221,43 +195,18 @@ function demo_stage2(;use_file=true, attacker_preference = [[0.9; 0.05; 0.05], [ println("warning: save file not found, please run scout_visuals.compute_all_r_save_to_file()") end # Game Parameters - # attacker_preference = [[0.9; 0.05; 0.05], [0.05, 0.9, 0.05], [0.05, 0.05, 0.9]] num_worlds = 3 prior_range_step = 0.01 prior_range = 0.01:prior_range_step:1 - K = 100 - -# Axis parameters - # borders - ax_aspect = 1 - ax_limits = (0, 2, 0, 2) - # title - ax_titlegap = 1 - ax_titlesize = 30 - # x-axis - ax_xautolimitmargin = (0, 0) - ax_xgridwidth = 2 - ax_xticklabelsize = 0 - ax_xticks = -10:10 - ax_xticksize = 18 - # y-axis - ax_yautolimitmargin = (0, 0) - ax_ygridwidth = 2 - ax_yticklabelpad = 14 - ax_yticklabelsize = 0 - ax_yticks = -10:10 - ax_yticksize = 18 - - opacity = 0.5 # Initialize plot fig = Figure(figure_padding = 0) - +# rowgap!(fig.layout, 0) #TODO: fix row white space world_signal_pairs = [(1, 0), (2, 0), (3, 0), (1, 1), (2, 2), (3, 3)] axes = [Axis(fig[x[2] != 0 ? 2 : 1, x[1] + 1], aspect = DataAspect(), title= "World $(x[1]), Signal $(x[2])", titlesize = 40, titlegap = 0, - tellheight = false, tellwidth = false) for x in world_signal_pairs] + tellheight = false) for x in world_signal_pairs] for ax in axes hidedecorations!(ax) # rowgap!(ax.GridLayout(), 5) @@ -269,8 +218,7 @@ ax_simplex = Axis3(fig[1,1], aspect = (1,1,1), xlabel = "", ylabel = "", zlabel = "", - tellheight = false, - tellwidth = false + tellheight = false ) # Create sliders sg = SliderGrid( @@ -279,7 +227,6 @@ sg = SliderGrid( (label = "prior_east", range = prior_range, format = x-> "", startvalue = 1.0), # y (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0), # x tellheight = false, - tellwidth = false ) observable_prior_sliders = [s.value for s in sg.sliders] @@ -293,7 +240,7 @@ end # p₁ : west, p₂ : east, p₃ : north p1, p2, p3 = [lift((x,i)->x[i], normalized_observable_p, idx) for idx in 1:num_worlds] -scatter!(ax_simplex, p3, p2, p1 ; markersize = 15, color = :red) +scatter!(ax_simplex, p3, p2, p1 ; markersize = 15, color = (:red, .75)) # Solve for scout_allocation, r observable_r = on(normalized_observable_p) do x @@ -304,6 +251,7 @@ observable_r = on(normalized_observable_p) do x end end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] +scatter!(ax_simplex, scout_north, scout_east, scout_west ; markersize = 15, color = (:green, .75)) game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) @@ -315,16 +263,18 @@ b_array_obs_f_block = (i) -> b_array[][Block(i)] function bval2int(defender, attacker) # @Main.infiltrate + defender = round(defender, digits = 2) + attacker = round(attacker, digits = 2) num_d = round(defender * 10, digits = 0) num_a = round(attacker * 10, digits = 0) - if num_a == num_d + if num_a == num_d && num_a > 0 if attacker > defender if num_a == 10 num_d -= 1 else num_a += 1 end - else #attacker < defender + else #attacker <= defender if num_d == 10 num_a -= 1 else @@ -345,44 +295,51 @@ a_north = 565 b_north = 600 increment = 60 top_increment = 80 -point_positions_north = [(a_north, b_north), (a_north + top_increment,b_north), (a_north - top_increment,b_north), (a_north + 2top_increment, b_north), (a_north - 2top_increment, b_north), - (a_north, b_north - increment), (a_north + increment,b_north - increment), (a_north - increment,b_north - increment), (a_north + 2increment, b_north - increment), (a_north - 2increment, b_north - increment)] -# North -north_defenders = @lift bval2int($b_array[Block(1)][1], $b_array[Block(5)][1])[1] -north_atker = @lift bval2int($b_array[Block(1)][1], $b_array[Block(5)][1])[2] -@lift println("n def: ", $north_defenders, " atk: ", $north_atker) -north_defenders_points = @lift [Point2f(x[1], x[2]) for x in point_positions_north[1:$north_defenders]] -north_atker_points = @lift [Point2f(x[1], x[2] + 150) for x in point_positions_north[1:$north_atker]] -# @Main.infiltrate -scatter!(axes[1], north_defenders_points, marker = :rect, markersize = 15, color = :blue) -scatter!(axes[1], north_atker_points, marker = :dtriangle, markersize = 15, color = :red) - -# East +point_positions_north = [(a_north, b_north - increment), (a_north + increment,b_north - increment), (a_north - increment,b_north - increment), (a_north + 2increment, b_north - increment), (a_north - 2increment, b_north - increment), + (a_north, b_north), (a_north + top_increment,b_north), (a_north - top_increment,b_north), (a_north + 2top_increment, b_north), (a_north - 2top_increment, b_north)] + a_east = 350 b_east = 250 point_positions_east = [(a_east, b_east), (a_east, increment + b_east), (a_east, -increment + b_east), (a_east, 2increment + b_east), (a_east, -2increment + b_east), (a_east - increment, b_east), (a_east - increment, b_east + top_increment), (a_east - increment, b_east - top_increment), (a_east - increment, b_east + 2top_increment), (a_east - increment, b_east - 2top_increment)] -east_defenders = @lift bval2int($b_array[Block(1)][2], $b_array[Block(5)][2])[1] -east_atker = @lift bval2int($b_array[Block(1)][2], $b_array[Block(5)][2])[2] -@lift println("e def: ", $east_defenders, " atk: ", $east_atker) -east_defenders_points = @lift [Point2f(x[1], x[2]) for x in point_positions_east[1:$east_defenders]] -east_atker_points = @lift [Point2f(x[1], x[2] + 150) for x in point_positions_east[1:$east_atker]] - -scatter!(axes[1], east_defenders_points, marker = :rect, markersize = 15, color = :blue) -scatter!(axes[1], east_atker_points, marker = :rtriangle, markersize = 15, color = :red) - -# West -west_defenders = @lift bval2int($b_array[Block(1)][3], $b_array[Block(5)][3])[1] -west_atker = @lift bval2int($b_array[Block(1)][3], $b_array[Block(5)][3])[2] -@lift println("w def: ", $west_defenders, " atk: ", $west_atker) -west_defenders_points = @lift [Point2f(1130 - x[1], x[2]) for x in point_positions_east[1:$west_defenders]] -west_atker_points = @lift [Point2f(1130 - x[1] + 150, x[2]) for x in point_positions_east[1:$west_atker]] - -scatter!(axes[1], west_defenders_points, marker = :rect, markersize = 15, color = :blue) -scatter!(axes[1], west_atker_points, marker = :ltriangle, markersize = 15, color = :red) -# # Main.@infiltrate - +defender_size = (30, 15) +atker_size = 15 +for (idx, world_signal) in enumerate(world_signal_pairs) + # North + defender_index = world_signal[2] + 1 + atker_index = (world_signal[2] == 0 ? 4 : 7) + world_signal[1] + north_defenders = @lift bval2int($b_array[Block(defender_index)][1], $b_array[Block(atker_index)][1])[1] + north_atker = @lift bval2int($b_array[Block(defender_index)][1], $b_array[Block(atker_index)][1])[2] + # @lift println("n def: ", $north_defenders, " atk: ", $north_atker) + north_defenders_points = @lift [Point2f(x[1], x[2]) for x in point_positions_north[1:$north_defenders]] + north_atker_points = @lift [Point2f(x[1], x[2] + 150) for x in point_positions_north[1:$north_atker]] + + scatter!(axes[idx], north_defenders_points, marker = :rect, markersize = defender_size, color = :blue) + scatter!(axes[idx], north_atker_points, marker = :dtriangle, markersize = atker_size, color = :red) + + # East + + east_defenders = @lift bval2int($b_array[Block(defender_index)][2], $b_array[Block(atker_index)][2])[1] + east_atker = @lift bval2int($b_array[Block(defender_index)][2], $b_array[Block(atker_index)][2])[2] + # @lift println("e def: ", $east_defenders, " atk: ", $east_atker) + east_defenders_points = @lift [Point2f(x[1], x[2]) for x in point_positions_east[1:$east_defenders]] + east_atker_points = @lift [Point2f(x[1] - 150, x[2]) for x in point_positions_east[1:$east_atker]] + + scatter!(axes[idx], east_defenders_points, marker = :rect, markersize = reverse(defender_size), color = :blue) + scatter!(axes[idx], east_atker_points, marker = :rtriangle, markersize = atker_size, color = :red) + + # West + west_defenders = @lift bval2int($b_array[Block(defender_index)][3], $b_array[Block(atker_index)][3])[1] + west_atker = @lift bval2int($b_array[Block(defender_index)][3], $b_array[Block(atker_index)][3])[2] + # @lift println("w def: ", $west_defenders, " atk: ", $west_atker) + west_defenders_points = @lift [Point2f(1130 - x[1], x[2]) for x in point_positions_east[1:$west_defenders]] + west_atker_points = @lift [Point2f(1130 - x[1] + 150, x[2]) for x in point_positions_east[1:$west_atker]] + + scatter!(axes[idx], west_defenders_points, marker = :rect, markersize = reverse(defender_size), color = :blue) + scatter!(axes[idx], west_atker_points, marker = :ltriangle, markersize = atker_size, color = :red) +end +# trim!(fig.layout) display(fig, fullscreen = true) end From 049f84794a6550734dc98cb90560d87c28576043 Mon Sep 17 00:00:00 2001 From: Ryan Park Date: Fri, 1 Mar 2024 15:42:58 -0600 Subject: [PATCH 35/35] final touches, latex --- experiments/scout_visuals.jl | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/experiments/scout_visuals.jl b/experiments/scout_visuals.jl index e66da12..8149831 100644 --- a/experiments/scout_visuals.jl +++ b/experiments/scout_visuals.jl @@ -200,17 +200,22 @@ function demo_stage2(;use_file=true, attacker_preference = [[0.9; 0.05; 0.05], [ prior_range = 0.01:prior_range_step:1 # Initialize plot -fig = Figure(figure_padding = 0) -# rowgap!(fig.layout, 0) +fig = Figure(figure_padding = 2) +rowgap!(fig.layout, 0) #TODO: fix row white space world_signal_pairs = [(1, 0), (2, 0), (3, 0), (1, 1), (2, 2), (3, 3)] axes = [Axis(fig[x[2] != 0 ? 2 : 1, x[1] + 1], aspect = DataAspect(), - title= "World $(x[1]), Signal $(x[2])", titlesize = 40, titlegap = 0, - tellheight = false) for x in world_signal_pairs] + title= L"\omega_{%$(x[1])} \enspace \sigma_{%$(x[2])}", titlesize = 30, titlegap = 3) + for x in world_signal_pairs] for ax in axes hidedecorations!(ax) # rowgap!(ax.GridLayout(), 5) end +Label(fig[1,5], "", fontsize = 1) +rowsize!(fig.layout, 1, Aspect(1, 0.7)) +rowsize!(fig.layout, 2, Aspect(1, 0.7)) +# resize_to_layout!(fig) + ax_simplex = Axis3(fig[1,1], aspect = (1,1,1), limits = ((0.0, 1.0, 0.0, 1.0, 0.0, 1.1)), xreversed = true, @@ -223,9 +228,9 @@ ax_simplex = Axis3(fig[1,1], aspect = (1,1,1), # Create sliders sg = SliderGrid( fig[2, 1], - (label = "prior_north", range = prior_range, format = x-> "", startvalue = 1.0), # z - (label = "prior_east", range = prior_range, format = x-> "", startvalue = 1.0), # y - (label = "prior_west", range = prior_range, format = x-> "", startvalue = 1.0), # x + (label = L"p(\omega_1)", range = prior_range, format = x-> "", startvalue = 1.0), # z + (label = L"p(\omega_2)", range = prior_range, format = x-> "", startvalue = 1.0), # y + (label = L"p(\omega_3)", range = prior_range, format = x-> "", startvalue = 1.0), # x tellheight = false, ) observable_prior_sliders = [s.value for s in sg.sliders] @@ -240,7 +245,7 @@ end # p₁ : west, p₂ : east, p₃ : north p1, p2, p3 = [lift((x,i)->x[i], normalized_observable_p, idx) for idx in 1:num_worlds] -scatter!(ax_simplex, p3, p2, p1 ; markersize = 15, color = (:red, .75)) +scatter!(ax_simplex, p3, p2, p1 ; markersize = 15, color = (:red, .75), label=L"\mathbf{p}(\omega)") # Solve for scout_allocation, r observable_r = on(normalized_observable_p) do x @@ -251,8 +256,8 @@ observable_r = on(normalized_observable_p) do x end end scout_north, scout_east, scout_west = [lift((x,i)->x[i], observable_r.observable, idx) for idx in 1:num_worlds] -scatter!(ax_simplex, scout_north, scout_east, scout_west ; markersize = 15, color = (:green, .75)) - +scatter!(ax_simplex, scout_north, scout_east, scout_west ; markersize = 15, color = (:green, .75), label=L"\mathbf{r}") +axislegend() game = lift((x) -> build_stage_2(x, attacker_preference), normalized_observable_p) b_array = lift((r, p, game) -> compute_stage_2(r, p, attacker_preference, game[1]), @@ -303,7 +308,7 @@ b_east = 250 point_positions_east = [(a_east, b_east), (a_east, increment + b_east), (a_east, -increment + b_east), (a_east, 2increment + b_east), (a_east, -2increment + b_east), (a_east - increment, b_east), (a_east - increment, b_east + top_increment), (a_east - increment, b_east - top_increment), (a_east - increment, b_east + 2top_increment), (a_east - increment, b_east - 2top_increment)] -defender_size = (30, 15) +defender_size = (25, 10) atker_size = 15 for (idx, world_signal) in enumerate(world_signal_pairs) # North @@ -339,7 +344,7 @@ for (idx, world_signal) in enumerate(world_signal_pairs) scatter!(axes[idx], west_defenders_points, marker = :rect, markersize = reverse(defender_size), color = :blue) scatter!(axes[idx], west_atker_points, marker = :ltriangle, markersize = atker_size, color = :red) end -# trim!(fig.layout) +trim!(fig.layout) display(fig, fullscreen = true) end