anchor.diff:                                              {min_heap_size, 16383}]}]).
   
   %% initialize: return initial state.
  --spec init([]) -> atom().
  +-spec init([]) -> state().
   init([]) ->
       ?TRACE("Starting proposer for DHT node: ~p~n", [pid_groups:my_groupname()]),
       %% For easier debugging, use a named table (generates an atom)
  
positive.code:     ?TRACE("proposer:initialize for paxos id: ~p round ~p~n", [PaxosID,InitialRound]),
      case pdb:get(PaxosID, ETSTableName) of
          undefined ->
              pdb:set(state_new(PaxosID, ReplyTo, Acceptors, Proposal,
                                Majority, MaxProposers, InitialRound),
                      ETSTableName);
          _ ->
              log:log(error, "Duplicate proposer:initialize for paxos id ~p"
                             "Just triggering instead~n", [PaxosID])
      end,
      gen_component:post_op({proposer_trigger, PaxosID, InitialRound}, State);
  
  % trigger new proposer round
  on({proposer_trigger, PaxosID}, ETSTableName = State) ->
  
negative.code:             TmpState = state_reset_state(StateForID),
              NewState = state_inc_round(TmpState),
              pdb:set(NewState, ETSTableName),
              proposer_trigger(StateForID, PaxosID, state_get_round(NewState), State)
      end;
  
  %% trigger for given round is needed for initial round without auto-increment
  