double LiveWLdiagram :: nearest_neighbor_energy (const Iter& it, int na, int nb) const
{
  int site = it->site();

  double E = 0.;
  double nb_ns_a = 0., nb_ns_b = 0.;
  for(int nbi = 0; nbi < _latt(it->site()).nbs(); nbi++) {
    int dir = _latt(site).nbdir(nbi);
    Iter it_ass = it->assoc(nbi);
    nb_ns_a += BH_Vnn (0, dir) * it_ass->z.nbef(0);
    nb_ns_b += BH_Vnn (1, dir) * it_ass->z.nbef(1);
  }
  E += na * nb_ns_a;
  E += nb * nb_ns_b;

  return E;
}
/*
void LiveWLdiagram :: shifted_diagonal_energy (const Iter& it, double& Ebef, double& Eaft)
{
  // On-site energy
  int nbef = it->z.nbef(), naft = it->z.naft(), site = it->site();
  int dn = naft - nbef;
  double dE = -EFF_MU[site] * dn;
  dE += BH_UHALF * (naft*(naft-1) - nbef*(nbef-1));
#ifdef NN_INTERACTION
    int neighbor_n = 0;
    for(int nbi = 0; nbi < _latt(site).nbs(); ++nbi) {
      Iter it_ass = it->assoc(nbi);
      double BH_Vnn = get_BH_Vnn (it->site(), it_ass->site());
      neighbor_n += BH_Vnn * it_ass->z.nbef();
    }
    dE += (dn * neighbor_n);
#endif
  if (dE > 0) {
    Eaft = dE + EOFFSET;
    Ebef = EOFFSET;
  }
  else if (dE < 0) {
    Eaft = EOFFSET;
    Ebef = -dE + EOFFSET;
  }
  else {
    Eaft = EOFFSET;
    Ebef = EOFFSET;
  }
}
*/
inline double LiveWLdiagram :: diagonal_energy (const Iter& it, int na, int nb) const
{
  double E = onsite_energy (it->site(), na, nb);
  #ifdef NN_INTERACTION
  E += nearest_neighbor_energy (it, na, nb);
  #endif
  return E;
}
void WLdiagram :: insert (const Iter& it_goal, int comp, double time, bool creat, bool up, Worm& worm, Iter& fix)
{
  Iter it_bef, it_aft;
  diag_insert (it_goal, time, it_bef, it_aft);
  set_operator (it_bef, it_aft, comp, creat);
  if (up) {
    worm.set (it_aft, up);
    fix = it_bef;
  }
  else {
    worm.set (it_bef, up);
    fix = it_aft;
  }

#ifdef DEBUG_MODE
  int site = it_goal->site();
  check (site, __func__);
#endif
#ifdef DEBUG_TRACK_MODE
__DEBUG_TRACK
#endif
}