)]}'
{
  "commit": "08e60379bac997b50aa59a1b47292aaf47f2c303",
  "tree": "ec458fd9a3dc220b4d706749774831fd98c191d5",
  "parents": [
    "b5b394c7388c80b7aebe91a255111c15b5013ce8"
  ],
  "author": {
    "name": "Sameer Agarwal",
    "email": "sameeragarwal@google.com",
    "time": "Tue Jun 13 00:12:00 2017 -0700"
  },
  "committer": {
    "name": "Sameer Agarwal",
    "email": "sameeragarwal@google.com",
    "time": "Wed Jun 21 23:41:36 2017 -0700"
  },
  "message": "Integrate InnerProductComputer\n\nDespite its relative size, this is very significant change\nto Ceres.\n\nWhy\n\u003d\u003d\u003d\n\nUp till now, when the user chose SPARSE_NORMAL_CHOLESKY,\nthe Jacobian was evaluated in a CompressedRowSparseMatrix,\nwhich was then use to compute the normal equations which were\npassed to a sparse linear algebra library for factorization.\n\nThe reason to do this was because in the case of SuiteSparse,\nwe were able to pass the Jacobian matrix directly without\ncomputing the normal equations and SuiteSparse/CHOLMOD did the\nnormal equation computation.\n\nThis turned out to be slow, so Cheng Wang implemented a high\nperformance version of the matrix-matrix multiply to compute\nthe normal equations, and all the sparse linear algebra libraries\nnow are passed the normal equations.\n\nSo that raises the question, as to what the best representation\nof the Jacobian which is suitable for the normal equation computation.\n\nTurns out BlockSparseMatrix is ideal. It brings two advantages.\n\n1. Jacobian evaluation into a BlockSparseMatrix is considerably\n   faster when using a BlockSparseMatrix than\n   CompressedRowSparseMatrix. This is because we save on a bunch\n   of memory copies.\n\n2. To make the matrix multiplication fast and use the block structure\n   Cheng Wang had to essentially make the CompressedRowSparseMatrix\n   carry a bunch of sidecar information about the block sparsity,\n   essentially making it behave like a BlockSparseMatrix. The resulting\n   code had fairly complicated indexing and complicated the semantics\n   of CompressedRowSparseMatrix. The new InnerProductComputer class\n   does away with all that and once this CL goes in, I will be able to\n   remove all that code and simplify the semantics of\n   CompressedRowSparseMatrix.\n\nChanges\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\n1. Use InnerProductComputer in SparseNormalCholeskySolver.\n2. Change the evaluator instantiated for SPARSE_NORMAL_CHOLESKY with\n   static sparsity inside evaluator.cc\n3. The former change necessitates that we change ProblemImpl::Evaluate\n   to create the evaluate it needs on its own, because it was\n   depending on passing \"SPARSE_NORMAL_CHOLESKY\" as linear solver type\n   to the evaluator factor to get an Evaluator which can use\n   CompressedRowSparseMatrix objects for storing the Jacobian.\n4. Update the tests for SparseNormalCholeskySolver.\n5. Separate out the tests for DynamicSparseNormalCholeskySolver into its\n   own file.\n\nChange-Id: I2ef7ef8fbfbb4967d0c1ec2068c1c778248fdf5b\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "052e7a0a5252549870dde6a9da78a0ecc91303f7",
      "old_mode": 33188,
      "old_path": "internal/ceres/CMakeLists.txt",
      "new_id": "357fae7046666ad4851e58f769bba61654e90b4e",
      "new_mode": 33188,
      "new_path": "internal/ceres/CMakeLists.txt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3fdf6a123b3640930c85c72ca68180832b7bc3ae",
      "new_mode": 33188,
      "new_path": "internal/ceres/dynamic_sparse_normal_cholesky_solver_test.cc"
    },
    {
      "type": "modify",
      "old_id": "baba9afa11b4b6a8ae3f29ef19434b9e51fcd31c",
      "old_mode": 33188,
      "old_path": "internal/ceres/evaluator.cc",
      "new_id": "6193ae8c9d9ae7fbaa32b1ffea311d8e4cac2d68",
      "new_mode": 33188,
      "new_path": "internal/ceres/evaluator.cc"
    },
    {
      "type": "modify",
      "old_id": "4abea8b33ee07061e6b22c86342483ee5266c178",
      "old_mode": 33188,
      "old_path": "internal/ceres/problem_impl.cc",
      "new_id": "98619585f0dc92cde5f25ce984723740600481eb",
      "new_mode": 33188,
      "new_path": "internal/ceres/problem_impl.cc"
    },
    {
      "type": "modify",
      "old_id": "e18f20abeda953ff86ea3c149f3d11dc1335175d",
      "old_mode": 33188,
      "old_path": "internal/ceres/sparse_cholesky_test.cc",
      "new_id": "c94beeadd55a9056c508c57c12ba4e99f6b290c1",
      "new_mode": 33188,
      "new_path": "internal/ceres/sparse_cholesky_test.cc"
    },
    {
      "type": "modify",
      "old_id": "32535489d136b89508ae4e28bfb66e9e75a77a44",
      "old_mode": 33188,
      "old_path": "internal/ceres/sparse_normal_cholesky_solver.cc",
      "new_id": "37f5a8efb3fd54f6a5ac9cad591e2b08acb38cff",
      "new_mode": 33188,
      "new_path": "internal/ceres/sparse_normal_cholesky_solver.cc"
    },
    {
      "type": "modify",
      "old_id": "597cff743895decaa3e591a65d9eb578691ed511",
      "old_mode": 33188,
      "old_path": "internal/ceres/sparse_normal_cholesky_solver.h",
      "new_id": "e24799d521384e76c9674c8cf7f1e82cc6a3dd8f",
      "new_mode": 33188,
      "new_path": "internal/ceres/sparse_normal_cholesky_solver.h"
    },
    {
      "type": "modify",
      "old_id": "ea4965ecaf258e8db7bcea1053dee04a48a84585",
      "old_mode": 33188,
      "old_path": "internal/ceres/sparse_normal_cholesky_solver_test.cc",
      "new_id": "2546c16b6b4afcf2bdee9b8ddbfe96b441e48571",
      "new_mode": 33188,
      "new_path": "internal/ceres/sparse_normal_cholesky_solver_test.cc"
    }
  ]
}
