This virtual class represents a reduction, an actor that transforms a problem
into an equivalent problem. By equivalent, we mean that there exists a mapping
between solutions of either problem: if we reduce a problem \(A\) to another
problem \(B\) and then proceed to find a solution to \(B\), we can convert
it to a solution of \(A\) with at most a moderate amount of effort.

```
# S4 method for Reduction,Problem
accepts(object, problem)
# S4 method for Reduction
reduce(object)
# S4 method for Reduction,Solution
retrieve(object, solution)
# S4 method for Reduction,Problem
perform(object, problem)
# S4 method for Reduction,Solution,list
invert(object, solution, inverse_data)
```

## Arguments

- object
A Reduction object.

- problem
A Problem object.

- solution
A Solution to a problem that generated the inverse data.

- inverse_data
The data encoding the original problem.

## Details

Every reduction supports three methods: accepts, perform, and invert. The accepts
method of a particular reduction codifies the types of problems that it is applicable
to, the perform method takes a problem and reduces it to a (new) equivalent form,
and the invert method maps solutions from reduced-to problems to their problems
of provenance.

## Methods (by generic)

`accepts(object = Reduction, problem = Problem)`

: States whether the reduction accepts a problem.

`reduce(Reduction)`

: Reduces the owned problem to an equivalent problem.

`retrieve(object = Reduction, solution = Solution)`

: Retrieves a solution to the owned problem.

`perform(object = Reduction, problem = Problem)`

: Performs the reduction on a problem and returns an equivalent problem.

`invert(object = Reduction, solution = Solution, inverse_data = list)`

: Returns a solution to the original problem given the inverse data.