)]}'
{
  "commit": "ac3b8e82175122e38bafaaa9cd419ba3cee11087",
  "tree": "90c50823d8842aab51402c97b7098ccb028cd58e",
  "parents": [
    "d4264ec10d9a270b53b5db86c0245ae8cbd2cf18"
  ],
  "author": {
    "name": "David Gossow",
    "email": "dgossow@google.com",
    "time": "Fri Apr 29 16:07:11 2016 +0200"
  },
  "committer": {
    "name": "Sameer Agarwal",
    "email": "sameeragarwal@google.com",
    "time": "Thu Aug 18 06:18:43 2016 +0000"
  },
  "message": "Gradient checking cleanup and local parameterization bugfix\n\nChange the Ceres gradient checking API to make is useful for\nunit testing, clean up code duplication and fix interaction between\ngradient checking and local parameterizations.\n\nThere were two gradient checking implementations, one being used\nwhen using the check_gradients flag in the Solver, the other\nbeing a standalone class. The standalone version was restricted\nto cost functions with fixed parameter sizes at compile time, which\nis being lifted here. This enables it to be used inside the\nGradientCheckingCostFunction as well.\n\nIn addition, this installs new hooks in the Solver to ensure\nthat Solve will fail if any incorrect gradients are detected. This\nway, you can set the check_gradient flags to true and detect\nerrors in an automated way, instead of just printing error information\nto the log. The error log is now also returned in the Solver summary\ninstead of being printed directly. The user can then decide what to\ndo with it. The existing hooks for user callbacks are used for\nthis purpose to keep the internal API changes minimal and non-invasive.\n\nThe last and biggest change is the way the the interaction between\nlocal parameterizations and the gradient checker works. Before,\nlocal parameterizations would be ignored by the checker. However,\nif a cost function does not compute its Jacobian along the null\nspace of the local parameterization, this wil not have any effect\non the solver, but would result in a gradient checker error.\nWith this change, the Jacobians are multiplied by the Jacobians\nof the respective local parameterization and thus being compared\nin the tangent space only.\n\nThe typical use case for this are quaternion parameters, where\na cost function will typically assume that the quaternion is\nalways normalized, skipping the correct computation of the Jacobian\nalong the normal to save computation cost.\n\nChange-Id: I5e1bb97b8a899436cea25101efe5011b0bb13282\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "311f8ae02b3af3077e390600c7eb6c626bbaaa20",
      "old_mode": 33188,
      "old_path": "docs/source/nnls_modeling.rst",
      "new_id": "b82f5ba46eec569bc92b51a4f0ec5e1321fb52a0",
      "new_mode": 33188,
      "new_path": "docs/source/nnls_modeling.rst"
    },
    {
      "type": "modify",
      "old_id": "4eb1fad4f6879632c5e7af2f307c9b3835538fd4",
      "old_mode": 33188,
      "old_path": "docs/source/nnls_solving.rst",
      "new_id": "ccf43a54b52fed6ab227db58391b938aea5b8fcc",
      "new_mode": 33188,
      "new_path": "docs/source/nnls_solving.rst"
    },
    {
      "type": "modify",
      "old_id": "28304159b449b931d2781ce2fb0fdc74d4f55ba1",
      "old_mode": 33188,
      "old_path": "include/ceres/gradient_checker.h",
      "new_id": "6d285daf1d9fff0c20086c549273cda990a6c179",
      "new_mode": 33188,
      "new_path": "include/ceres/gradient_checker.h"
    },
    {
      "type": "modify",
      "old_id": "5d24a8a8d343c2c57a6d246977ca1351c334f803",
      "old_mode": 33188,
      "old_path": "internal/ceres/CMakeLists.txt",
      "new_id": "74b0799ba86124ff4cde6d9922977f0baf4e203b",
      "new_mode": 33188,
      "new_path": "internal/ceres/CMakeLists.txt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "219027cfacdcc79ea484573fe8f2d24cccf798ab",
      "new_mode": 33188,
      "new_path": "internal/ceres/gradient_checker.cc"
    },
    {
      "type": "modify",
      "old_id": "474ead555862bf63b075e3c9c9b5d7093528f576",
      "old_mode": 33188,
      "old_path": "internal/ceres/gradient_checker_test.cc",
      "new_id": "d2ce6e39426ac4eca6d472ed88690b846cb61606",
      "new_mode": 33188,
      "new_path": "internal/ceres/gradient_checker_test.cc"
    },
    {
      "type": "modify",
      "old_id": "580fd260e15c63cf6698ea56af403cfea7f0b427",
      "old_mode": 33188,
      "old_path": "internal/ceres/gradient_checking_cost_function.cc",
      "new_id": "6f0c59b6119c77e308f6f04f2fa30fce7d4a3856",
      "new_mode": 33188,
      "new_path": "internal/ceres/gradient_checking_cost_function.cc"
    },
    {
      "type": "modify",
      "old_id": "cf92cb72bc560775cc11ec32867d26fbe2ad0ec5",
      "old_mode": 33188,
      "old_path": "internal/ceres/gradient_checking_cost_function.h",
      "new_id": "d8bbfedb231f26131f31562bb854b9d3ea98dd10",
      "new_mode": 33188,
      "new_path": "internal/ceres/gradient_checking_cost_function.h"
    },
    {
      "type": "modify",
      "old_id": "54c616619dc982a31e92d7b977b4daf024ec640e",
      "old_mode": 33188,
      "old_path": "internal/ceres/gradient_checking_cost_function_test.cc",
      "new_id": "e7238c669fe0696b2561bbb4b63fc275865f9db1",
      "new_mode": 33188,
      "new_path": "internal/ceres/gradient_checking_cost_function_test.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a91a17454d94aef57025bb86d46ceeba0e53fb08",
      "new_mode": 33188,
      "new_path": "internal/ceres/is_close.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7789448c8e8775b9eec0b8af751b6f0d59071537",
      "new_mode": 33188,
      "new_path": "internal/ceres/is_close.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8f7aabab5f11f3fde356f264981b3198b150a097",
      "new_mode": 33188,
      "new_path": "internal/ceres/is_close_test.cc"
    },
    {
      "type": "modify",
      "old_id": "7f6e8298151f438d0366444d4bf1cdfce37360be",
      "old_mode": 33188,
      "old_path": "internal/ceres/rotation_test.cc",
      "new_id": "d980ba2b771b925f38fd9f34b2a8e967944d85a7",
      "new_mode": 33188,
      "new_path": "internal/ceres/rotation_test.cc"
    },
    {
      "type": "modify",
      "old_id": "21d3c686962e194ac6bec05d4df72b94cf1e20d6",
      "old_mode": 33188,
      "old_path": "internal/ceres/solver.cc",
      "new_id": "5cc0a6681a379bd5e49efb206c94e61008873a49",
      "new_mode": 33188,
      "new_path": "internal/ceres/solver.cc"
    }
  ]
}
