Program: 189773
Project: 189773
Buggy source:
@Override public void goAlgo(){
  for (int step=0; step < stepSize; step++) {
    for (    Edge edge : graphModel.getGraph().getEdges()) {
      ((FDEBLayoutData)edge.getEdgeData().getLayoutData()).newSubdivisionPoints=Arrays.copyOf(((FDEBLayoutData)edge.getEdgeData().getLayoutData()).subdivisionPoints,((FDEBLayoutData)edge.getEdgeData().getLayoutData()).subdivisionPoints.length);
    }
    for (    Edge edge : graphModel.getGraph().getEdges()) {
      if (edge.isSelfLoop()) {
        continue;
      }
      FDEBLayoutData data=edge.getEdgeData().getLayoutData();
      double k=sprintConstant / (data.length * (data.subdivisionPoints.length - 1));
      for (int i=1; i < data.subdivisionPoints.length - 1; i++) {
        double Fsi_x=(data.subdivisionPoints[i - 1].x - data.subdivisionPoints[i].x) + (data.subdivisionPoints[i + 1].x - data.subdivisionPoints[i].x);
        double Fsi_y=(data.subdivisionPoints[i - 1].y - data.subdivisionPoints[i].y) + (data.subdivisionPoints[i + 1].y - data.subdivisionPoints[i].y);
        if (Math.abs(k) <= 1) {
          Fsi_x*=k;
          Fsi_y*=k;
        }
        double Fei_x=0;
        double Fei_y=0;
        for (        Edge moveEdge : graphModel.getGraph().getEdges()) {
          if (moveEdge.isSelfLoop()) {
            continue;
          }
          FDEBLayoutData moveData=moveEdge.getEdgeData().getLayoutData();
          double v_x=moveData.subdivisionPoints[i].x - data.subdivisionPoints[i].x;
          double v_y=moveData.subdivisionPoints[i].y - data.subdivisionPoints[i].y;
          if (Math.abs(v_x) > EPS || Math.abs(v_y) > EPS) {
            double len_sq=v_x * v_x + v_y * v_y;
            double m=(1.0 / Math.sqrt(len_sq));
            v_x*=m;
            v_y*=m;
            Fei_x+=v_x;
            Fei_y+=v_y;
          }
        }
        System.err.println("String_Node_Str" + (Fei_x + Fsi_x) + "String_Node_Str"+ (Fei_y + Fsi_y)+ "String_Node_Str"+ stepSize);
        data.newSubdivisionPoints[i]=new Point.Double(data.subdivisionPoints[i].x + stepSize * (Fei_x + Fsi_x),data.subdivisionPoints[i].y + stepSize * (Fei_y + Fsi_y));
      }
    }
    for (    Edge edge : graphModel.getGraph().getEdges()) {
      ((FDEBLayoutData)edge.getEdgeData().getLayoutData()).subdivisionPoints=((FDEBLayoutData)edge.getEdgeData().getLayoutData()).newSubdivisionPoints;
      ((FDEBLayoutData)edge.getEdgeData().getLayoutData()).newSubdivisionPoints=null;
    }
  }
  if (cycle == parameters.getNumCycles()) {
    setConverged(true);
  }
 else {
    prepareForTheNextStep();
  }
}

Fixed version (ground truth):
@Override public void goAlgo(){
  long totalEdges=0;
  long passedEdges=0;
  for (int step=0; step < iterationsPerCycle; step++) {
    for (    Edge edge : graphModel.getGraph().getEdges()) {
      ((FDEBLayoutData)edge.getEdgeData().getLayoutData()).newSubdivisionPoints=Arrays.copyOf(((FDEBLayoutData)edge.getEdgeData().getLayoutData()).subdivisionPoints,((FDEBLayoutData)edge.getEdgeData().getLayoutData()).subdivisionPoints.length);
    }
    for (    Edge edge : graphModel.getGraph().getEdges()) {
      if (edge.isSelfLoop()) {
        continue;
      }
      FDEBLayoutData data=edge.getEdgeData().getLayoutData();
      double k=sprintConstant / (data.length * (data.subdivisionPoints.length - 1));
      for (int i=1; i < data.subdivisionPoints.length - 1; i++) {
        double Fsi_x=(data.subdivisionPoints[i - 1].x - data.subdivisionPoints[i].x) + (data.subdivisionPoints[i + 1].x - data.subdivisionPoints[i].x);
        double Fsi_y=(data.subdivisionPoints[i - 1].y - data.subdivisionPoints[i].y) + (data.subdivisionPoints[i + 1].y - data.subdivisionPoints[i].y);
        if (Math.abs(k) <= 1) {
          Fsi_x*=k;
          Fsi_y*=k;
        }
        double Fei_x=0;
        double Fei_y=0;
        for (        Edge moveEdge : graphModel.getGraph().getEdges()) {
          if (moveEdge.isSelfLoop()) {
            continue;
          }
          totalEdges++;
          if (calculateCompatibility(edge,moveEdge) < EPS) {
            continue;
          }
          passedEdges++;
          FDEBLayoutData moveData=moveEdge.getEdgeData().getLayoutData();
          double v_x=moveData.subdivisionPoints[i].x - data.subdivisionPoints[i].x;
          double v_y=moveData.subdivisionPoints[i].y - data.subdivisionPoints[i].y;
          if (Math.abs(v_x) > EPS || Math.abs(v_y) > EPS) {
            double len_sq=v_x * v_x + v_y * v_y;
            double m=(calculateCompatibility(edge,moveEdge) / Math.sqrt(len_sq));
            v_x*=m;
            v_y*=m;
            Fei_x+=v_x;
            Fei_y+=v_y;
          }
        }
        data.newSubdivisionPoints[i]=new Point.Double(data.subdivisionPoints[i].x + stepSize * (Fei_x + Fsi_x),data.subdivisionPoints[i].y + stepSize * (Fei_y + Fsi_y));
      }
    }
    for (    Edge edge : graphModel.getGraph().getEdges()) {
      ((FDEBLayoutData)edge.getEdgeData().getLayoutData()).subdivisionPoints=((FDEBLayoutData)edge.getEdgeData().getLayoutData()).newSubdivisionPoints;
      ((FDEBLayoutData)edge.getEdgeData().getLayoutData()).newSubdivisionPoints=null;
    }
  }
  System.err.println("String_Node_Str" + totalEdges + "String_Node_Str"+ passedEdges+ "String_Node_Str"+ ((double)passedEdges) / totalEdges);
  if (cycle == parameters.getNumCycles()) {
    setConverged(true);
  }
 else {
    prepareForTheNextStep();
  }
}