anchor.diff:      EvalIdentifier = lasp_config:get(evaluation_identifier, undefined),
       EvalTimestamp = lasp_config:get(evaluation_timestamp, 0),
       atom_to_list(Simulation) ++ "-" ++ atom_to_list(EvalIdentifier) ++ "-" ++ integer_to_list(EvalTimestamp).
  +
  +%% @private
  +clients_from_marathon() ->
  +    DecodeFun = fun(Body) -> jsx:decode(Body, [return_maps]) end,
  +
  +    case get_request(generate_task_url("lasp-client"), DecodeFun) of
  +        {ok, Clients} ->
  +            generate_nodes(Clients);
  +        ClientError ->
  +            _ = lager:info("Invalid Marathon response: ~p", [ClientError]),
  +            []
  +    end.
  +
  +%% @private
  +servers_from_marathon() ->
  +    DecodeFun = fun(Body) -> jsx:decode(Body, [return_maps]) end,
  +
  +    case get_request(generate_task_url("lasp-server"), DecodeFun) of
  +        {ok, Servers} ->
  +            generate_nodes(Servers);
  +        ServerError ->
  +            _ = lager:info("Invalid Marathon response: ~p", [ServerError]),
  +            []
  +    end.
  
positive.code:             %% All nodes should attempt to refresh the membership.
              timer:send_after(?REFRESH_INTERVAL, ?REFRESH_MESSAGE)
      end,
      {ok, #state{attempted_nodes=sets:new(),
                  running_nodes=sets:new(),
                  graph=digraph:new()}}.
  
  %% @private
  -spec handle_call(term(), {pid(), term()}, #state{}) ->
  
negative.code: -define(ARTIFACT_MESSAGE,  artifact).
  
  %% State record.
  -record(state, {attempted_nodes, graph}).
  
  %%%===================================================================
  %%% API
  