Exemplo n.º 1
0
        def run(
                self, epochs=1, self_learning_epochs=5, review_epochs=1, review_intervals={0: 100},
                weights_computation_interval=100, test_interval=1000, batch_size=10, gamma_weight=100,
                verbose=False):
            self.accuracies = []
            # self learning
            self.self_learning(epochs=self_learning_epochs)
            self.eval_accuracy()
            self.change_weights(gamma_weight=100)

            review_changes = np.asarray(list(review_intervals.keys()))[::-1]
            Xs_len = len(self.X_shared)
            total_iters = epochs*Xs_len
            for ep in range(epochs):
                # collective learning
                for k in range(Xs_len//batch_size):
                    if verbose:
                        if self.agent.id == 0:
                            print("Remaining {}".format(total_iters-(ep*Xs_len+k*batch_size)), end="\r")
                    # produce collective proxy label
                    samples = self.X_shared[k*batch_size:(k+1)*batch_size]
                    proxy_labels = self.collective_prediction(samples, batch_size)
                    # train on proxy data
                    loss_value, grads = self.grad(tf.reshape(samples, (batch_size, 28, 28, 1)), proxy_labels)
                    self.optimizer.apply_gradients(zip(grads, self.model.trainable_variables), self.stepsize)

                    current_interval = review_changes[np.argmax(review_changes <= k*batch_size)]
                    if (k*batch_size) % review_intervals[current_interval] == 0:
                        self.self_learning(epochs=review_epochs)

                    if (k*batch_size) % 100 == 0:
                        # Generate a common graph (everyone use the same seed)
                        Adj = binomial_random_graph(self.agent.communicator.size, p=0.5, seed=(k*batch_size))
                        W = metropolis_hastings(Adj)

                        # create local agent
                        self.agent.set_neighbors(
                            in_neighbors=np.nonzero(Adj[self.agent.id, :])[0].tolist(),
                            out_neighbors=np.nonzero(Adj[:, self.agent.id])[0].tolist())
                        self.agent.set_weights(in_weights=W[self.agent.id, :].tolist())

                    if (k*batch_size) % weights_computation_interval == 0:
                        self.eval_accuracy()
                        self.change_weights(gamma_weight = gamma_weight)

                    if (k*batch_size) % test_interval == 0:
                        self.test()
                        self.accuracies.append(float(self.test_accuracy.numpy()))

            if self.enable_log:
                return self.accuracies
Exemplo n.º 2
0
def generate_launch_description():
    ap = argparse.ArgumentParser(prog='ros2 launch choirbot_examples containment.launch.py')
    ap.add_argument("-n", "--number", help="number of robots", default=6, type=int)
    ap.add_argument("-s", "--seed", help="seed for initial positions", default=3, type=int)

    # parse arguments (exception thrown on error)
    args, _ = ap.parse_known_args(sys.argv)
    N = args.number # shorthand

    # generate communication graph (this function also sets the seed)
    Adj = binomial_random_graph(N, p=0.2, seed=args.seed)

    # generate initial positions in [-3, 3] with z = 0
    P = np.zeros((N, 3))
    P[:, 0:2] = np.random.randint(-3, 3, (N, 2))

    # initialize launch description with rviz executable
    rviz_config_dir = get_package_share_directory('choirbot_examples')
    rviz_config_file = os.path.join(rviz_config_dir, 'rvizconf.rviz')

    launch_description = [Node(package='rviz2', node_executable='rviz2', output='screen',
        arguments=['-d', rviz_config_file])]
    
    # add executables for each robot
    for i in range(N):

        in_neighbors = np.nonzero(Adj[:, i])[0].tolist()
        out_neighbors = np.nonzero(Adj[i, :])[0].tolist()

        is_leader = True if i < N/2 else False
        initial_pos = P[i, :].tolist()

        # guidance
        launch_description.append(Node(
            package='choirbot_examples', node_executable='choirbot_containment_guidance', output='screen',
            node_namespace='agent_{}'.format(i),
            parameters=[{'agent_id': i, 'N': N, 'in_neigh': in_neighbors, 'out_neigh': out_neighbors, 'is_leader': is_leader}]))

        # integrator
        launch_description.append(Node(
            package='choirbot_examples', node_executable='choirbot_containment_integrator', output='screen',
            node_namespace='agent_{}'.format(i),
            parameters=[{'agent_id': i, 'init_pos': initial_pos}]))

        # rviz
        launch_description.append(Node(
            package='choirbot_examples', node_executable='choirbot_containment_rviz', output='screen',
            node_namespace='agent_{}'.format(i),
            parameters=[{'agent_id': i}]))

    return LaunchDescription(launch_description)
Exemplo n.º 3
0
import dill as pickle
import numpy as np
from mpi4py import MPI
from disropt.agents import Agent
from disropt.algorithms import ConstraintsConsensus
from disropt.functions import Variable, SquaredNorm
from disropt.utils.graph_constructor import binomial_random_graph
from disropt.problems import Problem

# get MPI info
NN = MPI.COMM_WORLD.Get_size()
agent_id = MPI.COMM_WORLD.Get_rank()

# Generate a common graph (everyone uses the same seed)
Adj = binomial_random_graph(NN, p=0.03, seed=1)

np.random.seed(10 * agent_id)
#####################
# Problem parameters
#####################

# parameters of gaussians
mu = (np.array([0, 0]).transpose(), np.array([3, 2]).transpose())
sigma = (np.eye(2), np.eye(2))

dim = mu[0].shape[0]  # dimension of sample space

# number of samples (min 2 max 5 for each label)
nsamp = (np.random.randint(2, 6), np.random.randint(2, 6))
Exemplo n.º 4
0
from mpi4py import MPI
from disropt.agents import Agent
from disropt.algorithms.subgradient import BlockSubgradientMethod
from disropt.functions import QuadraticForm, Variable, SquaredNorm
from disropt.utils.utilities import is_pos_def
from disropt.constraints.projection_sets import Box
from disropt.utils.graph_constructor import binomial_random_graph, metropolis_hastings
from disropt.problems import Problem

# get MPI info
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
local_rank = comm.Get_rank()

# Generate a common graph (everyone use the same seed)
Adj = binomial_random_graph(nproc, p=0.3, seed=1)
W = metropolis_hastings(Adj)

# reset local seed
np.random.seed(local_rank)

agent = Agent(in_neighbors=np.nonzero(Adj[local_rank, :])[0].tolist(),
              out_neighbors=np.nonzero(Adj[:, local_rank])[0].tolist(),
              in_weights=W[local_rank, :].tolist())

# variable dimension
n = 6

# generate a positive definite matrix
P = np.random.randn(n, n)
P = P.transpose() @ P
Exemplo n.º 5
0
def generate_launch_description():
    ap = argparse.ArgumentParser(
        prog='ros2 launch choirbot_examples taskassignment.launch.py')
    ap.add_argument("-n",
                    "--number",
                    help="number of robots",
                    default=4,
                    type=int)
    ap.add_argument("-s",
                    "--seed",
                    help="seed for initial positions",
                    default=3,
                    type=int)

    # parse arguments (exception thrown on error)
    args, _ = ap.parse_known_args(sys.argv)
    N = args.number

    # generate communication graph (this function also sets the seed)
    Adj = binomial_random_graph(N, 0.2, seed=args.seed)

    # generate initial positions in [-3, 3] with z = 0
    P = np.zeros((N, 3))
    P[:, 0:2] = np.random.randint(-3, 3, (N, 2))

    # initialize launch description
    robot_launch = []  # launched after 10 sec (to let Gazebo open)
    launch_description = []  # launched immediately (will contain robot_launch)

    # add task table executable
    robot_launch.append(
        Node(package='choirbot_examples',
             node_executable='choirbot_taskassignment_table',
             output='screen',
             prefix=['xterm -hold -e'],
             parameters=[{
                 'N': N
             }]))

    # add executables for each robot
    for i in range(N):

        in_neighbors = np.nonzero(Adj[:, i])[0].tolist()
        out_neighbors = np.nonzero(Adj[i, :])[0].tolist()
        position = P[i, :].tolist()

        # guidance
        robot_launch.append(
            Node(package='choirbot_examples',
                 node_executable='choirbot_taskassignment_guidance',
                 output='screen',
                 prefix=['xterm -hold -e'],
                 node_namespace='agent_{}'.format(i),
                 parameters=[{
                     'agent_id': i,
                     'N': N,
                     'in_neigh': in_neighbors,
                     'out_neigh': out_neighbors
                 }]))

        # planner
        robot_launch.append(
            Node(package='choirbot_examples',
                 node_executable='choirbot_taskassignment_planner',
                 output='screen',
                 node_namespace='agent_{}'.format(i),
                 parameters=[{
                     'agent_id': i
                 }]))

        # controller
        robot_launch.append(
            Node(package='choirbot_examples',
                 node_executable='choirbot_taskassignment_controller',
                 output='screen',
                 node_namespace='agent_{}'.format(i),
                 parameters=[{
                     'agent_id': i
                 }]))

        # turtlebot spawner
        launch_description.append(
            Node(package='choirbot_examples',
                 node_executable='choirbot_turtlebot_spawner',
                 output='screen',
                 parameters=[{
                     'namespace': 'agent_{}'.format(i),
                     'position': position
                 }]))

    # include launcher for gazebo
    gazebo_launcher = os.path.join(
        get_package_share_directory('choirbot_examples'), 'gazebo.launch.py')
    launch_description.append(
        IncludeLaunchDescription(
            PythonLaunchDescriptionSource(gazebo_launcher)))

    # include delayed robot executables
    timer_action = TimerAction(period=10.0,
                               actions=[LaunchDescription(robot_launch)])
    launch_description.append(timer_action)

    return LaunchDescription(launch_description)