linear_algebra.src.schur_complement
===================================

.. py:module:: linear_algebra.src.schur_complement


Classes
-------

.. autoapisummary::

   linear_algebra.src.schur_complement.TestSchurComplement


Functions
---------

.. autoapisummary::

   linear_algebra.src.schur_complement.schur_complement


Module Contents
---------------

.. py:class:: TestSchurComplement(methodName='runTest')

   Bases: :py:obj:`unittest.TestCase`


   A class whose instances are single test cases.

   By default, the test code itself should be placed in a method named
   'runTest'.

   If the fixture may be used for many test cases, create as
   many test methods as are needed. When instantiating such a TestCase
   subclass, specify in the constructor arguments the name of the test method
   that the instance is to execute.

   Test authors should subclass TestCase for their own tests. Construction
   and deconstruction of the test's environment ('fixture') can be
   implemented by overriding the 'setUp' and 'tearDown' methods respectively.

   If it is necessary to override the __init__ method, the base class
   __init__ method must always be called. It is important that subclasses
   should not change the signature of their __init__ method, since instances
   of the classes are instantiated automatically by parts of the framework
   in order to be run.

   When subclassing TestCase, you can set these attributes:
   * failureException: determines which exception will be raised when
       the instance's assertion methods fail; test methods raising this
       exception will be deemed to have 'failed' rather than 'errored'.
   * longMessage: determines whether long messages (including repr of
       objects used in assert methods) will be printed on failure in *addition*
       to any explicit message passed.
   * maxDiff: sets the maximum length of a diff in failure messages
       by assert methods using difflib. It is looked up as an instance
       attribute so can be configured by individual tests if required.


   .. py:method:: test_improper_a_b_dimensions() -> None


   .. py:method:: test_improper_b_c_dimensions() -> None


   .. py:method:: test_schur_complement() -> None


.. py:function:: schur_complement(mat_a: numpy.ndarray, mat_b: numpy.ndarray, mat_c: numpy.ndarray, pseudo_inv: numpy.ndarray | None = None) -> numpy.ndarray

   Schur complement of a symmetric matrix X given as a 2x2 block matrix
   consisting of matrices `A`, `B` and `C`.
   Matrix `A` must be quadratic and non-singular.
   In case `A` is singular, a pseudo-inverse may be provided using
   the `pseudo_inv` argument.

   | Link to Wiki: https://en.wikipedia.org/wiki/Schur_complement
   | See also Convex Optimization - Boyd and Vandenberghe, A.5.5

   >>> import numpy as np
   >>> a = np.array([[1, 2], [2, 1]])
   >>> b = np.array([[0, 3], [3, 0]])
   >>> c = np.array([[2, 1], [6, 3]])
   >>> schur_complement(a, b, c)
   array([[ 5., -5.],
          [ 0.,  6.]])