# Reductions¶

A `Reduction`

is a transformation
from one problem to an equivalent problem. Two problems are equivalent
if a solution of one can be converted to a solution of the other with no
more than a moderate amount of effort. CVXPY uses reductions to rewrite
problems into forms that solvers will accept.

Reductions allow CVXPY to simplify problems and target different
categories of solvers (quadratic program solvers and conic
solvers are two examples of solver categories). Appropriating terminology from
software compilers, we classify reductions as either middle-end reductions or
back-end reductions. A reduction that simplifies a source problem without
regard to the targeted solver is called a
middle-end reduction, whereas a reduction
that takes a source problem and converts it to a form acceptable to a category
of solvers is called a back-end reduction.
Each solver (along with the mode in which it is invoked) is called a *back-end*
or *target*.

The majority of users will not need to know anything about the reduction API; indeed, most users need not even know that reductions exist. But those who wish to extend CVXPY or contribute to it may find the API useful, as might those who are simply curious to learn how CVXPY works.