Minor changes to the documentation.

1. Section title changes.
2. Moving the glog discussion into installation.rst
3. Re-working the faqs into two separate chapters.

Change-Id: I95dd25bace50f0f9077ef114504999190686963e
diff --git a/docs/source/api.rst b/docs/source/api.rst
deleted file mode 100644
index 051f6e7..0000000
--- a/docs/source/api.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-.. _chapter-api:
-
-=============
-API Reference
-=============
-
-.. toctree::
-   :maxdepth: 3
-
-   nnls_modeling
-   nnls_solving
-   gradient_solver
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 86e00f1..59a418e 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -41,7 +41,7 @@
 
 # General information about the project.
 project = u'Ceres Solver'
-copyright = u'2015 Google Inc'
+copyright = u'2016 Google Inc'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
@@ -86,7 +86,6 @@
 # A list of ignored prefixes for module index sorting.
 #modindex_common_prefix = []
 
-
 # -- Options for HTML output ---------------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
diff --git a/docs/source/faqs.rst b/docs/source/faqs.rst
index 7513f44..5a28f41 100644
--- a/docs/source/faqs.rst
+++ b/docs/source/faqs.rst
@@ -1,5 +1,9 @@
 .. _chapter-tricks:
 
+.. default-domain:: cpp
+
+.. cpp:namespace:: ceres
+
 ===================
 FAQS, Tips & Tricks
 ===================
@@ -7,324 +11,12 @@
 Answers to frequently asked questions, tricks of the trade and general
 wisdom.
 
-Building
-========
+.. toctree::
+   :maxdepth: 2
 
-#. Use `google-glog <http://code.google.com/p/google-glog>`_.
-
-   Ceres has extensive support for logging detailed information about
-   memory allocations and time consumed in various parts of the solve,
-   internal error conditions etc. This is done logging using the
-   `google-glog <http://code.google.com/p/google-glog>`_ library. We
-   use it extensively to observe and analyze Ceres's
-   performance. `google-glog <http://code.google.com/p/google-glog>`_
-   allows you to control its behaviour from the command line `flags
-   <http://google-glog.googlecode.com/svn/trunk/doc/glog.html>`_. Starting
-   with ``-logtostderr`` you can add ``-v=N`` for increasing values
-   of ``N`` to get more and more verbose and detailed information
-   about Ceres internals.
-
-   In an attempt to reduce dependencies, it is tempting to use
-   `miniglog` - a minimal implementation of the ``glog`` interface
-   that ships with Ceres. This is a bad idea. ``miniglog`` was written
-   primarily for building and using Ceres on Android because the
-   current version of `google-glog
-   <http://code.google.com/p/google-glog>`_ does not build using the
-   NDK. It has worse performance than the full fledged glog library
-   and is much harder to control and use.
-
-
-Modeling
-========
-
-#. Use analytical/automatic derivatives.
-
-   This is the single most important piece of advice we can give to
-   you. It is tempting to take the easy way out and use numeric
-   differentiation. This is a bad idea. Numeric differentiation is
-   slow, ill-behaved, hard to get right, and results in poor
-   convergence behaviour.
-
-   Ceres allows the user to define templated functors which will
-   be automatically differentiated. For most situations this is enough
-   and we recommend using this facility. In some cases the derivatives
-   are simple enough or the performance considerations are such that
-   the overhead of automatic differentiation is too much. In such
-   cases, analytic derivatives are recommended.
-
-   The use of numerical derivatives should be a measure of last
-   resort, where it is simply not possible to write a templated
-   implementation of the cost function.
-
-   In many cases it is not possible to do analytic or automatic
-   differentiation of the entire cost function, but it is generally
-   the case that it is possible to decompose the cost function into
-   parts that need to be numerically differentiated and parts that can
-   be automatically or analytically differentiated.
-
-   To this end, Ceres has extensive support for mixing analytic,
-   automatic and numeric differentiation. See
-   :class:`CostFunctionToFunctor`.
-
-#. When using Quaternions,  consider using :class:`QuaternionParameterization`.
-
-   `Quaternions <https://en.wikipedia.org/wiki/Quaternion>`_ are a
-   four dimensional parameterization of the space of three dimensional
-   rotations :math:`SO(3)`.  However, the :math:`SO(3)` is a three
-   dimensional set, and so is the tangent space of a
-   Quaternion. Therefore, it is sometimes (not always) benefecial to
-   associate a local parameterization with parameter blocks
-   representing a Quaternion. Assuming that the order of entries in
-   your parameter block is :math:`w,x,y,z`, you can use
-   :class:`QuaternionParameterization`.
-
-   If however, you are using `Eigen's Quaternion
-   <http://eigen.tuxfamily.org/dox/classEigen_1_1Quaternion.html>`_
-   object, whose layout is :math:`x,y,z,w`, then we recommend you use
-   Lloyd Hughes's `Ceres Extensions
-   <https://github.com/system123/ceres_extensions>`_.
-
-#. How do I solve problems with general linear & non-linear
-   **inequality** constraints with Ceres Solver?
-
-   Currently, Ceres Solver only supports upper and lower bounds
-   constraints on the parameter blocks.
-
-   A crude way of dealing with inequality constraints is have one or
-   more of your cost functions check if the inequalities you are
-   interested in are satisfied, and if not return false instead of
-   true. This will prevent the solver from ever stepping into an
-   infeasible region.
-
-   This requires that the starting point for the optimization be a
-   feasible point.  You also risk pre-mature convergence using this
-   method.
-
-#. How do I solve problems with general linear & non-linear **equality**
-   constraints with Ceres Solver?
-
-   There is no built in support in ceres for solving problems with
-   equality constraints.  Currently, Ceres Solver only supports upper
-   and lower bounds constraints on the parameter blocks.
-
-   The trick described above for dealing with inequality
-   constraints will **not** work for equality constraints.
-
-#. How do I set one or more components of a parameter block constant?
-
-   Using :class:`SubsetParameterization`.
-
-#. Putting `Inverse Function Theorem
-   <http://en.wikipedia.org/wiki/Inverse_function_theorem>`_ to use.
-
-   Every now and then we have to deal with functions which cannot be
-   evaluated analytically. Computing the Jacobian in such cases is
-   tricky. A particularly interesting case is where the inverse of the
-   function is easy to compute analytically. An example of such a
-   function is the Coordinate transformation between the `ECEF
-   <http://en.wikipedia.org/wiki/ECEF>`_ and the `WGS84
-   <http://en.wikipedia.org/wiki/World_Geodetic_System>`_ where the
-   conversion from WGS84 to ECEF is analytic, but the conversion
-   back to WGS84 uses an iterative algorithm. So how do you compute the
-   derivative of the ECEF to WGS84 transformation?
-
-   One obvious approach would be to numerically
-   differentiate the conversion function. This is not a good idea. For
-   one, it will be slow, but it will also be numerically quite
-   bad.
-
-   Turns out you can use the `Inverse Function Theorem
-   <http://en.wikipedia.org/wiki/Inverse_function_theorem>`_ in this
-   case to compute the derivatives more or less analytically.
-
-   The key result here is. If :math:`x = f^{-1}(y)`, and :math:`Df(x)`
-   is the invertible Jacobian of :math:`f` at :math:`x`. Then the
-   Jacobian :math:`Df^{-1}(y) = [Df(x)]^{-1}`, i.e., the Jacobian of
-   the :math:`f^{-1}` is the inverse of the Jacobian of :math:`f`.
-
-   Algorithmically this means that given :math:`y`, compute :math:`x =
-   f^{-1}(y)` by whatever means you can. Evaluate the Jacobian of
-   :math:`f` at :math:`x`. If the Jacobian matrix is invertible, then
-   its inverse is the Jacobian of :math:`f^{-1}(y)` at  :math:`y`.
-
-   One can put this into practice with the following code fragment.
-
-   .. code-block:: c++
-
-      Eigen::Vector3d ecef; // Fill some values
-      // Iterative computation.
-      Eigen::Vector3d lla = ECEFToLLA(ecef);
-      // Analytic derivatives
-      Eigen::Matrix3d lla_to_ecef_jacobian = LLAToECEFJacobian(lla);
-      bool invertible;
-      Eigen::Matrix3d ecef_to_lla_jacobian;
-      lla_to_ecef_jacobian.computeInverseWithCheck(ecef_to_lla_jacobian, invertible);
-
-
-Solving
-=======
-
-#. How do I evaluate the Jacobian for a solver problem?
-
-   Using :func:`Problem::Evaluate`.
-
-#. Choosing a linear solver.
-
-   When using the ``TRUST_REGION`` minimizer, the choice of linear
-   solver is an important decision. It affects solution quality and
-   runtime. Here is a simple way to reason about it.
-
-   1. For small (a few hundred parameters) or dense problems use
-      ``DENSE_QR``.
-
-   2. For general sparse problems (i.e., the Jacobian matrix has a
-      substantial number of zeros) use
-      ``SPARSE_NORMAL_CHOLESKY``. This requires that you have
-      ``SuiteSparse`` or ``CXSparse`` installed.
-
-   3. For bundle adjustment problems with up to a hundred or so
-      cameras, use ``DENSE_SCHUR``.
-
-   4. For larger bundle adjustment problems with sparse Schur
-      Complement/Reduced camera matrices use ``SPARSE_SCHUR``. This
-      requires that you build Ceres with support for ``SuiteSparse``,
-      ``CXSparse`` or Eigen's sparse linear algebra libraries.
-
-      If you do not have access to these libraries for whatever
-      reason, ``ITERATIVE_SCHUR`` with ``SCHUR_JACOBI`` is an
-      excellent alternative.
-
-   5. For large bundle adjustment problems (a few thousand cameras or
-      more) use the ``ITERATIVE_SCHUR`` solver. There are a number of
-      preconditioner choices here. ``SCHUR_JACOBI`` offers an
-      excellent balance of speed and accuracy. This is also the
-      recommended option if you are solving medium sized problems for
-      which ``DENSE_SCHUR`` is too slow but ``SuiteSparse`` is not
-      available.
-
-      .. NOTE::
-
-        If you are solving small to medium sized problems, consider
-        setting ``Solver::Options::use_explicit_schur_complement`` to
-        ``true``, it can result in a substantial performance boost.
-
-      If you are not satisfied with ``SCHUR_JACOBI``'s performance try
-      ``CLUSTER_JACOBI`` and ``CLUSTER_TRIDIAGONAL`` in that
-      order. They require that you have ``SuiteSparse``
-      installed. Both of these preconditioners use a clustering
-      algorithm. Use ``SINGLE_LINKAGE`` before ``CANONICAL_VIEWS``.
-
-#. Use :func:`Solver::Summary::FullReport` to diagnose performance problems.
-
-   When diagnosing Ceres performance issues - runtime and convergence,
-   the first place to start is by looking at the output of
-   ``Solver::Summary::FullReport``. Here is an example
-
-   .. code-block:: bash
-
-     ./bin/bundle_adjuster --input ../data/problem-16-22106-pre.txt
-
-     iter      cost      cost_change  |gradient|   |step|    tr_ratio  tr_radius  ls_iter  iter_time  total_time
-        0  4.185660e+06    0.00e+00    2.16e+07   0.00e+00   0.00e+00  1.00e+04       0    7.50e-02    3.58e-01
-        1  1.980525e+05    3.99e+06    5.34e+06   2.40e+03   9.60e-01  3.00e+04       1    1.84e-01    5.42e-01
-        2  5.086543e+04    1.47e+05    2.11e+06   1.01e+03   8.22e-01  4.09e+04       1    1.53e-01    6.95e-01
-        3  1.859667e+04    3.23e+04    2.87e+05   2.64e+02   9.85e-01  1.23e+05       1    1.71e-01    8.66e-01
-        4  1.803857e+04    5.58e+02    2.69e+04   8.66e+01   9.93e-01  3.69e+05       1    1.61e-01    1.03e+00
-        5  1.803391e+04    4.66e+00    3.11e+02   1.02e+01   1.00e+00  1.11e+06       1    1.49e-01    1.18e+00
-
-     Ceres Solver v1.12.0 Solve Report
-     ----------------------------------
-                                          Original                  Reduced
-     Parameter blocks                        22122                    22122
-     Parameters                              66462                    66462
-     Residual blocks                         83718                    83718
-     Residual                               167436                   167436
-
-     Minimizer                        TRUST_REGION
-
-     Sparse linear algebra library    SUITE_SPARSE
-     Trust region strategy     LEVENBERG_MARQUARDT
-
-                                             Given                     Used
-     Linear solver                    SPARSE_SCHUR             SPARSE_SCHUR
-     Threads                                     1                        1
-     Linear solver threads                       1                        1
-     Linear solver ordering              AUTOMATIC                22106, 16
-
-     Cost:
-     Initial                          4.185660e+06
-     Final                            1.803391e+04
-     Change                           4.167626e+06
-
-     Minimizer iterations                        5
-     Successful steps                            5
-     Unsuccessful steps                          0
-
-     Time (in seconds):
-     Preprocessor                            0.283
-
-       Residual evaluation                   0.061
-       Jacobian evaluation                   0.361
-       Linear solver                         0.382
-     Minimizer                               0.895
-
-     Postprocessor                           0.002
-     Total                                   1.220
-
-     Termination:                   NO_CONVERGENCE (Maximum number of iterations reached.)
-
-  Let us focus on run-time performance. The relevant lines to look at
-  are
-
-
-   .. code-block:: bash
-
-     Time (in seconds):
-     Preprocessor                            0.283
-
-       Residual evaluation                   0.061
-       Jacobian evaluation                   0.361
-       Linear solver                         0.382
-     Minimizer                               0.895
-
-     Postprocessor                           0.002
-     Total                                   1.220
-
-
-  Which tell us that of the total 1.2 seconds, about .3 seconds was
-  spent in the linear solver and the rest was mostly spent in
-  preprocessing and jacobian evaluation.
-
-  The preprocessing seems particularly expensive. Looking back at the
-  report, we observe
-
-   .. code-block:: bash
-
-     Linear solver ordering              AUTOMATIC                22106, 16
-
-  Which indicates that we are using automatic ordering for the
-  ``SPARSE_SCHUR`` solver. This can be expensive at times. A straight
-  forward way to deal with this is to give the ordering manually. For
-  ``bundle_adjuster`` this can be done by passing the flag
-  ``-ordering=user``. Doing so and looking at the timing block of the
-  full report gives us
-
-   .. code-block:: bash
-
-     Time (in seconds):
-     Preprocessor                            0.051
-
-       Residual evaluation                   0.053
-       Jacobian evaluation                   0.344
-       Linear solver                         0.372
-     Minimizer                               0.854
-
-     Postprocessor                           0.002
-     Total                                   0.935
-
-
+   modeling_faqs
+   solving_faqs
 
-  The preprocessor time has gone down by more than 5.5x!.
 
 Further Reading
 ===============
diff --git a/docs/source/features.rst b/docs/source/features.rst
index 681876e..1f5e91e 100644
--- a/docs/source/features.rst
+++ b/docs/source/features.rst
@@ -1,6 +1,6 @@
-========
-Features
-========
+====
+Why?
+====
 .. _chapter-features:
 
 * **Code Quality** - Ceres Solver has been used in production at
diff --git a/docs/source/guide.rst b/docs/source/guide.rst
new file mode 100644
index 0000000..bcf6bc8
--- /dev/null
+++ b/docs/source/guide.rst
@@ -0,0 +1,12 @@
+.. _chapter-users-guide:
+
+============
+User's Guide
+============
+
+.. toctree::
+   :maxdepth: 2
+
+   nnls_modeling
+   nnls_solving
+   gradient_solver
diff --git a/docs/source/index.rst b/docs/source/index.rst
index f7f02ef..3851dd1 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -1,20 +1,30 @@
-.. Ceres Solver documentation master file, created by
-   sphinx-quickstart on Sat Jan 19 00:07:33 2013.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
 ============
 Ceres Solver
 ============
 
+Ceres Solver [#f1]_ is an open source C++ library for modeling and
+solving large, complicated optimization problems. It can be used to
+solve `Non-linear Least Squares`_ problems with bounds constraints and
+general unconstrained optimization problems. It is a mature, feature
+rich, and performant library that has been used in production at
+Google since 2010. For more, see :doc:`features`.
+
+`ceres-solver@googlegroups.com
+<https://groups.google.com/forum/?fromgroups#!forum/ceres-solver>`_ is
+the place for discussions and questions about Ceres Solver. We use the
+`GitHub Issue Tracker
+<https://github.com/ceres-solver/ceres-solver/issues>`_ to manage bug
+reports and feature requests.
+
+
 .. toctree::
-   :maxdepth: 3
+   :maxdepth: 1
    :hidden:
 
-   features
-   building
+   installation
    tutorial
-   api
+   guide
+   features
    faqs
    users
    contributing
@@ -22,34 +32,8 @@
    bibliography
    license
 
-Ceres Solver [#f1]_ is an open source C++ library for modeling and
-solving large, complicated optimization problems. It is a feature
-rich, mature and performant library which has been used in production
-at Google since 2010. Ceres Solver can solve two kinds of problems.
-
-1. `Non-linear Least Squares`_ problems with bounds constraints.
-2. General unconstrained optimization problems.
-
 .. _Non-linear Least Squares: http://en.wikipedia.org/wiki/Non-linear_least_squares
 
-Getting started
-===============
-
-* Download the `latest stable release
-  <http://ceres-solver.org/ceres-solver-1.12.0.tar.gz>`_ or clone the
-  Git repository for the latest development version.
-
-  .. code-block:: bash
-
-       git clone https://ceres-solver.googlesource.com/ceres-solver
-
-* Read the :ref:`chapter-tutorial` and browse the :ref:`chapter-api`.
-* Join the `mailing list
-  <https://groups.google.com/forum/?fromgroups#!forum/ceres-solver>`_
-  and ask questions.
-* File bugs, feature requests on `GitHub
-  <https://github.com/ceres-solver/ceres-solver/issues>`_.
-
 
 Cite Us
 =======
diff --git a/docs/source/building.rst b/docs/source/installation.rst
similarity index 61%
rename from docs/source/building.rst
rename to docs/source/installation.rst
index 37a3942..ddda50f 100644
--- a/docs/source/building.rst
+++ b/docs/source/installation.rst
@@ -1,8 +1,8 @@
-.. _chapter-building:
+.. _chapter-installation:
 
-=======================
-Building & Installation
-=======================
+============
+Installation
+============
 
 Getting the source code
 =======================
@@ -37,30 +37,41 @@
 - `CMake <http://www.cmake.org>`_ 2.8.0 or later.
   **Required on all platforms except for Android.**
 
-- `Google Log <http://code.google.com/p/google-glog>`_ 0.3.1 or
+- `glog <https://github.com/google/glog>`_ 0.3.1 or
   later. **Recommended**
 
-  .. NOTE::
+  ``glog`` is used extensively throughout Ceres for logging detailed
+  information about memory allocations and time consumed in various
+  parts of the solve, internal error conditions etc. The Ceres
+  developers use it extensively to observe and analyze Ceres's
+  performance. `glog <https://github.com/google/glog>`_ allows you to
+  control its behaviour from the command line. Starting with
+  ``-logtostderr`` you can add ``-v=N`` for increasing values of ``N``
+  to get more and more verbose and detailed information about Ceres
+  internals.
 
-    Ceres has a minimal replacement of ``glog`` called ``miniglog``
-    that can be enabled with the ``MINIGLOG`` build
-    option. ``miniglog`` is needed on Android as ``glog`` currently
-    does not build using the NDK. It can however be used on other
-    platforms too.
+  Unfortunately, the current version of `google-glog
+  <https://github.com/google/glog>`_ does not build using the Android
+  NDK. So, Ceres also ships with a minimal replacement of ``glog``
+  called ``miniglog`` that can be enabled with the ``MINIGLOG`` build
+  option.
 
-    **We do not advise using** ``miniglog`` **on platforms other than
-    Android due to the various performance and functionality
-    compromises in** ``miniglog``.
+  So, in an attempt to reduce dependencies, it is tempting to use
+  `miniglog` on platforms other than Android. While there is nothing
+  preventing the user from doing so, we strongly recommend against
+  it. ``miniglog`` has worse performance than ``glog`` and is much
+  harder to control and use.
 
   .. NOTE ::
 
-     If you are compiling ``glog`` from source, please note that currently,
-     the unit tests for ``glog`` (which are enabled by default) do not compile
-     against a default build of ``gflags`` 2.1 as the gflags namespace changed
-     from ``google::`` to ``gflags::``.  A patch to fix this is available from
-     `here <https://code.google.com/p/google-glog/issues/detail?id=194>`_.
+     If you are compiling ``glog`` from source, please note that
+     currently, the unit tests for ``glog`` (which are enabled by
+     default) do not compile against a default build of ``gflags`` 2.1
+     as the gflags namespace changed from ``google::`` to
+     ``gflags::``.  A patch to fix this is available from `here
+     <https://code.google.com/p/google-glog/issues/detail?id=194>`_.
 
-- `Google Flags <http://code.google.com/p/gflags>`_. Needed to build
+- `gflags <https://github.com/gflags/gflags>`_. Needed to build
   examples and tests.
 
 - `SuiteSparse
@@ -110,8 +121,9 @@
  package repository (built from SuiteSparse v3.4.0) **cannot** be used
  to build Ceres as a *shared* library.  Thus if you want to build
  Ceres as a shared library using SuiteSparse, you must perform a
- source install of SuiteSparse or use an external PPA (see
- `bug report here <https://bugs.launchpad.net/ubuntu/+source/suitesparse/+bug/1333214>`_).
+ source install of SuiteSparse or use an external PPA (see `bug report
+ here
+ <https://bugs.launchpad.net/ubuntu/+source/suitesparse/+bug/1333214>`_).
  It is recommended that you use the current version of SuiteSparse
  (4.2.1 at the time of writing).
 
@@ -333,15 +345,16 @@
  are at least two possible fixes to this problem:
 
  #. Use ``google-glog`` and define ``GLOG_NO_ABBREVIATED_SEVERITIES``
-    when building Ceres and your own project, as documented
-    `here <http://google-glog.googlecode.com/svn/trunk/doc/glog.html>`__.
-    Note that this fix will not work for ``miniglog``,
-    but use of ``miniglog`` is strongly discouraged on any platform for which
+    when building Ceres and your own project, as documented `here
+    <http://google-glog.googlecode.com/svn/trunk/doc/glog.html>`__.
+    Note that this fix will not work for ``miniglog``, but use of
+    ``miniglog`` is strongly discouraged on any platform for which
     ``google-glog`` is available (which includes Windows).
- #. If you do not require GDI, then define ``NOGDI`` **before** including
-    windows.h.  This solution should work for both ``google-glog`` and
-    ``miniglog`` and is documented for ``google-glog``
-    `here <https://code.google.com/p/google-glog/issues/detail?id=33>`__.
+ #. If you do not require GDI, then define ``NOGDI`` **before**
+    including windows.h.  This solution should work for both
+    ``google-glog`` and ``miniglog`` and is documented for
+    ``google-glog`` `here
+    <https://code.google.com/p/google-glog/issues/detail?id=33>`__.
 
 #. Make a toplevel directory for deps & build & src somewhere: ``ceres/``
 #. Get dependencies; unpack them as subdirectories in ``ceres/``
@@ -353,17 +366,19 @@
    #. ``google-glog`` Open up the Visual Studio solution and build it.
    #. ``gflags`` Open up the Visual Studio solution and build it.
 
-   #. (Experimental) ``SuiteSparse`` Previously SuiteSparse was not available
-      on Windows, recently it has become possible to build it on Windows using
-      the `suitesparse-metis-for-windows <https://github.com/jlblancoc/suitesparse-metis-for-windows>`_
-      project.  If you wish to use ``SuiteSparse``, follow their instructions
-      for obtaining and building it.
+   #. (Experimental) ``SuiteSparse`` Previously SuiteSparse was not
+      available on Windows, recently it has become possible to build
+      it on Windows using the `suitesparse-metis-for-windows
+      <https://github.com/jlblancoc/suitesparse-metis-for-windows>`_
+      project.  If you wish to use ``SuiteSparse``, follow their
+      instructions for obtaining and building it.
 
-   #. (Experimental) ``CXSparse`` Previously CXSparse was not available on
-      Windows, there are now several ports that enable it to be, including:
-      `[1] <https://github.com/PetterS/CXSparse>`_ and
-      `[2] <https://github.com/TheFrenchLeaf/CXSparse>`_.  If you wish to use
-      ``CXSparse``, follow their instructions for obtaining and building it.
+   #. (Experimental) ``CXSparse`` Previously CXSparse was not
+      available on Windows, there are now several ports that enable it
+      to be, including: `[1] <https://github.com/PetterS/CXSparse>`_
+      and `[2] <https://github.com/TheFrenchLeaf/CXSparse>`_.  If you
+      wish to use ``CXSparse``, follow their instructions for
+      obtaining and building it.
 
 #. Unpack the Ceres tarball into ``ceres``. For the tarball, you
    should get a directory inside ``ceres`` similar to
@@ -391,12 +406,13 @@
    #. (Optional) ``CXSPARSE_INCLUDE_DIR_HINTS``
    #. (Optional) ``CXSPARSE_LIBRARY_DIR_HINTS``
 
-   to the appropriate directories where you unpacked/built them. If any of
-   the variables are not visible in the ``CMake`` GUI, create a new entry
-   for them.  We recommend using the ``<NAME>_(INCLUDE/LIBRARY)_DIR_HINTS``
-   variables rather than setting the ``<NAME>_INCLUDE_DIR`` &
-   ``<NAME>_LIBRARY`` variables directly to keep all of the validity
-   checking, and to avoid having to specify the library files manually.
+   to the appropriate directories where you unpacked/built them. If
+   any of the variables are not visible in the ``CMake`` GUI, create a
+   new entry for them.  We recommend using the
+   ``<NAME>_(INCLUDE/LIBRARY)_DIR_HINTS`` variables rather than
+   setting the ``<NAME>_INCLUDE_DIR`` & ``<NAME>_LIBRARY`` variables
+   directly to keep all of the validity checking, and to avoid having
+   to specify the library files manually.
 
 #. You may have to tweak some more settings to generate a MSVC
    project.  After each adjustment, try pressing Configure & Generate
@@ -442,8 +458,9 @@
 
    You need iOS version 7.0 or higher to build Ceres Solver.
 
-To build Ceres for iOS, we need to force ``CMake`` to find the toolchains from
-the iOS SDK instead of using the standard ones. For example:
+To build Ceres for iOS, we need to force ``CMake`` to find the
+toolchains from the iOS SDK instead of using the standard ones. For
+example:
 
 .. code-block:: bash
 
@@ -454,21 +471,24 @@
    <PATH_TO_CERES_SOURCE>
 
 ``PLATFORM`` can be: ``OS``, ``SIMULATOR`` or ``SIMULATOR64``. You can
-build for ``OS`` (``armv7``, ``armv7s``, ``arm64``), ``SIMULATOR`` (``i386``) or
-``SIMULATOR64`` (``x86_64``) separately and use ``lipo`` to merge them into
-one static library.  See ``cmake/iOS.cmake`` for more options.
+build for ``OS`` (``armv7``, ``armv7s``, ``arm64``), ``SIMULATOR``
+(``i386``) or ``SIMULATOR64`` (``x86_64``) separately and use ``lipo``
+to merge them into one static library.  See ``cmake/iOS.cmake`` for
+more options.
 
-After building, you will get a ``libceres.a`` library, which you will need to
-add to your Xcode project.
+After building, you will get a ``libceres.a`` library, which you will
+need to add to your Xcode project.
 
 The default CMake configuration builds a bare bones version of Ceres
-Solver that only depends on Eigen (``MINIGLOG`` is compiled into Ceres if it is
-used), this should be sufficient for solving small to moderate sized problems
-(No ``SPARSE_SCHUR``, ``SPARSE_NORMAL_CHOLESKY`` linear solvers and no
-``CLUSTER_JACOBI`` and ``CLUSTER_TRIDIAGONAL`` preconditioners).
+Solver that only depends on Eigen (``MINIGLOG`` is compiled into Ceres
+if it is used), this should be sufficient for solving small to
+moderate sized problems (No ``SPARSE_SCHUR``,
+``SPARSE_NORMAL_CHOLESKY`` linear solvers and no ``CLUSTER_JACOBI``
+and ``CLUSTER_TRIDIAGONAL`` preconditioners).
 
-If you decide to use ``LAPACK`` and ``BLAS``, then you also need to add
-``Accelerate.framework`` to your Xcode project's linking dependency.
+If you decide to use ``LAPACK`` and ``BLAS``, then you also need to
+add ``Accelerate.framework`` to your Xcode project's linking
+dependency.
 
 .. _section-customizing:
 
@@ -477,28 +497,30 @@
 
 It is possible to reduce the libraries needed to build Ceres and
 customize the build process by setting the appropriate options in
-``CMake``.  These options can either be set in the ``CMake`` GUI,
-or via ``-D<OPTION>=<ON/OFF>`` when running ``CMake`` from the
-command line.  In general, you should only modify these options from
-their defaults if you know what you are doing.
+``CMake``.  These options can either be set in the ``CMake`` GUI, or
+via ``-D<OPTION>=<ON/OFF>`` when running ``CMake`` from the command
+line.  In general, you should only modify these options from their
+defaults if you know what you are doing.
 
 .. NOTE::
 
- If you are setting variables via ``-D<VARIABLE>=<VALUE>`` when calling
- ``CMake``, it is important to understand that this forcibly **overwrites** the
- variable ``<VARIABLE>`` in the ``CMake`` cache at the start of *every configure*.
+ If you are setting variables via ``-D<VARIABLE>=<VALUE>`` when
+ calling ``CMake``, it is important to understand that this forcibly
+ **overwrites** the variable ``<VARIABLE>`` in the ``CMake`` cache at
+ the start of *every configure*.
 
- This can lead to confusion if you are invoking the ``CMake``
- `curses <http://www.gnu.org/software/ncurses/ncurses.html>`_ terminal GUI
- (via ``ccmake``, e.g. ```ccmake -D<VARIABLE>=<VALUE> <PATH_TO_SRC>``).
- In this case, even if you change the value of ``<VARIABLE>`` in the ``CMake``
- GUI, your changes will be **overwritten** with the value passed via
- ``-D<VARIABLE>=<VALUE>`` (if one exists) at the start of each configure.
+ This can lead to confusion if you are invoking the ``CMake`` `curses
+ <http://www.gnu.org/software/ncurses/ncurses.html>`_ terminal GUI
+ (via ``ccmake``, e.g. ```ccmake -D<VARIABLE>=<VALUE>
+ <PATH_TO_SRC>``).  In this case, even if you change the value of
+ ``<VARIABLE>`` in the ``CMake`` GUI, your changes will be
+ **overwritten** with the value passed via ``-D<VARIABLE>=<VALUE>``
+ (if one exists) at the start of each configure.
 
- As such, it is generally easier not to pass values to ``CMake`` via ``-D``
- and instead interactively experiment with their values in the ``CMake`` GUI.
- If they are not present in the *Standard View*, toggle to the *Advanced View*
- with ``<t>``.
+ As such, it is generally easier not to pass values to ``CMake`` via
+ ``-D`` and instead interactively experiment with their values in the
+ ``CMake`` GUI.  If they are not present in the *Standard View*,
+ toggle to the *Advanced View* with ``<t>``.
 
 Options controlling Ceres configuration
 ---------------------------------------
@@ -548,33 +570,35 @@
 
 #. ``CXX11 [Default: OFF]`` *Non-MSVC compilers only*.
 
-   Although Ceres does not currently use C++11, it does use ``shared_ptr``
-   (required) and ``unordered_map`` (if available); both of which existed in the
-   previous iterations of what became the C++11 standard: TR1 & C++0x.  As such,
-   Ceres can compile on pre-C++11 compilers, using the TR1/C++0x versions of
-   ``shared_ptr`` & ``unordered_map``.
+   Although Ceres does not currently use C++11, it does use
+   ``shared_ptr`` (required) and ``unordered_map`` (if available);
+   both of which existed in the previous iterations of what became the
+   C++11 standard: TR1 & C++0x.  As such, Ceres can compile on
+   pre-C++11 compilers, using the TR1/C++0x versions of ``shared_ptr``
+   & ``unordered_map``.
 
-   Note that when using GCC & Clang, compiling against the TR1/C++0x versions:
-   ``CXX11=OFF`` (the default) *does not* require ``-std=c++11`` when compiling
-   Ceres, *nor* does it require that any client code using Ceres use
-   ``-std=c++11``.   However, this will cause compile errors if any client code
-   that uses Ceres also uses C++11 (mismatched versions of ``shared_ptr`` &
-   ``unordered_map``).
+   Note that when using GCC & Clang, compiling against the TR1/C++0x
+   versions: ``CXX11=OFF`` (the default) *does not* require
+   ``-std=c++11`` when compiling Ceres, *nor* does it require that any
+   client code using Ceres use ``-std=c++11``.  However, this will
+   cause compile errors if any client code that uses Ceres also uses
+   C++11 (mismatched versions of ``shared_ptr`` & ``unordered_map``).
 
    Enabling this option: ``CXX11=ON`` forces Ceres to use the C++11
-   versions of ``shared_ptr`` & ``unordered_map`` if they are available, and
-   thus imposes the requirement that all client code using Ceres also
-   compile with ``-std=c++11``.  This requirement is handled automatically
-   through CMake target properties on the exported Ceres target for CMake >=
-   2.8.12 (when it was introduced).  Thus, any client code which uses CMake will
-   automatically be compiled with ``-std=c++11``.  **On CMake versions <
-   2.8.12, you are responsible for ensuring that any code which uses Ceres is
+   versions of ``shared_ptr`` & ``unordered_map`` if they are
+   available, and thus imposes the requirement that all client code
+   using Ceres also compile with ``-std=c++11``.  This requirement is
+   handled automatically through CMake target properties on the
+   exported Ceres target for CMake >= 2.8.12 (when it was introduced).
+   Thus, any client code which uses CMake will automatically be
+   compiled with ``-std=c++11``.  **On CMake versions < 2.8.12, you
+   are responsible for ensuring that any code which uses Ceres is
    compiled with** ``-std=c++11``.
 
-   On OS X 10.9+, Clang will use the C++11 versions of ``shared_ptr`` &
-   ``unordered_map`` without ``-std=c++11`` and so this option does not change
-   the versions detected, although enabling it *will* require that client code
-   compile with ``-std=c++11``.
+   On OS X 10.9+, Clang will use the C++11 versions of ``shared_ptr``
+   & ``unordered_map`` without ``-std=c++11`` and so this option does
+   not change the versions detected, although enabling it *will*
+   require that client code compile with ``-std=c++11``.
 
    The following table summarises the effects of the ``CXX11`` option:
 
@@ -587,61 +611,68 @@
    OS X 10.9+           ON          std               **Yes**
    ===================  ==========  ================  ======================================
 
-   The ``CXX11`` option does does not exist when using MSVC, as there any new
-   C++ features available are enabled by default, and there is no analogue of
-   ``-std=c++11``.  It will however be available on MinGW & CygWin, which can
-   support ``-std=c++11``.
+   The ``CXX11`` option does does not exist when using MSVC, as there
+   any new C++ features available are enabled by default, and there is
+   no analogue of ``-std=c++11``.  It will however be available on
+   MinGW & CygWin, which can support ``-std=c++11``.
 
 #. ``BUILD_SHARED_LIBS [Default: OFF]``: By default Ceres is built as
    a static library, turn this ``ON`` to instead build Ceres as a
    shared library.
 
-#. ``EXPORT_BUILD_DIR [Default: OFF]``: By default Ceres is configured solely
-   for installation, and so must be installed in order for clients to use it.
-   Turn this ``ON`` to export Ceres' build directory location into the
-   `user's local CMake package registry <http://www.cmake.org/cmake/help/v3.2/manual/cmake-packages.7.html#user-package-registry>`_
-   where it will be detected **without requiring installation** in a client
-   project using CMake when `find_package(Ceres) <http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
+#. ``EXPORT_BUILD_DIR [Default: OFF]``: By default Ceres is configured
+   solely for installation, and so must be installed in order for
+   clients to use it.  Turn this ``ON`` to export Ceres' build
+   directory location into the `user's local CMake package registry
+   <http://www.cmake.org/cmake/help/v3.2/manual/cmake-packages.7.html#user-package-registry>`_
+   where it will be detected **without requiring installation** in a
+   client project using CMake when `find_package(Ceres)
+   <http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
    is invoked.
 
 #. ``BUILD_DOCUMENTATION [Default: OFF]``: Use this to enable building
-   the documentation, requires `Sphinx <http://sphinx-doc.org/>`_ and the
-   `sphinx_rtd_theme <https://pypi.python.org/pypi/sphinx_rtd_theme>`_
-   package available from the Python package index. In addition,
-   ``make ceres_docs`` can be used to build only the documentation.
+   the documentation, requires `Sphinx <http://sphinx-doc.org/>`_ and
+   the `sphinx-better-theme
+   <https://pypi.python.org/pypi/sphinx-better-theme>`_ package
+   available from the Python package index. In addition, ``make
+   ceres_docs`` can be used to build only the documentation.
 
 #. ``MSVC_USE_STATIC_CRT [Default: OFF]`` *Windows Only*: By default
-   Ceres will use the Visual Studio default, *shared* C-Run Time (CRT) library.
-   Turn this ``ON`` to use the *static* C-Run Time library instead.
+   Ceres will use the Visual Studio default, *shared* C-Run Time (CRT)
+   library.  Turn this ``ON`` to use the *static* C-Run Time library
+   instead.
 
-#. ``LIB_SUFFIX [Default: "64" on non-Debian/Arch based 64-bit Linux, otherwise: ""]``:
-   The suffix to append to the library install directory, built from:
+#. ``LIB_SUFFIX [Default: "64" on non-Debian/Arch based 64-bit Linux,
+   otherwise: ""]``: The suffix to append to the library install
+   directory, built from:
    ``${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}``.
 
-   The filesystem hierarchy standard recommends that 64-bit systems install
-   native libraries to lib64 rather than lib.  Most Linux distributions follow
-   this convention, but Debian and Arch based distros do not.  Note that the
-   only generally sensible values for ``LIB_SUFFIX`` are "" and "64".
+   The filesystem hierarchy standard recommends that 64-bit systems
+   install native libraries to lib64 rather than lib.  Most Linux
+   distributions follow this convention, but Debian and Arch based
+   distros do not.  Note that the only generally sensible values for
+   ``LIB_SUFFIX`` are "" and "64".
 
-   Although by default Ceres will auto-detect non-Debian/Arch based 64-bit
-   Linux distributions and default ``LIB_SUFFIX`` to "64", this can always be
-   overridden by manually specifying LIB_SUFFIX using: ``-DLIB_SUFFIX=<VALUE>``
-   when invoking CMake.
+   Although by default Ceres will auto-detect non-Debian/Arch based
+   64-bit Linux distributions and default ``LIB_SUFFIX`` to "64", this
+   can always be overridden by manually specifying LIB_SUFFIX using:
+   ``-DLIB_SUFFIX=<VALUE>`` when invoking CMake.
 
 
 Options controlling Ceres dependency locations
 ----------------------------------------------
 
-Ceres uses the ``CMake``
-`find_package <http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
+Ceres uses the ``CMake`` `find_package
+<http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
 function to find all of its dependencies using
-``Find<DEPENDENCY_NAME>.cmake`` scripts which are either included in Ceres
-(for most dependencies) or are shipped as standard with ``CMake``
-(for ``LAPACK`` & ``BLAS``).  These scripts will search all of the "standard"
-install locations for various OSs for each dependency.  However, particularly
-for Windows, they may fail to find the library, in this case you will have to
-manually specify its installed location.  The ``Find<DEPENDENCY_NAME>.cmake``
-scripts shipped with Ceres support two ways for you to do this:
+``Find<DEPENDENCY_NAME>.cmake`` scripts which are either included in
+Ceres (for most dependencies) or are shipped as standard with
+``CMake`` (for ``LAPACK`` & ``BLAS``).  These scripts will search all
+of the "standard" install locations for various OSs for each
+dependency.  However, particularly for Windows, they may fail to find
+the library, in this case you will have to manually specify its
+installed location.  The ``Find<DEPENDENCY_NAME>.cmake`` scripts
+shipped with Ceres support two ways for you to do this:
 
 #. Set the *hints* variables specifying the *directories* to search in
    preference, but in addition, to the search directories in the
@@ -663,58 +694,62 @@
    ``Find<DEPENDENCY_NAME>.cmake`` script, but validation is still
    performed.
 
-   These variables are available to set in the ``CMake`` GUI. They
-   are visible in the *Standard View* if the library has not been
-   found (but the current Ceres configuration requires it), but
-   are always visible in the *Advanced View*.  They can also be
-   set directly via ``-D<VAR>=<VALUE>`` arguments to ``CMake``.
+   These variables are available to set in the ``CMake`` GUI. They are
+   visible in the *Standard View* if the library has not been found
+   (but the current Ceres configuration requires it), but are always
+   visible in the *Advanced View*.  They can also be set directly via
+   ``-D<VAR>=<VALUE>`` arguments to ``CMake``.
 
 Building using custom BLAS & LAPACK installs
 ----------------------------------------------
 
-If the standard find package scripts for ``BLAS`` & ``LAPACK`` which ship with
-``CMake`` fail to find the desired libraries on your system, try setting
-``CMAKE_LIBRARY_PATH`` to the path(s) to the directories containing the
-``BLAS`` & ``LAPACK`` libraries when invoking ``CMake`` to build Ceres via
-``-D<VAR>=<VALUE>``.  This should result in the libraries being found for any
-common variant of each.
+If the standard find package scripts for ``BLAS`` & ``LAPACK`` which
+ship with ``CMake`` fail to find the desired libraries on your system,
+try setting ``CMAKE_LIBRARY_PATH`` to the path(s) to the directories
+containing the ``BLAS`` & ``LAPACK`` libraries when invoking ``CMake``
+to build Ceres via ``-D<VAR>=<VALUE>``.  This should result in the
+libraries being found for any common variant of each.
 
-If you are building on an exotic system, or setting ``CMAKE_LIBRARY_PATH``
-does not work, or is not appropriate for some other reason, one option would be
-to write your own custom versions of ``FindBLAS.cmake`` &
-``FindLAPACK.cmake`` specific to your environment.  In this case you must set
-``CMAKE_MODULE_PATH`` to the directory containing these custom scripts when
-invoking ``CMake`` to build Ceres and they will be used in preference to the
-default versions.  However, in order for this to work, your scripts must provide
-the full set of variables provided by the default scripts.  Also, if you are
-building Ceres with ``SuiteSparse``, the versions of ``BLAS`` & ``LAPACK``
-used by ``SuiteSparse`` and Ceres should be the same.
+If you are building on an exotic system, or setting
+``CMAKE_LIBRARY_PATH`` does not work, or is not appropriate for some
+other reason, one option would be to write your own custom versions of
+``FindBLAS.cmake`` & ``FindLAPACK.cmake`` specific to your
+environment.  In this case you must set ``CMAKE_MODULE_PATH`` to the
+directory containing these custom scripts when invoking ``CMake`` to
+build Ceres and they will be used in preference to the default
+versions.  However, in order for this to work, your scripts must
+provide the full set of variables provided by the default scripts.
+Also, if you are building Ceres with ``SuiteSparse``, the versions of
+``BLAS`` & ``LAPACK`` used by ``SuiteSparse`` and Ceres should be the
+same.
 
 .. _section-using-ceres:
 
 Using Ceres with CMake
 ======================
 
-In order to use Ceres in client code with CMake using
-`find_package() <http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
+In order to use Ceres in client code with CMake using `find_package()
+<http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
 then either:
 
-#. Ceres must have been installed with ``make install``.
-    If the install location is non-standard (i.e. is not in CMake's default
+#. Ceres must have been installed with ``make install``.  If the
+    install location is non-standard (i.e. is not in CMake's default
     search paths) then it will not be detected by default, see:
     :ref:`section-local-installations`.
 
-    Note that if you are using a non-standard install location you should
-    consider exporting Ceres instead, as this will not require any extra
-    information to be provided in client code for Ceres to be detected.
+    Note that if you are using a non-standard install location you
+    should consider exporting Ceres instead, as this will not require
+    any extra information to be provided in client code for Ceres to
+    be detected.
 
-#. Or Ceres' build directory must have been exported
-    by enabling the ``EXPORT_BUILD_DIR`` option when Ceres was configured.
+#. Or Ceres' build directory must have been exported by enabling the
+    ``EXPORT_BUILD_DIR`` option when Ceres was configured.
 
 
 As an example of how to use Ceres, to compile `examples/helloworld.cc
 <https://ceres-solver.googlesource.com/ceres-solver/+/master/examples/helloworld.cc>`_
-in a separate standalone project, the following CMakeList.txt can be used:
+in a separate standalone project, the following CMakeList.txt can be
+used:
 
 .. code-block:: cmake
 
@@ -729,22 +764,25 @@
     add_executable(helloworld helloworld.cc)
     target_link_libraries(helloworld ${CERES_LIBRARIES})
 
-Irrespective of whether Ceres was installed or exported, if multiple versions
-are detected, set: ``Ceres_DIR`` to control which is used.  If Ceres was
-installed ``Ceres_DIR`` should be the path to the directory containing the
-installed ``CeresConfig.cmake`` file (e.g. ``/usr/local/share/Ceres``).  If
-Ceres was exported, then ``Ceres_DIR`` should be the path to the exported
-Ceres build directory.
+Irrespective of whether Ceres was installed or exported, if multiple
+versions are detected, set: ``Ceres_DIR`` to control which is used.
+If Ceres was installed ``Ceres_DIR`` should be the path to the
+directory containing the installed ``CeresConfig.cmake`` file
+(e.g. ``/usr/local/share/Ceres``).  If Ceres was exported, then
+``Ceres_DIR`` should be the path to the exported Ceres build
+directory.
 
 Specify Ceres components
 -------------------------------------
 
-You can specify particular Ceres components that you require (in order for Ceres
-to be reported as found) when invoking ``find_package(Ceres)``.  This allows you
-to specify, for example, that you require a version of Ceres built with
-SuiteSparse support.  By definition, if you do not specify any components when
-calling ``find_package(Ceres)`` (the default) any version of Ceres detected will
-be reported as found, irrespective of which components it was built with.
+You can specify particular Ceres components that you require (in order
+for Ceres to be reported as found) when invoking
+``find_package(Ceres)``.  This allows you to specify, for example,
+that you require a version of Ceres built with SuiteSparse support.
+By definition, if you do not specify any components when calling
+``find_package(Ceres)`` (the default) any version of Ceres detected
+will be reported as found, irrespective of which components it was
+built with.
 
 The Ceres components which can be specified are:
 
@@ -801,95 +839,102 @@
 -------------------
 
 If Ceres was installed in a non-standard path by specifying
-``-DCMAKE_INSTALL_PREFIX="/some/where/local"``, then the user should add
-the **PATHS** option to the ``find_package()`` command, e.g.,
+``-DCMAKE_INSTALL_PREFIX="/some/where/local"``, then the user should
+add the **PATHS** option to the ``find_package()`` command, e.g.,
 
 .. code-block:: cmake
 
    find_package(Ceres REQUIRED PATHS "/some/where/local/")
 
 Note that this can be used to have multiple versions of Ceres
-installed.  However, particularly if you have only a single version of Ceres
-which you want to use but do not wish to install to a system location, you
-should consider exporting Ceres using the ``EXPORT_BUILD_DIR`` option instead
-of a local install, as exported versions of Ceres will be automatically detected
-by CMake, irrespective of their location.
+installed.  However, particularly if you have only a single version of
+Ceres which you want to use but do not wish to install to a system
+location, you should consider exporting Ceres using the
+``EXPORT_BUILD_DIR`` option instead of a local install, as exported
+versions of Ceres will be automatically detected by CMake,
+irrespective of their location.
 
 Understanding the CMake Package System
 ----------------------------------------
 
-Although a full tutorial on CMake is outside the scope of this guide, here
-we cover some of the most common CMake misunderstandings that crop up
-when using Ceres.  For more detailed CMake usage, the following references are
-very useful:
+Although a full tutorial on CMake is outside the scope of this guide,
+here we cover some of the most common CMake misunderstandings that
+crop up when using Ceres.  For more detailed CMake usage, the
+following references are very useful:
 
 - The `official CMake tutorial <http://www.cmake.org/cmake-tutorial/>`_
 
    Provides a tour of the core features of CMake.
 
-- `ProjectConfig tutorial <http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file>`_ and the `cmake-packages documentation <http://www.cmake.org/cmake/help/git-master/manual/cmake-packages.7.html>`_
+- `ProjectConfig tutorial
+  <http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file>`_
+  and the `cmake-packages documentation
+  <http://www.cmake.org/cmake/help/git-master/manual/cmake-packages.7.html>`_
 
-   Cover how to write a ``ProjectConfig.cmake`` file, discussed below, for
-   your own project when installing or exporting it using CMake.  It also covers
-   how these processes in conjunction with ``find_package()`` are actually
-   handled by CMake.  The
-   `ProjectConfig tutorial <http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file>`_
-   is the older style, currently used by Ceres for compatibility with older
-   versions of CMake.
+   Cover how to write a ``ProjectConfig.cmake`` file, discussed below,
+   for your own project when installing or exporting it using CMake.
+   It also covers how these processes in conjunction with
+   ``find_package()`` are actually handled by CMake.  The
+   `ProjectConfig tutorial
+   <http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file>`_
+   is the older style, currently used by Ceres for compatibility with
+   older versions of CMake.
 
   .. NOTE :: **Targets in CMake.**
 
     All libraries and executables built using CMake are represented as
-    *targets* created using
-    `add_library()
+    *targets* created using `add_library()
     <http://www.cmake.org/cmake/help/v3.2/command/add_library.html>`_
-    and
-    `add_executable()
+    and `add_executable()
     <http://www.cmake.org/cmake/help/v3.2/command/add_executable.html>`_.
-    Targets encapsulate the rules and dependencies (which can be other targets)
-    required to build or link against an object.  This allows CMake to
-    implicitly manage dependency chains.  Thus it is sufficient to tell CMake
-    that a library target: ``B`` depends on a previously declared library target
-    ``A``, and CMake will understand that this means that ``B`` also depends on
-    all of the public dependencies of ``A``.
+    Targets encapsulate the rules and dependencies (which can be other
+    targets) required to build or link against an object.  This allows
+    CMake to implicitly manage dependency chains.  Thus it is
+    sufficient to tell CMake that a library target: ``B`` depends on a
+    previously declared library target ``A``, and CMake will
+    understand that this means that ``B`` also depends on all of the
+    public dependencies of ``A``.
 
-When a project like Ceres is installed using CMake, or its build directory is
-exported into the local CMake package registry
-(see :ref:`section-install-vs-export`), in addition to the public
-headers and compiled libraries, a set of CMake-specific project configuration
-files are also installed to: ``<INSTALL_ROOT>/share/Ceres`` (if Ceres is
-installed), or created in the build directory (if Ceres' build directory is
-exported).  When `find_package
-<http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_
-is invoked, CMake checks various standard install locations (including
-``/usr/local`` on Linux & UNIX systems), and the local CMake package registry
-for CMake configuration files for the project to be found (i.e. Ceres in the
-case of ``find_package(Ceres)``).  Specifically it looks for:
+When a project like Ceres is installed using CMake, or its build
+directory is exported into the local CMake package registry (see
+:ref:`section-install-vs-export`), in addition to the public headers
+and compiled libraries, a set of CMake-specific project configuration
+files are also installed to: ``<INSTALL_ROOT>/share/Ceres`` (if Ceres
+is installed), or created in the build directory (if Ceres' build
+directory is exported).  When `find_package
+<http://www.cmake.org/cmake/help/v3.2/command/find_package.html>`_ is
+invoked, CMake checks various standard install locations (including
+``/usr/local`` on Linux & UNIX systems), and the local CMake package
+registry for CMake configuration files for the project to be found
+(i.e. Ceres in the case of ``find_package(Ceres)``).  Specifically it
+looks for:
 
-- ``<PROJECT_NAME>Config.cmake`` (or ``<lower_case_project_name>-config.cmake``)
+- ``<PROJECT_NAME>Config.cmake`` (or
+  ``<lower_case_project_name>-config.cmake``)
 
-   Which is written by the developers of the project, and is configured with
-   the selected options and installed locations when the project is built and
-   defines the CMake variables: ``<PROJECT_NAME>_INCLUDE_DIRS`` &
-   ``<PROJECT_NAME>_LIBRARIES`` which are used by the caller to import
-   the project.
+   Which is written by the developers of the project, and is
+   configured with the selected options and installed locations when
+   the project is built and defines the CMake variables:
+   ``<PROJECT_NAME>_INCLUDE_DIRS`` & ``<PROJECT_NAME>_LIBRARIES``
+   which are used by the caller to import the project.
 
-The ``<PROJECT_NAME>Config.cmake`` typically includes a second file installed to
-the same location:
+The ``<PROJECT_NAME>Config.cmake`` typically includes a second file
+installed to the same location:
 
 - ``<PROJECT_NAME>Targets.cmake``
 
    Which is autogenerated by CMake as part of the install process and defines
    **imported targets** for the project in the caller's CMake scope.
 
-An **imported target** contains the same information about a library as a CMake
-target that was declared locally in the current CMake project using
-``add_library()``.  However, imported targets refer to objects that have already
-been built by a different CMake project.  Principally, an imported
-target contains the location of the compiled object and all of its public
-dependencies required to link against it.  Any locally declared target can
-depend on an imported target, and CMake will manage the dependency chain, just
-as if the imported target had been declared locally by the current project.
+An **imported target** contains the same information about a library
+as a CMake target that was declared locally in the current CMake
+project using ``add_library()``.  However, imported targets refer to
+objects that have already been built by a different CMake project.
+Principally, an imported target contains the location of the compiled
+object and all of its public dependencies required to link against it.
+Any locally declared target can depend on an imported target, and
+CMake will manage the dependency chain, just as if the imported target
+had been declared locally by the current project.
 
 Crucially, just like any locally declared CMake target, an imported target is
 identified by its **name** when adding it as a dependency to another target.
@@ -901,41 +946,46 @@
     find_package(Ceres REQUIRED)
     message("CERES_LIBRARIES = ${CERES_LIBRARIES}")
 
-You would see the output: ``CERES_LIBRARIES = ceres``.  **However**, here
-``ceres`` is an **imported target** created when ``CeresTargets.cmake`` was
-read as part of ``find_package(Ceres REQUIRED)``.  It does **not** refer
-(directly) to the compiled Ceres library: ``libceres.a/so/dylib/lib``.  This
-distinction is important, as depending on the options selected when it was
-built, Ceres can have public link dependencies which are encapsulated in the
-imported target and automatically added to the link step when Ceres is added
-as a dependency of another target by CMake.  In this case, linking only against
-``libceres.a/so/dylib/lib`` without these other public dependencies would
-result in a linker error.
+You would see the output: ``CERES_LIBRARIES = ceres``.  **However**,
+here ``ceres`` is an **imported target** created when
+``CeresTargets.cmake`` was read as part of ``find_package(Ceres
+REQUIRED)``.  It does **not** refer (directly) to the compiled Ceres
+library: ``libceres.a/so/dylib/lib``.  This distinction is important,
+as depending on the options selected when it was built, Ceres can have
+public link dependencies which are encapsulated in the imported target
+and automatically added to the link step when Ceres is added as a
+dependency of another target by CMake.  In this case, linking only
+against ``libceres.a/so/dylib/lib`` without these other public
+dependencies would result in a linker error.
 
-Note that this description applies both to projects that are **installed**
-using CMake, and to those whose **build directory is exported** using
-`export() <http://www.cmake.org/cmake/help/v3.2/command/export.html>`_
-(instead of
-`install() <http://www.cmake.org/cmake/help/v3.2/command/install.html>`_).
-Ceres supports both installation and export of its build directory if the
-``EXPORT_BUILD_DIR`` option is enabled, see :ref:`section-customizing`.
+Note that this description applies both to projects that are
+**installed** using CMake, and to those whose **build directory is
+exported** using `export()
+<http://www.cmake.org/cmake/help/v3.2/command/export.html>`_ (instead
+of `install()
+<http://www.cmake.org/cmake/help/v3.2/command/install.html>`_).  Ceres
+supports both installation and export of its build directory if the
+``EXPORT_BUILD_DIR`` option is enabled, see
+:ref:`section-customizing`.
 
 .. _section-install-vs-export:
 
 Installing a project with CMake vs Exporting its build directory
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-When a project is **installed**, the compiled libraries and headers are copied
-from the source & build directory to the install location, and it is these
-copied files that are used by any client code.  When a project's build directory
-is **exported**, instead of copying the compiled libraries and headers, CMake
-creates an entry for the project in the
-`user's local CMake package registry <http://www.cmake.org/cmake/help/v3.2/manual/cmake-packages.7.html#user-package-registry>`_,
-``<USER_HOME>/.cmake/packages`` on Linux & OS X, which contains the path to
-the project's build directory which will be checked by CMake during a call to
-``find_package()``.  The effect of which is that any client code uses the
-compiled libraries and headers in the build directory directly, **thus not
-requiring the project to be installed to be used**.
+When a project is **installed**, the compiled libraries and headers
+are copied from the source & build directory to the install location,
+and it is these copied files that are used by any client code.  When a
+project's build directory is **exported**, instead of copying the
+compiled libraries and headers, CMake creates an entry for the project
+in the `user's local CMake package registry
+<http://www.cmake.org/cmake/help/v3.2/manual/cmake-packages.7.html#user-package-registry>`_,
+``<USER_HOME>/.cmake/packages`` on Linux & OS X, which contains the
+path to the project's build directory which will be checked by CMake
+during a call to ``find_package()``.  The effect of which is that any
+client code uses the compiled libraries and headers in the build
+directory directly, **thus not requiring the project to be installed
+to be used**.
 
 Installing / Exporting a project that uses Ceres
 --------------------------------------------------
@@ -945,25 +995,28 @@
 represents Ceres.  If you are installing / exporting your *own* project which
 *uses* Ceres, it is important to understand that:
 
-**imported targets are not (re)exported when a project which imported them is
+**Imported targets are not (re)exported when a project which imported them is
 exported**.
 
 Thus, when a project ``Foo`` which uses Ceres is exported, its list of
-dependencies as seen by another project ``Bar`` which imports ``Foo`` via:
-``find_package(Foo REQUIRED)`` will contain: ``ceres``.  However, the
-definition of ``ceres`` as an imported target is **not (re)exported** when Foo
-is exported.  Hence, without any additional steps, when processing ``Bar``,
-``ceres`` will not be defined as an imported target.  Thus, when processing
-``Bar``, CMake will assume that ``ceres`` refers only to:
-``libceres.a/so/dylib/lib`` (the compiled Ceres library) directly if it is on
-the current list of search paths.  In which case, no CMake errors will occur,
-but ``Bar`` will not link properly, as it does not have the required public link
-dependencies of Ceres, which are stored in the imported target defintion.
+dependencies as seen by another project ``Bar`` which imports ``Foo``
+via: ``find_package(Foo REQUIRED)`` will contain: ``ceres``.  However,
+the definition of ``ceres`` as an imported target is **not
+(re)exported** when Foo is exported.  Hence, without any additional
+steps, when processing ``Bar``, ``ceres`` will not be defined as an
+imported target.  Thus, when processing ``Bar``, CMake will assume
+that ``ceres`` refers only to: ``libceres.a/so/dylib/lib`` (the
+compiled Ceres library) directly if it is on the current list of
+search paths.  In which case, no CMake errors will occur, but ``Bar``
+will not link properly, as it does not have the required public link
+dependencies of Ceres, which are stored in the imported target
+defintion.
 
-The solution to this is for ``Foo`` (i.e., the project that uses Ceres) to
-invoke ``find_package(Ceres)`` in ``FooConfig.cmake``, thus ``ceres`` will be
-defined as an imported target when CMake processes ``Bar``.  An example of the
-required modifications to ``FooConfig.cmake`` are show below:
+The solution to this is for ``Foo`` (i.e., the project that uses
+Ceres) to invoke ``find_package(Ceres)`` in ``FooConfig.cmake``, thus
+``ceres`` will be defined as an imported target when CMake processes
+``Bar``.  An example of the required modifications to
+``FooConfig.cmake`` are show below:
 
 .. code-block:: cmake
 
diff --git a/docs/source/license.rst b/docs/source/license.rst
index d1099fa..2abbcec 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -4,7 +4,7 @@
 
 Ceres Solver is licensed under the New BSD license, whose terms are as follows.
 
-Copyright 2015 Google Inc. All rights reserved.
+Copyright 2016 Google Inc. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are met:
diff --git a/docs/source/modeling_faqs.rst b/docs/source/modeling_faqs.rst
new file mode 100644
index 0000000..ee4e62c
--- /dev/null
+++ b/docs/source/modeling_faqs.rst
@@ -0,0 +1,134 @@
+.. _chapter-modeling_faqs:
+
+.. default-domain:: cpp
+
+.. cpp:namespace:: ceres
+
+========
+Modeling
+========
+
+#. Use analytical/automatic derivatives.
+
+   This is the single most important piece of advice we can give to
+   you. It is tempting to take the easy way out and use numeric
+   differentiation. This is a bad idea. Numeric differentiation is
+   slow, ill-behaved, hard to get right, and results in poor
+   convergence behaviour.
+
+   Ceres allows the user to define templated functors which will
+   be automatically differentiated. For most situations this is enough
+   and we recommend using this facility. In some cases the derivatives
+   are simple enough or the performance considerations are such that
+   the overhead of automatic differentiation is too much. In such
+   cases, analytic derivatives are recommended.
+
+   The use of numerical derivatives should be a measure of last
+   resort, where it is simply not possible to write a templated
+   implementation of the cost function.
+
+   In many cases it is not possible to do analytic or automatic
+   differentiation of the entire cost function, but it is generally
+   the case that it is possible to decompose the cost function into
+   parts that need to be numerically differentiated and parts that can
+   be automatically or analytically differentiated.
+
+   To this end, Ceres has extensive support for mixing analytic,
+   automatic and numeric differentiation. See
+   :class:`CostFunctionToFunctor`.
+
+#. When using Quaternions,  consider using :class:`QuaternionParameterization`.
+
+   `Quaternions <https://en.wikipedia.org/wiki/Quaternion>`_ are a
+   four dimensional parameterization of the space of three dimensional
+   rotations :math:`SO(3)`.  However, the :math:`SO(3)` is a three
+   dimensional set, and so is the tangent space of a
+   Quaternion. Therefore, it is sometimes (not always) benefecial to
+   associate a local parameterization with parameter blocks
+   representing a Quaternion. Assuming that the order of entries in
+   your parameter block is :math:`w,x,y,z`, you can use
+   :class:`QuaternionParameterization`.
+
+   .. NOTE::
+
+     If you are using `Eigen's Quaternion
+     <http://eigen.tuxfamily.org/dox/classEigen_1_1Quaternion.html>`_
+     object, whose layout is :math:`x,y,z,w`, then you should use
+     :class:`EigenQuaternionParameterization`.
+
+
+#. How do I solve problems with general linear & non-linear
+   **inequality** constraints with Ceres Solver?
+
+   Currently, Ceres Solver only supports upper and lower bounds
+   constraints on the parameter blocks.
+
+   A crude way of dealing with inequality constraints is have one or
+   more of your cost functions check if the inequalities you are
+   interested in are satisfied, and if not return false instead of
+   true. This will prevent the solver from ever stepping into an
+   infeasible region.
+
+   This requires that the starting point for the optimization be a
+   feasible point.  You also risk pre-mature convergence using this
+   method.
+
+#. How do I solve problems with general linear & non-linear **equality**
+   constraints with Ceres Solver?
+
+   There is no built in support in ceres for solving problems with
+   equality constraints.  Currently, Ceres Solver only supports upper
+   and lower bounds constraints on the parameter blocks.
+
+   The trick described above for dealing with inequality
+   constraints will **not** work for equality constraints.
+
+#. How do I set one or more components of a parameter block constant?
+
+   Using :class:`SubsetParameterization`.
+
+#. Putting `Inverse Function Theorem
+   <http://en.wikipedia.org/wiki/Inverse_function_theorem>`_ to use.
+
+   Every now and then we have to deal with functions which cannot be
+   evaluated analytically. Computing the Jacobian in such cases is
+   tricky. A particularly interesting case is where the inverse of the
+   function is easy to compute analytically. An example of such a
+   function is the Coordinate transformation between the `ECEF
+   <http://en.wikipedia.org/wiki/ECEF>`_ and the `WGS84
+   <http://en.wikipedia.org/wiki/World_Geodetic_System>`_ where the
+   conversion from WGS84 to ECEF is analytic, but the conversion
+   back to WGS84 uses an iterative algorithm. So how do you compute the
+   derivative of the ECEF to WGS84 transformation?
+
+   One obvious approach would be to numerically
+   differentiate the conversion function. This is not a good idea. For
+   one, it will be slow, but it will also be numerically quite
+   bad.
+
+   Turns out you can use the `Inverse Function Theorem
+   <http://en.wikipedia.org/wiki/Inverse_function_theorem>`_ in this
+   case to compute the derivatives more or less analytically.
+
+   The key result here is. If :math:`x = f^{-1}(y)`, and :math:`Df(x)`
+   is the invertible Jacobian of :math:`f` at :math:`x`. Then the
+   Jacobian :math:`Df^{-1}(y) = [Df(x)]^{-1}`, i.e., the Jacobian of
+   the :math:`f^{-1}` is the inverse of the Jacobian of :math:`f`.
+
+   Algorithmically this means that given :math:`y`, compute :math:`x =
+   f^{-1}(y)` by whatever means you can. Evaluate the Jacobian of
+   :math:`f` at :math:`x`. If the Jacobian matrix is invertible, then
+   its inverse is the Jacobian of :math:`f^{-1}(y)` at  :math:`y`.
+
+   One can put this into practice with the following code fragment.
+
+   .. code-block:: c++
+
+      Eigen::Vector3d ecef; // Fill some values
+      // Iterative computation.
+      Eigen::Vector3d lla = ECEFToLLA(ecef);
+      // Analytic derivatives
+      Eigen::Matrix3d lla_to_ecef_jacobian = LLAToECEFJacobian(lla);
+      bool invertible;
+      Eigen::Matrix3d ecef_to_lla_jacobian;
+      lla_to_ecef_jacobian.computeInverseWithCheck(ecef_to_lla_jacobian, invertible);
diff --git a/docs/source/nnls_modeling.rst b/docs/source/nnls_modeling.rst
index 911bd63..972ea5b 100644
--- a/docs/source/nnls_modeling.rst
+++ b/docs/source/nnls_modeling.rst
@@ -370,7 +370,7 @@
     NumericDiffOptions. Update DynamicNumericDiffOptions in a similar
     manner.
 
-    .. code-block:: c++
+  .. code-block:: c++
 
       template <typename CostFunctor,
                 NumericDiffMethodType method = CENTRAL,
@@ -389,15 +389,15 @@
       SizedCostFunction<kNumResiduals, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9> {
       };
 
-   To get a numerically differentiated :class:`CostFunction`, you must
-   define a class with a ``operator()`` (a functor) that computes the
-   residuals. The functor must write the computed value in the last
-   argument (the only non-``const`` one) and return ``true`` to
-   indicate success.  Please see :class:`CostFunction` for details on
-   how the return value may be used to impose simple constraints on
-   the parameter block. e.g., an object of the form
+  To get a numerically differentiated :class:`CostFunction`, you must
+  define a class with a ``operator()`` (a functor) that computes the
+  residuals. The functor must write the computed value in the last
+  argument (the only non-``const`` one) and return ``true`` to
+  indicate success.  Please see :class:`CostFunction` for details on
+  how the return value may be used to impose simple constraints on the
+  parameter block. e.g., an object of the form
 
-   .. code-block:: c++
+  .. code-block:: c++
 
      struct ScalarFunctor {
       public:
@@ -406,19 +406,19 @@
                        double* residuals) const;
      }
 
-   For example, consider a scalar error :math:`e = k - x'y`, where
-   both :math:`x` and :math:`y` are two-dimensional column vector
-   parameters, the prime sign indicates transposition, and :math:`k`
-   is a constant. The form of this error, which is the difference
-   between a constant and an expression, is a common pattern in least
-   squares problems. For example, the value :math:`x'y` might be the
-   model expectation for a series of measurements, where there is an
-   instance of the cost function for each measurement :math:`k`.
+  For example, consider a scalar error :math:`e = k - x'y`, where both
+  :math:`x` and :math:`y` are two-dimensional column vector
+  parameters, the prime sign indicates transposition, and :math:`k` is
+  a constant. The form of this error, which is the difference between
+  a constant and an expression, is a common pattern in least squares
+  problems. For example, the value :math:`x'y` might be the model
+  expectation for a series of measurements, where there is an instance
+  of the cost function for each measurement :math:`k`.
 
-   To write an numerically-differentiable class:`CostFunction` for the
-   above model, first define the object
+  To write an numerically-differentiable class:`CostFunction` for the
+  above model, first define the object
 
-   .. code-block::  c++
+  .. code-block::  c++
 
      class MyScalarCostFunctor {
        MyScalarCostFunctor(double k): k_(k) {}
@@ -434,39 +434,39 @@
        double k_;
      };
 
-   Note that in the declaration of ``operator()`` the input parameters
-   ``x`` and ``y`` come first, and are passed as const pointers to
-   arrays of ``double`` s. If there were three input parameters, then
-   the third input parameter would come after ``y``. The output is
-   always the last parameter, and is also a pointer to an array. In
-   the example above, the residual is a scalar, so only
-   ``residuals[0]`` is set.
+  Note that in the declaration of ``operator()`` the input parameters
+  ``x`` and ``y`` come first, and are passed as const pointers to
+  arrays of ``double`` s. If there were three input parameters, then
+  the third input parameter would come after ``y``. The output is
+  always the last parameter, and is also a pointer to an array. In the
+  example above, the residual is a scalar, so only ``residuals[0]`` is
+  set.
 
-   Then given this class definition, the numerically differentiated
-   :class:`CostFunction` with central differences used for computing
-   the derivative can be constructed as follows.
+  Then given this class definition, the numerically differentiated
+  :class:`CostFunction` with central differences used for computing
+  the derivative can be constructed as follows.
 
-   .. code-block:: c++
+  .. code-block:: c++
 
-     CostFunction* cost_function
-         = new NumericDiffCostFunction<MyScalarCostFunctor, CENTRAL, 1, 2, 2>(
-             new MyScalarCostFunctor(1.0));                    ^     ^  ^  ^
-                                                               |     |  |  |
-                                   Finite Differencing Scheme -+     |  |  |
-                                   Dimension of residual ------------+  |  |
-                                   Dimension of x ----------------------+  |
-                                   Dimension of y -------------------------+
+    CostFunction* cost_function
+        = new NumericDiffCostFunction<MyScalarCostFunctor, CENTRAL, 1, 2, 2>(
+            new MyScalarCostFunctor(1.0));                    ^     ^  ^  ^
+                                                              |     |  |  |
+                                  Finite Differencing Scheme -+     |  |  |
+                                  Dimension of residual ------------+  |  |
+                                  Dimension of x ----------------------+  |
+                                  Dimension of y -------------------------+
 
-   In this example, there is usually an instance for each measurement
-   of `k`.
+  In this example, there is usually an instance for each measurement
+  of `k`.
 
-   In the instantiation above, the template parameters following
-   ``MyScalarCostFunctor``, ``1, 2, 2``, describe the functor as
-   computing a 1-dimensional output from two arguments, both
-   2-dimensional.
+  In the instantiation above, the template parameters following
+  ``MyScalarCostFunctor``, ``1, 2, 2``, describe the functor as
+  computing a 1-dimensional output from two arguments, both
+  2-dimensional.
 
-   NumericDiffCostFunction also supports cost functions with a
-   runtime-determined number of residuals. For example:
+  NumericDiffCostFunction also supports cost functions with a
+  runtime-determined number of residuals. For example:
 
    .. code-block:: c++
 
@@ -483,42 +483,44 @@
                Dimension of y ---------------------------------------------------+
 
 
-   The framework can currently accommodate cost functions of up to 10
-   independent variables, and there is no limit on the dimensionality
-   of each of them.
+  The framework can currently accommodate cost functions of up to 10
+  independent variables, and there is no limit on the dimensionality
+  of each of them.
 
-   There are three available numeric differentiation schemes in ceres-solver:
+  There are three available numeric differentiation schemes in ceres-solver:
 
-   The ``FORWARD`` difference method, which approximates :math:`f'(x)`
-   by computing :math:`\frac{f(x+h)-f(x)}{h}`, computes the cost function
-   one additional time at :math:`x+h`. It is the fastest but least accurate
-   method.
+  The ``FORWARD`` difference method, which approximates :math:`f'(x)`
+  by computing :math:`\frac{f(x+h)-f(x)}{h}`, computes the cost
+  function one additional time at :math:`x+h`. It is the fastest but
+  least accurate method.
 
-   The ``CENTRAL`` difference method is more accurate at
-   the cost of twice as many function evaluations than forward
-   difference, estimating :math:`f'(x)` by computing
-   :math:`\frac{f(x+h)-f(x-h)}{2h}`.
+  The ``CENTRAL`` difference method is more accurate at the cost of
+  twice as many function evaluations than forward difference,
+  estimating :math:`f'(x)` by computing
+  :math:`\frac{f(x+h)-f(x-h)}{2h}`.
 
-   The ``RIDDERS`` difference method[Ridders]_ is an adaptive scheme that
-   estimates derivatives by performing multiple central differences
-   at varying scales. Specifically, the algorithm starts at a certain
-   :math:`h` and as the derivative is estimated, this step size decreases.
-   To conserve function evaluations and estimate the derivative error, the
-   method performs Richardson extrapolations between the tested step sizes.
-   The algorithm exhibits considerably higher accuracy, but does so by
-   additional evaluations of the cost function.
+  The ``RIDDERS`` difference method[Ridders]_ is an adaptive scheme
+  that estimates derivatives by performing multiple central
+  differences at varying scales. Specifically, the algorithm starts at
+  a certain :math:`h` and as the derivative is estimated, this step
+  size decreases.  To conserve function evaluations and estimate the
+  derivative error, the method performs Richardson extrapolations
+  between the tested step sizes.  The algorithm exhibits considerably
+  higher accuracy, but does so by additional evaluations of the cost
+  function.
 
-   Consider using ``CENTRAL`` differences to begin with. Based on the
-   results, either try forward difference to improve performance or
-   Ridders' method to improve accuracy.
+  Consider using ``CENTRAL`` differences to begin with. Based on the
+  results, either try forward difference to improve performance or
+  Ridders' method to improve accuracy.
 
-   **WARNING** A common beginner's error when first using
-   NumericDiffCostFunction is to get the sizing wrong. In particular,
-   there is a tendency to set the template parameters to (dimension of
-   residual, number of parameters) instead of passing a dimension
-   parameter for *every parameter*. In the example above, that would
-   be ``<MyScalarCostFunctor, 1, 2>``, which is missing the last ``2``
-   argument. Please be careful when setting the size parameters.
+  **WARNING** A common beginner's error when first using
+  :class:`NumericDiffCostFunction` is to get the sizing wrong. In
+  particular, there is a tendency to set the template parameters to
+  (dimension of residual, number of parameters) instead of passing a
+  dimension parameter for *every parameter*. In the example above,
+  that would be ``<MyScalarCostFunctor, 1, 2>``, which is missing the
+  last ``2`` argument. Please be careful when setting the size
+  parameters.
 
 
 Numeric Differentiation & LocalParameterization
diff --git a/docs/source/solving_faqs.rst b/docs/source/solving_faqs.rst
new file mode 100644
index 0000000..64604c4
--- /dev/null
+++ b/docs/source/solving_faqs.rst
@@ -0,0 +1,171 @@
+.. _chapter-solving_faqs:
+
+.. default-domain:: cpp
+
+.. cpp:namespace:: ceres
+
+=======
+Solving
+=======
+
+#. How do I evaluate the Jacobian for a solved problem?
+
+   Using :func:`Problem::Evaluate`.
+
+#. How do I choose the right linear solver?
+
+   When using the ``TRUST_REGION`` minimizer, the choice of linear
+   solver is an important decision. It affects solution quality and
+   runtime. Here is a simple way to reason about it.
+
+   1. For small (a few hundred parameters) or dense problems use
+      ``DENSE_QR``.
+
+   2. For general sparse problems (i.e., the Jacobian matrix has a
+      substantial number of zeros) use
+      ``SPARSE_NORMAL_CHOLESKY``. This requires that you have
+      ``SuiteSparse`` or ``CXSparse`` installed.
+
+   3. For bundle adjustment problems with up to a hundred or so
+      cameras, use ``DENSE_SCHUR``.
+
+   4. For larger bundle adjustment problems with sparse Schur
+      Complement/Reduced camera matrices use ``SPARSE_SCHUR``. This
+      requires that you build Ceres with support for ``SuiteSparse``,
+      ``CXSparse`` or Eigen's sparse linear algebra libraries.
+
+      If you do not have access to these libraries for whatever
+      reason, ``ITERATIVE_SCHUR`` with ``SCHUR_JACOBI`` is an
+      excellent alternative.
+
+   5. For large bundle adjustment problems (a few thousand cameras or
+      more) use the ``ITERATIVE_SCHUR`` solver. There are a number of
+      preconditioner choices here. ``SCHUR_JACOBI`` offers an
+      excellent balance of speed and accuracy. This is also the
+      recommended option if you are solving medium sized problems for
+      which ``DENSE_SCHUR`` is too slow but ``SuiteSparse`` is not
+      available.
+
+      .. NOTE::
+
+        If you are solving small to medium sized problems, consider
+        setting ``Solver::Options::use_explicit_schur_complement`` to
+        ``true``, it can result in a substantial performance boost.
+
+      If you are not satisfied with ``SCHUR_JACOBI``'s performance try
+      ``CLUSTER_JACOBI`` and ``CLUSTER_TRIDIAGONAL`` in that
+      order. They require that you have ``SuiteSparse``
+      installed. Both of these preconditioners use a clustering
+      algorithm. Use ``SINGLE_LINKAGE`` before ``CANONICAL_VIEWS``.
+
+#. Use :func:`Solver::Summary::FullReport` to diagnose performance problems.
+
+   When diagnosing Ceres performance issues - runtime and convergence,
+   the first place to start is by looking at the output of
+   ``Solver::Summary::FullReport``. Here is an example
+
+   .. code-block:: bash
+
+     ./bin/bundle_adjuster --input ../data/problem-16-22106-pre.txt
+
+     iter      cost      cost_change  |gradient|   |step|    tr_ratio  tr_radius  ls_iter  iter_time  total_time
+        0  4.185660e+06    0.00e+00    2.16e+07   0.00e+00   0.00e+00  1.00e+04       0    7.50e-02    3.58e-01
+        1  1.980525e+05    3.99e+06    5.34e+06   2.40e+03   9.60e-01  3.00e+04       1    1.84e-01    5.42e-01
+        2  5.086543e+04    1.47e+05    2.11e+06   1.01e+03   8.22e-01  4.09e+04       1    1.53e-01    6.95e-01
+        3  1.859667e+04    3.23e+04    2.87e+05   2.64e+02   9.85e-01  1.23e+05       1    1.71e-01    8.66e-01
+        4  1.803857e+04    5.58e+02    2.69e+04   8.66e+01   9.93e-01  3.69e+05       1    1.61e-01    1.03e+00
+        5  1.803391e+04    4.66e+00    3.11e+02   1.02e+01   1.00e+00  1.11e+06       1    1.49e-01    1.18e+00
+
+     Ceres Solver v1.12.0 Solve Report
+     ----------------------------------
+                                          Original                  Reduced
+     Parameter blocks                        22122                    22122
+     Parameters                              66462                    66462
+     Residual blocks                         83718                    83718
+     Residual                               167436                   167436
+
+     Minimizer                        TRUST_REGION
+
+     Sparse linear algebra library    SUITE_SPARSE
+     Trust region strategy     LEVENBERG_MARQUARDT
+
+                                             Given                     Used
+     Linear solver                    SPARSE_SCHUR             SPARSE_SCHUR
+     Threads                                     1                        1
+     Linear solver threads                       1                        1
+     Linear solver ordering              AUTOMATIC                22106, 16
+
+     Cost:
+     Initial                          4.185660e+06
+     Final                            1.803391e+04
+     Change                           4.167626e+06
+
+     Minimizer iterations                        5
+     Successful steps                            5
+     Unsuccessful steps                          0
+
+     Time (in seconds):
+     Preprocessor                            0.283
+
+       Residual evaluation                   0.061
+       Jacobian evaluation                   0.361
+       Linear solver                         0.382
+     Minimizer                               0.895
+
+     Postprocessor                           0.002
+     Total                                   1.220
+
+     Termination:                   NO_CONVERGENCE (Maximum number of iterations reached.)
+
+  Let us focus on run-time performance. The relevant lines to look at
+  are
+
+
+   .. code-block:: bash
+
+     Time (in seconds):
+     Preprocessor                            0.283
+
+       Residual evaluation                   0.061
+       Jacobian evaluation                   0.361
+       Linear solver                         0.382
+     Minimizer                               0.895
+
+     Postprocessor                           0.002
+     Total                                   1.220
+
+
+  Which tell us that of the total 1.2 seconds, about .3 seconds was
+  spent in the linear solver and the rest was mostly spent in
+  preprocessing and jacobian evaluation.
+
+  The preprocessing seems particularly expensive. Looking back at the
+  report, we observe
+
+   .. code-block:: bash
+
+     Linear solver ordering              AUTOMATIC                22106, 16
+
+  Which indicates that we are using automatic ordering for the
+  ``SPARSE_SCHUR`` solver. This can be expensive at times. A straight
+  forward way to deal with this is to give the ordering manually. For
+  ``bundle_adjuster`` this can be done by passing the flag
+  ``-ordering=user``. Doing so and looking at the timing block of the
+  full report gives us
+
+   .. code-block:: bash
+
+     Time (in seconds):
+     Preprocessor                            0.051
+
+       Residual evaluation                   0.053
+       Jacobian evaluation                   0.344
+       Linear solver                         0.372
+     Minimizer                               0.854
+
+     Postprocessor                           0.002
+     Total                                   0.935
+
+
+
+  The preprocessor time has gone down by more than 5.5x!.
diff --git a/scripts/make_docs.py b/scripts/make_docs.py
index bb51620..c1e711f 100644
--- a/scripts/make_docs.py
+++ b/scripts/make_docs.py
@@ -76,7 +76,7 @@
 
   # The title for the homepage is not ideal, so change it.
   ('<title>Ceres Solver &mdash; Ceres Solver</title>',
-   '<title>Ceres Solver &mdash; A Nonlinear Least Squares Minimizer</title>')
+   '<title>Ceres Solver &mdash; A Large Scale Non-linear Optimization Library</title>')
 ]
 
 # This is a nasty hack to strip the breadcrumb navigation. A better strategy is
@@ -86,7 +86,7 @@
 '''<div role="navigation" aria-label="breadcrumbs navigation">
   <ul class="wy-breadcrumbs">
     <li><a href="index.html">Docs</a> &raquo;</li>
-      
+
     <li>'''
 
 # The index page has a slightly different breadcrumb.
@@ -95,7 +95,7 @@
 breadcrumb_end = \
 '''</li>
       <li class="wy-breadcrumbs-aside">
-        
+
       </li>
   </ul>
   <hr/>