// a RogueViz dialog to manipulate DHRG embeddings

int held_id = -1;

void show_likelihood() {
  cmode = sm::SIDE | sm::MAYDARK | sm::DIALOG_STRICT_X | sm::PANNING;
  gamescreen();

  dialog::init("DHRG information");
  
  ll bonus_tally[MAXDIST], bonus_edgetally[MAXDIST];

  if(held_id >= 0) {
    for(int i=0; i<MAXDIST; i++)
      bonus_tally[i] = tally[i],
      bonus_edgetally[i] = edgetally[i];
    auto& mc = vertices[held_id];
    add_to_set(mc, -1, 0);
    add_to_tally(mc, -1, 0);
    tallyedgesof(held_id, -1, mc);
    for(int i=0; i<MAXDIST; i++)
      bonus_tally[i] -= tally[i],
      bonus_edgetally[i] -= edgetally[i];
    tallyedgesof(held_id, +1, mc);
    add_to_tally(mc, +1, 0);    
    add_to_set(mc, +1, 0);
    }
  else 
    for(int i=0; i<MAXDIST; i++) bonus_tally[i] = 0;

  for(int u=0; u<MAXDIST; u++) if(tally[u] || bonus_tally[u]) {
    char buf[20];
    sprintf(buf, "%.6lf", lc_type == 'R' ? current_logistic.yes(u) : double(edgetally[u] * 1. / tally[u]));    
    string s = its(u);
    if(isize(s) == 1) s = "0" + s;
    s += ": " + its(edgetally[u]) + " / " + its(tally[u]);
    if(bonus_tally[u]) s += " [" + its(bonus_edgetally[u]) + "/" + its(bonus_tally[u]) + "]";
    dialog::addSelItem(s, buf, 0);
    }
  
  char letters[3] = {'O', 'R', 'M'};
  string lltypes[3] = {"opt", "logistic", "mono."};
  string clltype = "?";
  char nextletter;
  for(int i=0; i<3; i++) if(lc_type == letters[i])
    clltype = lltypes[i], nextletter = letters[(i+1)%3];
  
  getcstat = '-';

  dialog::addBreak(50);
  dialog::addSelItem("loglikelihood (" + clltype + ")", fts(loglik_chosen()), 'l');
  dialog::add_action([nextletter] () { lc_type = nextletter; });
  
  dialog::addSelItem("iterations of local search", its(iterations), 'i');
  dialog::add_action([] () { 
    embedder_loop(1); 
    ts_vertices = ts_rbase;
    place_rogueviz_vertices();
    if(!stored) rogueviz::storeall(), stored = true;
    else shmup::fixStorage();
    });
  
  dialog::addBack();
  dialog::display();

  if(held_id >= 0) {
    if(!mousepressed) held_id = -1;
    else if(mouseover) {    
      rogueviz::vdata[held_id].m->base = mouseover;
      shmup::fixStorage();
      dhrg::fixedges(); 

      auto& mc = vertices[held_id];
      tallyedgesof(held_id, -1, mc);
      add_to_set(mc, -1, 0);
      add_to_tally(mc, -1, 0);

      mc = find_mycell_by_path(computePath(rogueviz::vdata[held_id].m->base));

      tallyedgesof(held_id, 1, mc);
      add_to_tally(mc, 1, 0);
      add_to_set(mc, 1, 0);
      }
    }
  
  keyhandler = [] (int sym, int uni) {

    handlePanning(sym, uni);
    if(uni == '-' && held_id == -1) {
      for(int i=0; i<N; i++) if(rogueviz::vdata[i].m->base == mouseover)
        held_id = i;
      return;
      }

    dialog::handleNavigation(sym, uni);    
    if(doexiton(sym, uni)) popScreen();
    };
  }

bool dhrg_animate(int sym, int uni) {
  if((cmode & sm::NORMAL) && uni == '/') {
    clearMessages();

    if(ts_rbase > ts_vertices) {
      dhrg_init(); graph_from_rv(); 
      ts_vertices = ts_rbase;
      place_rogueviz_vertices();
      if(!stored) rogueviz::storeall(), stored = true;
      else shmup::fixStorage();
      }    
    pushScreen(show_likelihood);

    return true;
    }
  return false;
  }