Skip to content

Commit

Permalink
stage 2 decision landscape visualizaiton
Browse files Browse the repository at this point in the history
  • Loading branch information
jessemilzman committed Feb 26, 2024
1 parent df684dd commit 685897f
Showing 1 changed file with 117 additions and 0 deletions.
117 changes: 117 additions & 0 deletions experiments/tower_defense.jl
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,64 @@ function run_visualization(;βs =nothing, save_name="")
fig
end

"""
Temp. script to get Stage 2 decision landscape(s)
(Just perfect information, right now)
"""
function visualize_decisions(world_idx;r=[1.,0.,0.],βs =nothing, save_name="")
players = [1,2]
dx = 0.01
ps = [1/3, 1 / 3, 1 / 3]
if βs == nothing
βs = [[4.,2.,2.], [2., 3., 2.], [2., 2., 3.]]
end
r = [1.,0.,0.]
xs = 0:dx:1
decision_landscapes = get_stage2_landscape(ps, βs, r, world_idx; dx = 0.01, players = players, initial_guess = nothing)

ylims = [[0.01,1],[-1.,0.]]

fig = Figure(size = (1500, 1000), title = "test")
axs = [
Axis3(
fig[1,pp],
aspect = (1, 1, 1),
perspectiveness = 0.5,
elevation = pi / 5,
azimuth = -π * (1 / 2 + 1 / 4),
zgridcolor = :grey,
ygridcolor = :grey,
xgridcolor = :grey;
xlabel = "x₁",
ylabel = "x₂",
zlabel = "Cost",
title = "World $world_idx, Signal $world_idx",
limits = (nothing, nothing, ylims[players[pp]]),
) for pp in 1:length(players)
]
for (pp, pl) in enumerate(players)
hmap = surface!(
axs[pp],
xs,
xs,
decision_landscapes[:,:,pp],
colormap = :viridis,
colorrange = (0, 1),
)
# text!(axs[world_idx], "$(round(ps[1], digits=2))", position = (0.9, 0.4, cost_min), font = "Bold")
# text!(axs[world_idx], "$(round(ps[2], digits=2))", position = (0.1, 0.95, cost_min), font = "Bold")
# text!(axs[world_idx], "$(round(ps[3], digits=2))", position = (0.2, 0.1, cost_min), font = "Bold")

end

if save_name !== ""
filename = "figures/"*save_name*"stage_2_decision_landscapes.png"
# filename = "figures/"*save*"stage_1_controls.png"
save(filename, fig)
end
fig
end

"""
Temp. script to calculate and plot surfaces for the terms in Stage 1's cost function
"""
Expand Down Expand Up @@ -338,6 +396,65 @@ function calculate_misid_costs(ps, βs, world_idx; dr = 0.05, return_controls =

end

"""
Get the decision landscape for one or both players from Stage 2
"""

function get_stage2_landscape(ps, βs, r, world_idx; dx = 0.05, players = [1,2], initial_guess = nothing)
@assert sum(ps) 1.0 "Prior distribution ps must be a probability distribution"
@assert sum(r) 1.0 "Scout allocation r must be a probability distribution"
game, _ = build_stage_2(ps, βs)
xs = 0:dx:1
num_worlds = length(ps)
costs = NaN * ones(Float64, Int(1 / dx + 1), Int(1 / dx + 1),length(players))
if isnothing(initial_guess)
initial_guess = (1/3)*ones(total_dim(game))
end


# Js = []
# for pl in players
# push!(Js,pl == 2 ? J_2 : J_1)
# end

xnash = compute_stage_2(r, ps, βs, game, initial_guess=initial_guess)
xnash_P1 = xnash[Block(world_idx + 1)]
xnash_P2 = xnash[Block(world_idx + 2 * num_worlds + 1)]

for (i, x1) in enumerate(xs)
for (j, x2) in enumerate(xs)
if x1 + x2 > 1
continue
end
x3 = 1 - x1 - x2
xnew = [x1, x2, x3]

for (k, pl) in enumerate(players)
cost = pl == 2 ? J_2(xnash_P1,xnew,βs[world_idx]) : J_1(xnew, xnash_P2,βs[world_idx])
costs[i,j,k] = cost
end
end
end

for (k, pl) in enumerate(players)
maxormin = pl == 2 ? minimum : maximum
value =
maxormin(
filter(
!isnan,
vcat(costs[:,:,k]),
),
)
value = (-1)^(pl+1)*value
costs[:,:,k] = [isnan(c) ? NaN : c / value for c in costs[:,:,k]]
end


return costs

end


"""
Display surface of Stage 1's objective function. Assumes number of worlds is 3.
Expand Down

0 comments on commit 685897f

Please sign in to comment.