Skip to content

Commit b6cd0f3

Browse files
author
Rico Schrage
committed
Moving target vector to starting message.
1 parent d8c49b6 commit b6cd0f3

3 files changed

Lines changed: 75 additions & 15 deletions

File tree

src/algorithm/admm/flex_admm.jl

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ function _create_C_and_d(u::Vector{<:Real})
3636
d[1] = sum(u)
3737

3838
for j in 1:(m-1)
39-
r1 = 1 + 2*(j-1) + 1
40-
r2 = r1 + 1
39+
r1 = 1 + 2*(j-1) + 1
40+
r2 = r1 + 1
4141

42-
C[r1, j] = 1/u[j]
43-
C[r1, m] = -1/u[m]
42+
C[r1, j] = 1/u[j]
43+
C[r1, m] = -1/u[m]
4444

45-
C[r2, j] = -1/u[j]
46-
C[r2, m] = 1/u[m]
45+
C[r2, j] = -1/u[j]
46+
C[r2, m] = 1/u[m]
4747
end
4848

4949
return C, d
@@ -88,7 +88,6 @@ function on_exchange_message(actor::ADMMFlexActor, carrier::Carrier, message_dat
8888
end
8989

9090
@kwdef struct ADMMFlexCoordinator <: Coordinator
91-
T::Vector{Float64}
9291
ρ::Float64 = 1.0
9392
max_iters::Int64 = 100
9493
slack_penalty::Int64 = 100
@@ -97,8 +96,7 @@ end
9796
end
9897

9998
# ADMM solver
100-
function _admm_flex(admm::ADMMFlexCoordinator, carrier::Carrier)
101-
T = admm.T
99+
function _admm_flex(admm::ADMMFlexCoordinator, carrier::Carrier, T::Vector{Float64})
102100
ρ = admm.ρ
103101
max_iters = admm.max_iters
104102
slack_penalty = admm.slack_penalty
@@ -152,12 +150,13 @@ function _admm_flex(admm::ADMMFlexCoordinator, carrier::Carrier)
152150
end
153151
if k == max_iters
154152
@warn "Reached max iterations ($max_iters) without full convergence."
153+
throw("ADMM not converged $x, $u")
155154
end
156155
end
157156
return x, z, u
158157
end
159158

160-
function start_optimization(coordinator::ADMMFlexCoordinator, carrier::Carrier, message_data::Any, meta::Any)
161-
x,_,_ = _admm_flex(coordinator, carrier)
159+
function start_optimization(coordinator::ADMMFlexCoordinator, carrier::Carrier, target::Vector{Float64}, meta::Any)
160+
x,_,_ = _admm_flex(coordinator, carrier, target)
162161
return x
163162
end

src/carrier/mango.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ struct MangoCarrier <: Carrier
77
include_self::Bool
88
end
99

10-
struct StartCoordinatedDistributedOptimization end
10+
struct StartCoordinatedDistributedOptimization
11+
input::Any
12+
end
1113
struct OptimizationFinishedMessage
1214
result::Any
1315
end
@@ -27,7 +29,7 @@ end
2729

2830
function Mango.handle_message(role::CoordinatorRole, message::StartCoordinatedDistributedOptimization, meta::Any)
2931
role.task = schedule(role, InstantTaskData()) do
30-
x = start_optimization(role.coordinator, role.carrier, message, meta)
32+
x = start_optimization(role.coordinator, role.carrier, message.input, meta)
3133

3234
for (i, addr) in enumerate(others(role.carrier, "participant"))
3335
send_message(role, OptimizationFinishedMessage(x[i]), addr)

test/flex_admm_tests.jl

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,65 @@ using Mango
22
using DistributedOptimization
33
using Test
44

5+
@testset "TestFlexADMMWithMangoCarrier" begin
6+
container = create_tcp_container("127.0.0.1", 5555)
7+
8+
m = 2
9+
l = zeros(m)
10+
u = [6.0, 4.0]
11+
C = [ 1.0 1.0;
12+
-2/3 1.0;
13+
-2/3 1.0]
14+
d = [10.0; 0.0; 0.0]
15+
16+
flex_actor = ADMMFlexActor(l, u, C, d)
17+
flex_actor2 = ADMMFlexActor(l, [3.0,2.0], C, [20.0;0.0;0.0])
18+
dor = DistributedOptimizationRole(flex_actor)
19+
dor2 = DistributedOptimizationRole(flex_actor2)
20+
21+
coordinator = ADMMFlexCoordinator()
22+
coord_role = CoordinatorRole(coordinator)
23+
24+
add_agent_composed_of(container, dor)
25+
add_agent_composed_of(container, dor2)
26+
ca = add_agent_composed_of(container, coord_role)
27+
28+
auto_assign!(complete_topology(3), container)
29+
30+
activate(container) do
31+
send_message(container, StartCoordinatedDistributedOptimization([1.0, 2.0]), address(ca))
32+
end
33+
34+
@test flex_actor.x == [0.8076923071828561, 0.5384616848406112]
35+
@test flex_actor2.x == [0.8076923071828561, 0.5384616848406112]
36+
end
37+
38+
39+
40+
@testset "TestFlexADMMWithMangoCarrierConvCreate" begin
41+
container = create_tcp_container("127.0.0.1", 5555)
42+
43+
flex_actor = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
44+
flex_actor2 = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
45+
coordinator = ADMMFlexCoordinator()
46+
47+
dor = DistributedOptimizationRole(flex_actor, tid=:custom)
48+
dor2 = DistributedOptimizationRole(flex_actor2, tid=:custom)
49+
coord_role = CoordinatorRole(coordinator, tid=:custom)
50+
51+
add_agent_composed_of(container, dor)
52+
add_agent_composed_of(container, dor2)
53+
ca = add_agent_composed_of(container, coord_role)
54+
55+
auto_assign!(complete_topology(3, tid=:custom), container)
56+
57+
activate(container) do
58+
send_message(container, StartCoordinatedDistributedOptimization([1.0, 2.0]), address(ca))
59+
end
60+
61+
@test result(flex_actor) == flex_actor.x == [0.807682990194497, 0.5384948521038107]
62+
@test result(flex_actor2) == flex_actor2.x == [0.807682990194497, 0.5384948521038107]
63+
end
564

665
@role struct HandleOptimizationResultRole
766
got_it::Bool = false
@@ -17,7 +76,7 @@ end
1776
flex_actor = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
1877
flex_actor2 = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
1978
flex_actor3 = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
20-
coordinator = ADMMFlexCoordinator(T=[1.0, 2.0])
79+
coordinator = ADMMFlexCoordinator()
2180

2281
dor = DistributedOptimizationRole(flex_actor, tid=:custom)
2382
dor2 = DistributedOptimizationRole(flex_actor2, tid=:custom)
@@ -35,7 +94,7 @@ end
3594
auto_assign!(complete_topology(3, tid=:custom), container)
3695

3796
activate(container) do
38-
wait(send_message(c, StartCoordinatedDistributedOptimization(), address(ca)))
97+
wait(send_message(c, StartCoordinatedDistributedOptimization([1.0, 2.0]), address(ca)))
3998
wait(coord_role.task)
4099
end
41100

0 commit comments

Comments
 (0)