Homotopies
A homotopy is a function
where $H(⋅, t)$ is a polynomial system for all $t∈\mathbb{C}$.
Default homotopies
The following homotopies are available by default
StraightLineHomotopy(G, F; gamma=exp(i * 2π*rand()))Construct the homotopy $H(x, t) = γtG(x) + (1-t)F(x)$.
FixedPointHomotopy(F, x₀; gamma=exp(i * 2π*rand()))Construct the homotopy $H(x, t) = (1-t)F(x) + γt(x-x₀)$.
We also provide more specialised homotopies, which are mostly used internally currently but could be useful in conjunction with the PathTracking.PathTracker primitive.
PatchedHomotopy(H::AbstractHomotopy, patch, v::AbstractProjectiveVector)Augment the homotopy H with the given patch v. This results in the system [H(x,t); v ⋅ x - 1]
PatchSwitcherHomotopy(H::AbstractHomotopy, patch, v::AbstractProjectiveVector)Augment the homotopy H with the given patch v. This results in the system [H(x,t); v ⋅ x - 1]
Interface for custom homotopies
The great thing is that you are not limited to the homotopies provided by default. You can define your own homotopy by defining a struct with super type Homotopies.AbstractHomotopy. For this the following interface has to be defined.
Types
AbstractHomotopyRepresenting a homotopy.
AbstractHomotopyCacheA cache to avoid allocations for the evaluation of an AbstractHomotopy.
NullCacheThe default AbstractHomotopyCache containing nothing.
Mandatory
The following methods are mandatory to implement.
HomotopyContinuation.HomotopiesBase.cache — Function.cache(H::AbstractHomotopy, x, t)::AbstractHomotopyCacheCreate a cache for the evaluation (incl. Jacobian) of F with elements of the type of x. The default implementation returns HomotopiesBase.NullCache.
HomotopyContinuation.HomotopiesBase.evaluate! — Function.evaluate!(u, H::AbstractHomotopy, x, t, cache::AbstractHomotopyCache)Evaluate the homotopy H at (x, t) and store the result in u.
HomotopyContinuation.HomotopiesBase.jacobian! — Function.jacobian!(u, H::AbstractHomotopy, x, t, cache::AbstractHomotopyCache)Evaluate the Jacobian of the homotopy H at (x, t) and store the result in u.
HomotopyContinuation.HomotopiesBase.dt! — Function.dt!(u, H::AbstractHomotopy, x, t, cache::AbstractHomotopyCache)Evaluate the homotopy H at (x, t) and store the result in u.
Base.size — Method.Base.size(H::AbstractHomotopy)Returns a tuple (m, n) indicating that H is a homotopy of m polynomials m in n variables.
Optional
evaluate_and_jacobian!(u, U, F, x, t, cache::AbstractHomotopyCache)Evaluate the homotopy H and its Jacobian at (x, t) and store the results in u (evalution) and U (Jacobian).
evaluate_and_jacobian(H::AbstractHomotopy, x, t, cache::AbstractHomotopyCache)Evaluate the homotopy H and its Jacobian at (x, t).
jacobian_and_dt!(U, u, H, x, t, cache::AbstractHomotopyCache)Evaluate the homotopy H and its derivative w.r.t. t at (x, t) and store the results in u (evalution) and v (∂t).
HomotopyContinuation.HomotopiesBase.evaluate — Function.evaluate(H::AbstractHomotopy, x, t, cache::AbstractHomotopyCache)Evaluate the homotopy H at (x, t).
HomotopyContinuation.HomotopiesBase.jacobian — Function.jacobian(H::AbstractHomotopy, x, t, cache::AbstractHomotopyCache)Evaluate the Jacobian of the homotopy H at (x, t).
HomotopyContinuation.HomotopiesBase.dt — Function.dt(H::AbstractHomotopy, x::AbstractVector, cache::AbstractHomotopyCache)Evaluate the homotopy H at (x, t).
precondition!(H::AbstractHomotopy, x, t, cache)Prepare a homotopy for things like pathtracking starting at x and t. This can modify x as well as H and anything in cache. By default this is a no-op. If H wraps another homotopy this should call precondition! on this as well.
HomotopyContinuation.HomotopiesBase.update! — Function.update!(H::AbstractHomotopy, x, t, cache)Update a homotopy for new values of x and x, i.e., update an affine patch. This can modify x as well as H and anything in cache. By default this is a no-op. If H wraps another homotopy this should call update! on this as well.