MangoCarrier

MangoCarrier integrates with the mango-agents framework for networked multi-agent deployments. The algorithm code is identical to the SimpleCarrier version — only the wiring changes.

Note

mango-agents is an optional dependency. Install it with:

pip install "distributed-resource-optimization[mango]"

Roles

Two mango Role classes are provided:

DistributedOptimizationRole

Wraps a DistributedAlgorithm (e.g. a COHDA participant or ADMM flex actor) as a mango role. Messages are routed to the algorithm’s on_exchange_message().

CoordinatorRole

Wraps a Coordinator (e.g. an ADMM coordinator). Listens for a StartCoordinatedDistributedOptimization message, runs the optimisation, then broadcasts OptimizationFinishedMessage to all peers.

Example — COHDA with MangoCarrier

import asyncio
import mango
from distributed_resource_optimization import (
    DistributedOptimizationRole,
    create_cohda_participant,
    create_cohda_start_message,
)

async def main():
    c = mango.create_tcp_container(addr=("127.0.0.1", 5555))

    a1 = c.register(mango.agent_composed_of(
        DistributedOptimizationRole(
            create_cohda_participant(1, [[0.0, 1, 2], [1, 2, 3]]))))
    a2 = c.register(mango.agent_composed_of(
        DistributedOptimizationRole(
            create_cohda_participant(2, [[0.0, 1, 2], [1, 2, 3]]))))

    async with mango.activate(c):
        start = create_cohda_start_message([1.2, 2.0, 3.0])
        await a1.send_message(start, a2.addr)
        await asyncio.sleep(0.5)

asyncio.run(main())

Example — ADMM Consensus with MangoCarrier

import asyncio
import mango
from distributed_resource_optimization import (
    DistributedOptimizationRole,
    CoordinatorRole,
    StartCoordinatedDistributedOptimization,
    OptimizationFinishedMessage,
    create_admm_flex_actor_one_to_many,
    create_consensus_target_reach_admm_coordinator,
    create_admm_start_consensus,
)

async def main():
    c = mango.create_tcp_container(addr=("127.0.0.1", 5555))

    flex1 = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
    flex2 = create_admm_flex_actor_one_to_many(10, [0.6, 0.4])
    coordinator = create_consensus_target_reach_admm_coordinator()

    a1 = c.register(mango.agent_composed_of(DistributedOptimizationRole(flex1)))
    a2 = c.register(mango.agent_composed_of(DistributedOptimizationRole(flex2)))
    ca = c.register(mango.agent_composed_of(CoordinatorRole(coordinator)))

    async with mango.activate(c):
        start = StartCoordinatedDistributedOptimization(
            create_admm_start_consensus([1.0, 2.0])
        )
        await ca.send_message(start, ca.addr)
        await asyncio.sleep(5.0)

    print("Actor 1:", flex1.x.round(3))
    print("Actor 2:", flex2.x.round(3))

asyncio.run(main())

Topology

The MangoCarrier uses mango’s topology system to discover neighbours. Set up a topology before activating the container so that each role knows which agents to communicate with. Refer to the mango topology documentation for details.

See Also

  • MangoCarrier, DistributedOptimizationRole, CoordinatorRole

  • StartCoordinatedDistributedOptimization, OptimizationFinishedMessage

  • SimpleCarrier — lightweight in-process carrier