diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-02-17 19:39:32 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-02-17 19:39:32 +0400 |
commit | 17f6f7e2af6d725522176d9c665cd220ede3e6ca (patch) | |
tree | 2807108988a53be9adb200694d001743fc49ab2d /extern/libmv/patches/levenberg_marquardt.patch | |
parent | b7f3887a3a8a66aeba3a16ae5d76b934af3ccc7c (diff) |
Camera tracking: switch to own repo of libmv where most of patches are applied
and which includes latest changes from Keir's branch.
Hopefully it'll make backporting of changes back to main libmv repo easier.
Diffstat (limited to 'extern/libmv/patches/levenberg_marquardt.patch')
-rw-r--r-- | extern/libmv/patches/levenberg_marquardt.patch | 71 |
1 files changed, 0 insertions, 71 deletions
diff --git a/extern/libmv/patches/levenberg_marquardt.patch b/extern/libmv/patches/levenberg_marquardt.patch deleted file mode 100644 index 49ef82d73d2..00000000000 --- a/extern/libmv/patches/levenberg_marquardt.patch +++ /dev/null @@ -1,71 +0,0 @@ -diff --git a/src/libmv/numeric/levenberg_marquardt.h b/src/libmv/numeric/levenberg_marquardt.h -index 6a54f66..4473b72 100644 ---- a/src/libmv/numeric/levenberg_marquardt.h -+++ b/src/libmv/numeric/levenberg_marquardt.h -@@ -33,6 +33,7 @@ - - #include "libmv/numeric/numeric.h" - #include "libmv/numeric/function_derivative.h" -+#include "libmv/logging/logging.h" - - namespace libmv { - -@@ -123,26 +124,40 @@ class LevenbergMarquardt { - Parameters dx, x_new; - int i; - for (i = 0; results.status == RUNNING && i < params.max_iterations; ++i) { -- if (dx.norm() <= params.relative_step_threshold * x.norm()) { -+ VLOG(1) << "iteration: " << i; -+ VLOG(1) << "||f(x)||: " << f_(x).norm(); -+ VLOG(1) << "max(g): " << g.array().abs().maxCoeff(); -+ VLOG(1) << "u: " << u; -+ VLOG(1) << "v: " << v; -+ -+ AMatrixType A_augmented = A + u*AMatrixType::Identity(J.cols(), J.cols()); -+ Solver solver(A_augmented); -+ dx = solver.solve(g); -+ bool solved = (A_augmented * dx).isApprox(g); -+ if (!solved) { -+ LOG(ERROR) << "Failed to solve"; -+ } -+ if (solved && dx.norm() <= params.relative_step_threshold * x.norm()) { - results.status = RELATIVE_STEP_SIZE_TOO_SMALL; - break; -- } -- x_new = x + dx; -- // Rho is the ratio of the actual reduction in error to the reduction -- // in error that would be obtained if the problem was linear. -- // See [1] for details. -- Scalar rho((error.squaredNorm() - f_(x_new).squaredNorm()) -- / dx.dot(u*dx + g)); -- if (rho > 0) { -- // Accept the Gauss-Newton step because the linear model fits well. -- x = x_new; -- results.status = Update(x, params, &J, &A, &error, &g); -- Scalar tmp = Scalar(2*rho-1); -- u = u*std::max(1/3., 1 - (tmp*tmp*tmp)); -- v = 2; -- continue; -- } -- -+ } -+ if (solved) { -+ x_new = x + dx; -+ // Rho is the ratio of the actual reduction in error to the reduction -+ // in error that would be obtained if the problem was linear. -+ // See [1] for details. -+ Scalar rho((error.squaredNorm() - f_(x_new).squaredNorm()) -+ / dx.dot(u*dx + g)); -+ if (rho > 0) { -+ // Accept the Gauss-Newton step because the linear model fits well. -+ x = x_new; -+ results.status = Update(x, params, &J, &A, &error, &g); -+ Scalar tmp = Scalar(2*rho-1); -+ u = u*std::max(1/3., 1 - (tmp*tmp*tmp)); -+ v = 2; -+ continue; -+ } -+ } - // Reject the update because either the normal equations failed to solve - // or the local linear model was not good (rho < 0). Instead, increase u - // to move closer to gradient descent. |