@Override
  protected Pair<Vector<Float64>, Vector<Float64>> transformOriginalToInternState(
      List<Vector<Float64>> hist, Vector<Float64> target) {
    Vector<Float64> v = transformOriginalToInternState(hist);

    DataEntry lastState = new DataEntry(hist.get(hist.size() - 1));
    Vector<Float64> trans = lastState.getPos();
    Matrix<Float64> rot = lastState.getRotation();

    DataEntry t = new DataEntry(target);
    Vector<Float64> pos = rot.times(t.getPos().minus(trans));
    Vector<Float64> vel = rot.times(t.getVel());

    Vector<Float64> intern = Float64Vector.valueOf(pos.get(0), pos.get(1), vel.get(0), vel.get(1));

    return new Pair<Vector<Float64>, Vector<Float64>>(v, intern);
  }
  @Override
  protected Vector<Float64> transformOriginalToInternState(List<Vector<Float64>> data) {
    DataEntry lastState = new DataEntry(data.get(data.size() - 1));
    data.remove(data.size() - 1);

    Vector<Float64> trans = lastState.getPos();
    Matrix<Float64> rot = lastState.getRotation();

    List<Float64> concated = new ArrayList<Float64>(getHistorySize() * 4);

    concated.add(Float64.valueOf(lastState.getV()));

    for (Vector<Float64> v : data) {
      DataEntry d = new DataEntry(v);

      Vector<Float64> pos = rot.times(d.getPos().minus(trans));
      Vector<Float64> vel = rot.times(d.getVel());

      concated.addAll(
          Lists.newArrayList(
              pos.get(0), pos.get(1), vel.get(0), vel.get(1), Float64.valueOf(d.getV())));
    }
    return Float64Vector.valueOf(concated);
  }