/*
 *   (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <memory.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "av1/encoder/ransac.h"

#define MAX_PARAMDIM 9
#define MAX_MINPTS 4

#define MAX_DEGENERATE_ITER 10
#define MINPTS_MULTIPLIER 5

// svdcmp
// Adopted from Numerical Recipes in C

static const double TINY_NEAR_ZERO = 1.0E-12;

static inline double SIGN(double a, double b) {
  return ((b) >= 0 ? fabs(a) : -fabs(a));
}

static inline double PYTHAG(double a, double b) {
  double absa, absb, ct;
  absa = fabs(a);
  absb = fabs(b);

  if (absa > absb) {
    ct = absb / absa;
    return absa * sqrt(1.0 + ct * ct);
  } else {
    ct = absa / absb;
    return (absb == 0) ? 0 : absb * sqrt(1.0 + ct * ct);
  }
}

int IMIN(int a, int b) { return (((a) < (b)) ? (a) : (b)); }

int IMAX(int a, int b) { return (((a) < (b)) ? (b) : (a)); }

void MultiplyMat(double *m1, double *m2, double *res, const int M1,
                 const int N1, const int N2) {
  int timesInner = N1;
  int timesRows = M1;
  int timesCols = N2;
  double sum;

  int row, col, inner;
  for (row = 0; row < timesRows; ++row) {
    for (col = 0; col < timesCols; ++col) {
      sum = 0;
      for (inner = 0; inner < timesInner; ++inner)
        sum += m1[row * N1 + inner] * m2[inner * N2 + col];
      *(res++) = sum;
    }
  }
}

static int svdcmp_(double **u, int m, int n, double w[], double **v) {
  const int max_its = 30;
  int flag, i, its, j, jj, k, l, nm;
  double anorm, c, f, g, h, s, scale, x, y, z;
  double *rv1 = (double *)malloc(sizeof(*rv1) * (n + 1));
  g = scale = anorm = 0.0;
  for (i = 0; i < n; i++) {
    l = i + 1;
    rv1[i] = scale * g;
    g = s = scale = 0.0;
    if (i < m) {
      for (k = i; k < m; k++) scale += fabs(u[k][i]);
      if (scale) {
        for (k = i; k < m; k++) {
          u[k][i] /= scale;
          s += u[k][i] * u[k][i];
        }
        f = u[i][i];
        g = -SIGN(sqrt(s), f);
        h = f * g - s;
        u[i][i] = f - g;
        for (j = l; j < n; j++) {
          for (s = 0.0, k = i; k < m; k++) s += u[k][i] * u[k][j];
          f = s / h;
          for (k = i; k < m; k++) u[k][j] += f * u[k][i];
        }
        for (k = i; k < m; k++) u[k][i] *= scale;
      }
    }
    w[i] = scale * g;
    g = s = scale = 0.0;
    if (i < m && i != n - 1) {
      for (k = l; k < n; k++) scale += fabs(u[i][k]);
      if (scale) {
        for (k = l; k < n; k++) {
          u[i][k] /= scale;
          s += u[i][k] * u[i][k];
        }
        f = u[i][l];
        g = -SIGN(sqrt(s), f);
        h = f * g - s;
        u[i][l] = f - g;
        for (k = l; k < n; k++) rv1[k] = u[i][k] / h;
        for (j = l; j < m; j++) {
          for (s = 0.0, k = l; k < n; k++) s += u[j][k] * u[i][k];
          for (k = l; k < n; k++) u[j][k] += s * rv1[k];
        }
        for (k = l; k < n; k++) u[i][k] *= scale;
      }
    }
    anorm = fmax(anorm, (fabs(w[i]) + fabs(rv1[i])));
  }

  for (i = n - 1; i >= 0; i--) {
    if (i < n - 1) {
      if (g) {
        for (j = l; j < n; j++) v[j][i] = (u[i][j] / u[i][l]) / g;
        for (j = l; j < n; j++) {
          for (s = 0.0, k = l; k < n; k++) s += u[i][k] * v[k][j];
          for (k = l; k < n; k++) v[k][j] += s * v[k][i];
        }
      }
      for (j = l; j < n; j++) v[i][j] = v[j][i] = 0.0;
    }
    v[i][i] = 1.0;
    g = rv1[i];
    l = i;
  }

  for (i = IMIN(m, n) - 1; i >= 0; i--) {
    l = i + 1;
    g = w[i];
    for (j = l; j < n; j++) u[i][j] = 0.0;
    if (g) {
      g = 1.0 / g;
      for (j = l; j < n; j++) {
        for (s = 0.0, k = l; k < m; k++) s += u[k][i] * u[k][j];
        f = (s / u[i][i]) * g;
        for (k = i; k < m; k++) u[k][j] += f * u[k][i];
      }
      for (j = i; j < m; j++) u[j][i] *= g;
    } else {
      for (j = i; j < m; j++) u[j][i] = 0.0;
    }
    ++u[i][i];
  }
  for (k = n - 1; k >= 0; k--) {
    for (its = 0; its < max_its; its++) {
      flag = 1;
      for (l = k; l >= 0; l--) {
        nm = l - 1;
        if ((double)(fabs(rv1[l]) + anorm) == anorm || nm < 0) {
          flag = 0;
          break;
        }
        if ((double)(fabs(w[nm]) + anorm) == anorm) break;
      }
      if (flag) {
        c = 0.0;
        s = 1.0;
        for (i = l; i <= k; i++) {
          f = s * rv1[i];
          rv1[i] = c * rv1[i];
          if ((double)(fabs(f) + anorm) == anorm) break;
          g = w[i];
          h = PYTHAG(f, g);
          w[i] = h;
          h = 1.0 / h;
          c = g * h;
          s = -f * h;
          for (j = 0; j < m; j++) {
            y = u[j][nm];
            z = u[j][i];
            u[j][nm] = y * c + z * s;
            u[j][i] = z * c - y * s;
          }
        }
      }
      z = w[k];
      if (l == k) {
        if (z < 0.0) {
          w[k] = -z;
          for (j = 0; j < n; j++) v[j][k] = -v[j][k];
        }
        break;
      }
      if (its == max_its - 1) {
        return 1;
      }
      assert(k > 0);
      x = w[l];
      nm = k - 1;
      y = w[nm];
      g = rv1[nm];
      h = rv1[k];
      f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y);
      g = PYTHAG(f, 1.0);
      f = ((x - z) * (x + z) + h * ((y / (f + SIGN(g, f))) - h)) / x;
      c = s = 1.0;
      for (j = l; j <= nm; j++) {
        i = j + 1;
        g = rv1[i];
        y = w[i];
        h = s * g;
        g = c * g;
        z = PYTHAG(f, h);
        rv1[j] = z;
        c = f / z;
        s = h / z;
        f = x * c + g * s;
        g = g * c - x * s;
        h = y * s;
        y *= c;
        for (jj = 0; jj < n; jj++) {
          x = v[jj][j];
          z = v[jj][i];
          v[jj][j] = x * c + z * s;
          v[jj][i] = z * c - x * s;
        }
        z = PYTHAG(f, h);
        w[j] = z;
        if (z) {
          z = 1.0 / z;
          c = f * z;
          s = h * z;
        }
        f = c * g + s * y;
        x = c * y - s * g;
        for (jj = 0; jj < m; jj++) {
          y = u[jj][j];
          z = u[jj][i];
          u[jj][j] = y * c + z * s;
          u[jj][i] = z * c - y * s;
        }
      }
      rv1[l] = 0.0;
      rv1[k] = f;
      w[k] = x;
    }
  }
  free(rv1);
  return 0;
}

static int SVD(double *U, double *W, double *V, double *matx, int M, int N) {
  // Assumes allocation for U is MxN
  double **nrU, **nrV;
  int problem, i;

  nrU = (double **)malloc((M) * sizeof(*nrU));
  nrV = (double **)malloc((N) * sizeof(*nrV));
  problem = !(nrU && nrV);
  if (!problem) {
    problem = 0;
    for (i = 0; i < M; i++) {
      nrU[i] = &U[i * N];
    }
    for (i = 0; i < N; i++) {
      nrV[i] = &V[i * N];
    }
  }
  if (problem) {
    return 1;
  }

  /* copy from given matx into nrU */
  for (i = 0; i < M; i++) {
    memcpy(&(nrU[i][0]), matx + N * i, N * sizeof(*matx));
  }

  /* HERE IT IS: do SVD */
  if (svdcmp_(nrU, M, N, W, nrV)) {
    return 1;
  }

  /* free Numerical Recipes arrays */
  free(nrU);
  free(nrV);

  return 0;
}

int PseudoInverse(double *inv, double *matx, const int M, const int N) {
  double *U, *W, *V, ans;
  int i, j, k;
  U = (double *)malloc(M * N * sizeof(*matx));
  W = (double *)malloc(N * sizeof(*matx));
  V = (double *)malloc(N * N * sizeof(*matx));

  if (!(U && W && V)) {
    return 1;
  }
  if (SVD(U, W, V, matx, M, N)) {
    return 1;
  }
  for (i = 0; i < N; i++) {
    if (fabs(W[i]) < TINY_NEAR_ZERO) {
      return 1;
    }
  }

  for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
      ans = 0;
      for (k = 0; k < N; k++) {
        ans += V[k + N * i] * U[k + N * j] / W[k];
      }
      inv[j + M * i] = ans;
    }
  }
  free(U);
  free(W);
  free(V);
  return 0;
}

////////////////////////////////////////////////////////////////////////////////
// ransac
typedef int (*isDegenerateType)(double *p);
typedef void (*normalizeType)(double *p, int np, double *T);
typedef void (*denormalizeType)(double *H, double *T1, double *T2);
typedef int (*findTransformationType)(int points, double *points1,
                                      double *points2, double *H);

static int get_rand_indices(int npoints, int minpts, int *indices) {
  int i, j;
  unsigned int seed = (unsigned int)npoints;
  int ptr = rand_r(&seed) % npoints;
  if (minpts > npoints) return 0;
  indices[0] = ptr;
  ptr = (ptr == npoints - 1 ? 0 : ptr + 1);
  i = 1;
  while (i < minpts) {
    int index = rand_r(&seed) % npoints;
    while (index) {
      ptr = (ptr == npoints - 1 ? 0 : ptr + 1);
      for (j = 0; j < i; ++j) {
        if (indices[j] == ptr) break;
      }
      if (j == i) index--;
    }
    indices[i++] = ptr;
  }
  return 1;
}

int ransac_(double *matched_points, int npoints, int *number_of_inliers,
            int *best_inlier_mask, double *bestH, const int minpts,
            const int paramdim, isDegenerateType isDegenerate,
            normalizeType normalize, denormalizeType denormalize,
            findTransformationType findTransformation,
            ProjectPointsType projectpoints, TransformationType type) {
  static const double INLIER_THRESHOLD_NORMALIZED = 0.1;
  static const double INLIER_THRESHOLD_UNNORMALIZED = 1.0;
  static const double PROBABILITY_REQUIRED = 0.9;
  static const double EPS = 1e-12;
  static const int MIN_TRIALS = 20;

  const double inlier_threshold =
      (normalize && denormalize ? INLIER_THRESHOLD_NORMALIZED
                                : INLIER_THRESHOLD_UNNORMALIZED);
  int N = 10000, trial_count = 0;
  int i;
  int ret_val = 0;

  int max_inliers = 0;
  double best_variance = 0.0;
  double H[MAX_PARAMDIM];
  WarpedMotionParams wm;
  double points1[2 * MAX_MINPTS];
  double points2[2 * MAX_MINPTS];
  int indices[MAX_MINPTS];

  double *best_inlier_set1;
  double *best_inlier_set2;
  double *inlier_set1;
  double *inlier_set2;
  double *corners1;
  int *corners1_int;
  double *corners2;
  int *image1_coord;
  int *inlier_mask;

  double *cnp1, *cnp2;
  double T1[9], T2[9];

  // srand((unsigned)time(NULL)) ;
  // better to make this deterministic for a given sequence for ease of testing
  srand(npoints);

  *number_of_inliers = 0;
  if (npoints < minpts * MINPTS_MULTIPLIER) {
    printf("Cannot find motion with %d matches\n", npoints);
    return 1;
  }

  memset(&wm, 0, sizeof(wm));
  best_inlier_set1 = (double *)malloc(sizeof(*best_inlier_set1) * npoints * 2);
  best_inlier_set2 = (double *)malloc(sizeof(*best_inlier_set2) * npoints * 2);
  inlier_set1 = (double *)malloc(sizeof(*inlier_set1) * npoints * 2);
  inlier_set2 = (double *)malloc(sizeof(*inlier_set2) * npoints * 2);
  corners1 = (double *)malloc(sizeof(*corners1) * npoints * 2);
  corners1_int = (int *)malloc(sizeof(*corners1_int) * npoints * 2);
  corners2 = (double *)malloc(sizeof(*corners2) * npoints * 2);
  image1_coord = (int *)malloc(sizeof(*image1_coord) * npoints * 2);
  inlier_mask = (int *)malloc(sizeof(*inlier_mask) * npoints);

  for (cnp1 = corners1, cnp2 = corners2, i = 0; i < npoints; ++i) {
    *(cnp1++) = *(matched_points++);
    *(cnp1++) = *(matched_points++);
    *(cnp2++) = *(matched_points++);
    *(cnp2++) = *(matched_points++);
  }
  matched_points -= 4 * npoints;

  if (normalize && denormalize) {
    normalize(corners1, npoints, T1);
    normalize(corners2, npoints, T2);
  }

  while (N > trial_count) {
    int num_inliers = 0;
    double sum_distance = 0.0;
    double sum_distance_squared = 0.0;

    int degenerate = 1;
    int num_degenerate_iter = 0;
    while (degenerate) {
      num_degenerate_iter++;
      if (!get_rand_indices(npoints, minpts, indices)) {
        ret_val = 1;
        goto finish_ransac;
      }
      i = 0;
      while (i < minpts) {
        int index = indices[i];
        // add to list
        points1[i * 2] = corners1[index * 2];
        points1[i * 2 + 1] = corners1[index * 2 + 1];
        points2[i * 2] = corners2[index * 2];
        points2[i * 2 + 1] = corners2[index * 2 + 1];
        i++;
      }
      degenerate = isDegenerate(points1);
      if (num_degenerate_iter > MAX_DEGENERATE_ITER) {
        ret_val = 1;
        goto finish_ransac;
      }
    }

    if (findTransformation(minpts, points1, points2, H)) {
      trial_count++;
      continue;
    }

    for (i = 0; i < npoints; ++i) {
      corners1_int[2 * i] = (int)corners1[i * 2];
      corners1_int[2 * i + 1] = (int)corners1[i * 2 + 1];
    }

    av1_integerize_model(H, type, &wm);
    projectpoints((int16_t *)wm.wmmat, corners1_int, image1_coord, npoints, 2,
                  2, 0, 0);

    for (i = 0; i < npoints; ++i) {
      double dx =
          (image1_coord[i * 2] >> WARPEDPIXEL_PREC_BITS) - corners2[i * 2];
      double dy = (image1_coord[i * 2 + 1] >> WARPEDPIXEL_PREC_BITS) -
                  corners2[i * 2 + 1];
      double distance = sqrt(dx * dx + dy * dy);

      inlier_mask[i] = distance < inlier_threshold;
      if (inlier_mask[i]) {
        inlier_set1[num_inliers * 2] = corners1[i * 2];
        inlier_set1[num_inliers * 2 + 1] = corners1[i * 2 + 1];
        inlier_set2[num_inliers * 2] = corners2[i * 2];
        inlier_set2[num_inliers * 2 + 1] = corners2[i * 2 + 1];
        num_inliers++;
        sum_distance += distance;
        sum_distance_squared += distance * distance;
      }
    }

    if (num_inliers >= max_inliers) {
      double mean_distance = sum_distance / ((double)num_inliers);
      double variance = sum_distance_squared / ((double)num_inliers - 1.0) -
                        mean_distance * mean_distance * ((double)num_inliers) /
                            ((double)num_inliers - 1.0);
      if ((num_inliers > max_inliers) ||
          (num_inliers == max_inliers && variance < best_variance)) {
        best_variance = variance;
        max_inliers = num_inliers;
        memcpy(bestH, H, paramdim * sizeof(*bestH));
        memcpy(best_inlier_set1, inlier_set1,
               num_inliers * 2 * sizeof(*best_inlier_set1));
        memcpy(best_inlier_set2, inlier_set2,
               num_inliers * 2 * sizeof(*best_inlier_set2));
        memcpy(best_inlier_mask, inlier_mask,
               npoints * sizeof(*best_inlier_mask));

        if (num_inliers > 0) {
          double fracinliers = (double)num_inliers / (double)npoints;
          double pNoOutliers = 1 - pow(fracinliers, minpts);
          int temp;
          pNoOutliers = fmax(EPS, pNoOutliers);
          pNoOutliers = fmin(1 - EPS, pNoOutliers);
          temp = (int)(log(1.0 - PROBABILITY_REQUIRED) / log(pNoOutliers));
          if (temp > 0 && temp < N) {
            N = IMAX(temp, MIN_TRIALS);
          }
        }
      }
    }
    trial_count++;
  }
  findTransformation(max_inliers, best_inlier_set1, best_inlier_set2, bestH);
  if (normalize && denormalize) {
    denormalize(bestH, T1, T2);
  }
  *number_of_inliers = max_inliers;
finish_ransac:
  free(best_inlier_set1);
  free(best_inlier_set2);
  free(inlier_set1);
  free(inlier_set2);
  free(corners1);
  free(corners2);
  free(image1_coord);
  free(inlier_mask);
  return ret_val;
}

///////////////////////////////////////////////////////////////////////////////

static void normalizeHomography(double *pts, int n, double *T) {
  // Assume the points are 2d coordinates with scale = 1
  double *p = pts;
  double mean[2] = { 0, 0 };
  double msqe = 0;
  double scale;
  int i;
  for (i = 0; i < n; ++i, p += 2) {
    mean[0] += p[0];
    mean[1] += p[1];
  }
  mean[0] /= n;
  mean[1] /= n;
  for (p = pts, i = 0; i < n; ++i, p += 2) {
    p[0] -= mean[0];
    p[1] -= mean[1];
    msqe += sqrt(p[0] * p[0] + p[1] * p[1]);
  }
  msqe /= n;
  scale = sqrt(2) / msqe;
  T[0] = scale;
  T[1] = 0;
  T[2] = -scale * mean[0];
  T[3] = 0;
  T[4] = scale;
  T[5] = -scale * mean[1];
  T[6] = 0;
  T[7] = 0;
  T[8] = 1;
  for (p = pts, i = 0; i < n; ++i, p += 2) {
    p[0] *= scale;
    p[1] *= scale;
  }
}

static void invnormalize_mat(double *T, double *iT) {
  double is = 1.0 / T[0];
  double m0 = -T[2] * is;
  double m1 = -T[5] * is;
  iT[0] = is;
  iT[1] = 0;
  iT[2] = m0;
  iT[3] = 0;
  iT[4] = is;
  iT[5] = m1;
  iT[6] = 0;
  iT[7] = 0;
  iT[8] = 1;
}

static void denormalizeHomography(double *H, double *T1, double *T2) {
  double iT2[9];
  double H2[9];
  invnormalize_mat(T2, iT2);
  MultiplyMat(H, T1, H2, 3, 3, 3);
  MultiplyMat(iT2, H2, H, 3, 3, 3);
}

static void denormalizeAffine(double *H, double *T1, double *T2) {
  double Ha[MAX_PARAMDIM];
  Ha[0] = H[0];
  Ha[1] = H[1];
  Ha[2] = H[4];
  Ha[3] = H[2];
  Ha[4] = H[3];
  Ha[5] = H[5];
  Ha[6] = Ha[7] = 0;
  Ha[8] = 1;
  denormalizeHomography(Ha, T1, T2);
  H[0] = Ha[5];
  H[1] = Ha[2];
  H[2] = Ha[1];
  H[3] = Ha[0];
  H[4] = Ha[3];
  H[5] = Ha[4];
}

static void denormalizeRotZoom(double *H, double *T1, double *T2) {
  double Ha[MAX_PARAMDIM];
  Ha[0] = H[0];
  Ha[1] = H[1];
  Ha[2] = H[2];
  Ha[3] = -H[1];
  Ha[4] = H[0];
  Ha[5] = H[3];
  Ha[6] = Ha[7] = 0;
  Ha[8] = 1;
  denormalizeHomography(Ha, T1, T2);
  H[0] = Ha[5];
  H[1] = Ha[2];
  H[2] = Ha[1];
  H[3] = Ha[0];
}

static void denormalizeTranslation(double *H, double *T1, double *T2) {
  double Ha[MAX_PARAMDIM];
  Ha[0] = 1;
  Ha[1] = 0;
  Ha[2] = H[0];
  Ha[3] = 0;
  Ha[4] = 1;
  Ha[5] = H[1];
  Ha[6] = Ha[7] = 0;
  Ha[8] = 1;
  denormalizeHomography(Ha, T1, T2);
  H[0] = Ha[5];
  H[1] = Ha[2];
}

static int is_collinear3(double *p1, double *p2, double *p3) {
  static const double collinear_eps = 1e-3;
  const double v =
      (p2[0] - p1[0]) * (p3[1] - p1[1]) - (p2[1] - p1[1]) * (p3[0] - p1[0]);
  return fabs(v) < collinear_eps;
}

static int isDegenerateTranslation(double *p) {
  return (p[0] - p[2]) * (p[0] - p[2]) + (p[1] - p[3]) * (p[1] - p[3]) <= 2;
}

static int isDegenerateAffine(double *p) {
  return is_collinear3(p, p + 2, p + 4);
}

static int isDegenerateHomography(double *p) {
  return is_collinear3(p, p + 2, p + 4) || is_collinear3(p, p + 2, p + 6) ||
         is_collinear3(p, p + 4, p + 6) || is_collinear3(p + 2, p + 4, p + 6);
}

int findTranslation(const int np, double *pts1, double *pts2, double *mat) {
  int i;
  double sx, sy, dx, dy;
  double sumx, sumy;

  double T1[9], T2[9];
  normalizeHomography(pts1, np, T1);
  normalizeHomography(pts2, np, T2);

  sumx = 0;
  sumy = 0;
  for (i = 0; i < np; ++i) {
    dx = *(pts2++);
    dy = *(pts2++);
    sx = *(pts1++);
    sy = *(pts1++);

    sumx += dx - sx;
    sumy += dy - sy;
  }
  mat[0] = sumx / np;
  mat[1] = sumy / np;
  denormalizeTranslation(mat, T1, T2);
  return 0;
}

int findRotZoom(const int np, double *pts1, double *pts2, double *mat) {
  const int np2 = np * 2;
  double *a = (double *)malloc(sizeof(*a) * np2 * 9);
  double *b = a + np2 * 4;
  double *temp = b + np2;
  int i;
  double sx, sy, dx, dy;

  double T1[9], T2[9];
  normalizeHomography(pts1, np, T1);
  normalizeHomography(pts2, np, T2);

  for (i = 0; i < np; ++i) {
    dx = *(pts2++);
    dy = *(pts2++);
    sx = *(pts1++);
    sy = *(pts1++);

    a[i * 2 * 4 + 0] = sx;
    a[i * 2 * 4 + 1] = sy;
    a[i * 2 * 4 + 2] = 1;
    a[i * 2 * 4 + 3] = 0;
    a[(i * 2 + 1) * 4 + 0] = sy;
    a[(i * 2 + 1) * 4 + 1] = -sx;
    a[(i * 2 + 1) * 4 + 2] = 0;
    a[(i * 2 + 1) * 4 + 3] = 1;

    b[2 * i] = dx;
    b[2 * i + 1] = dy;
  }
  if (PseudoInverse(temp, a, np2, 4)) {
    free(a);
    return 1;
  }
  MultiplyMat(temp, b, mat, 4, np2, 1);
  denormalizeRotZoom(mat, T1, T2);
  free(a);
  return 0;
}

int findAffine(const int np, double *pts1, double *pts2, double *mat) {
  const int np2 = np * 2;
  double *a = (double *)malloc(sizeof(*a) * np2 * 13);
  double *b = a + np2 * 6;
  double *temp = b + np2;
  int i;
  double sx, sy, dx, dy;

  double T1[9], T2[9];
  normalizeHomography(pts1, np, T1);
  normalizeHomography(pts2, np, T2);

  for (i = 0; i < np; ++i) {
    dx = *(pts2++);
    dy = *(pts2++);
    sx = *(pts1++);
    sy = *(pts1++);

    a[i * 2 * 6 + 0] = sx;
    a[i * 2 * 6 + 1] = sy;
    a[i * 2 * 6 + 2] = 0;
    a[i * 2 * 6 + 3] = 0;
    a[i * 2 * 6 + 4] = 1;
    a[i * 2 * 6 + 5] = 0;
    a[(i * 2 + 1) * 6 + 0] = 0;
    a[(i * 2 + 1) * 6 + 1] = 0;
    a[(i * 2 + 1) * 6 + 2] = sx;
    a[(i * 2 + 1) * 6 + 3] = sy;
    a[(i * 2 + 1) * 6 + 4] = 0;
    a[(i * 2 + 1) * 6 + 5] = 1;

    b[2 * i] = dx;
    b[2 * i + 1] = dy;
  }
  if (PseudoInverse(temp, a, np2, 6)) {
    free(a);
    return 1;
  }
  MultiplyMat(temp, b, mat, 6, np2, 1);
  denormalizeAffine(mat, T1, T2);
  free(a);
  return 0;
}

int findHomography(const int np, double *pts1, double *pts2, double *mat) {
  // Implemented from Peter Kovesi's normalized implementation
  const int np3 = np * 3;
  double *a = (double *)malloc(sizeof(*a) * np3 * 18);
  double *U = a + np3 * 9;
  double S[9], V[9 * 9];
  int i, mini;
  double sx, sy, dx, dy;
  double T1[9], T2[9];

  normalizeHomography(pts1, np, T1);
  normalizeHomography(pts2, np, T2);

  for (i = 0; i < np; ++i) {
    dx = *(pts2++);
    dy = *(pts2++);
    sx = *(pts1++);
    sy = *(pts1++);

    a[i * 3 * 9 + 0] = a[i * 3 * 9 + 1] = a[i * 3 * 9 + 2] = 0;
    a[i * 3 * 9 + 3] = -sx;
    a[i * 3 * 9 + 4] = -sy;
    a[i * 3 * 9 + 5] = -1;
    a[i * 3 * 9 + 6] = dy * sx;
    a[i * 3 * 9 + 7] = dy * sy;
    a[i * 3 * 9 + 8] = dy;

    a[(i * 3 + 1) * 9 + 0] = sx;
    a[(i * 3 + 1) * 9 + 1] = sy;
    a[(i * 3 + 1) * 9 + 2] = 1;
    a[(i * 3 + 1) * 9 + 3] = a[(i * 3 + 1) * 9 + 4] = a[(i * 3 + 1) * 9 + 5] =
        0;
    a[(i * 3 + 1) * 9 + 6] = -dx * sx;
    a[(i * 3 + 1) * 9 + 7] = -dx * sy;
    a[(i * 3 + 1) * 9 + 8] = -dx;

    a[(i * 3 + 2) * 9 + 0] = -dy * sx;
    a[(i * 3 + 2) * 9 + 1] = -dy * sy;
    a[(i * 3 + 2) * 9 + 2] = -dy;
    a[(i * 3 + 2) * 9 + 3] = dx * sx;
    a[(i * 3 + 2) * 9 + 4] = dx * sy;
    a[(i * 3 + 2) * 9 + 5] = dx;
    a[(i * 3 + 2) * 9 + 6] = a[(i * 3 + 2) * 9 + 7] = a[(i * 3 + 2) * 9 + 8] =
        0;
  }

  if (SVD(U, S, V, a, np3, 9)) {
    free(a);
    return 1;
  } else {
    double minS = 1e12;
    mini = -1;
    for (i = 0; i < 9; ++i) {
      if (S[i] < minS) {
        minS = S[i];
        mini = i;
      }
    }
  }

  for (i = 0; i < 9; i++) mat[i] = V[i * 9 + mini];
  denormalizeHomography(mat, T1, T2);
  free(a);
  if (mat[8] == 0.0) {
    return 1;
  }
  return 0;
}

int findHomographyScale1(const int np, double *pts1, double *pts2,
                         double *mat) {
  // This implementation assumes h33 = 1, but does not seem to give good results
  const int np2 = np * 2;
  double *a = (double *)malloc(sizeof(*a) * np2 * 17);
  double *b = a + np2 * 8;
  double *temp = b + np2;
  int i, j;
  double sx, sy, dx, dy;
  double T1[9], T2[9];

  normalizeHomography(pts1, np, T1);
  normalizeHomography(pts2, np, T2);

  for (i = 0, j = np; i < np; ++i, ++j) {
    dx = *(pts2++);
    dy = *(pts2++);
    sx = *(pts1++);
    sy = *(pts1++);
    a[i * 8 + 0] = a[j * 8 + 3] = sx;
    a[i * 8 + 1] = a[j * 8 + 4] = sy;
    a[i * 8 + 2] = a[j * 8 + 5] = 1;
    a[i * 8 + 3] = a[i * 8 + 4] = a[i * 8 + 5] = a[j * 8 + 0] = a[j * 8 + 1] =
        a[j * 8 + 2] = 0;
    a[i * 8 + 6] = -dx * sx;
    a[i * 8 + 7] = -dx * sy;
    a[j * 8 + 6] = -dy * sx;
    a[j * 8 + 7] = -dy * sy;
    b[i] = dx;
    b[j] = dy;
  }

  if (PseudoInverse(temp, a, np2, 8)) {
    free(a);
    return 1;
  }
  MultiplyMat(temp, b, &*mat, 8, np2, 1);
  mat[8] = 1;

  denormalizeHomography(mat, T1, T2);
  free(a);
  return 0;
}

int ransacTranslation(double *matched_points, int npoints,
                      int *number_of_inliers, int *best_inlier_mask,
                      double *bestH) {
  return ransac_(matched_points, npoints, number_of_inliers, best_inlier_mask,
                 bestH, 3, 2, isDegenerateTranslation,
                 NULL,  // normalizeHomography,
                 NULL,  // denormalizeRotZoom,
                 findTranslation, projectPointsTranslation, TRANSLATION);
}

int ransacRotZoom(double *matched_points, int npoints, int *number_of_inliers,
                  int *best_inlier_mask, double *bestH) {
  return ransac_(matched_points, npoints, number_of_inliers, best_inlier_mask,
                 bestH, 3, 4, isDegenerateAffine,
                 NULL,  // normalizeHomography,
                 NULL,  // denormalizeRotZoom,
                 findRotZoom, projectPointsRotZoom, ROTZOOM);
}

int ransacAffine(double *matched_points, int npoints, int *number_of_inliers,
                 int *best_inlier_mask, double *bestH) {
  return ransac_(matched_points, npoints, number_of_inliers, best_inlier_mask,
                 bestH, 3, 6, isDegenerateAffine,
                 NULL,  // normalizeHomography,
                 NULL,  // denormalizeAffine,
                 findAffine, projectPointsAffine, AFFINE);
}

int ransacHomography(double *matched_points, int npoints,
                     int *number_of_inliers, int *best_inlier_mask,
                     double *bestH) {
  int result = ransac_(matched_points, npoints, number_of_inliers,
                       best_inlier_mask, bestH, 4, 8, isDegenerateHomography,
                       NULL,  // normalizeHomography,
                       NULL,  // denormalizeHomography,
                       findHomography, projectPointsHomography, HOMOGRAPHY);
  if (!result) {
    // normalize so that H33 = 1
    int i;
    double m = 1.0 / bestH[8];
    for (i = 0; i < 8; ++i) bestH[i] *= m;
    bestH[8] = 1.0;
  }
  return result;
}
