On Demand Matrices and Vectors
In the case that the matrix $V$ is too large to store in memory, when using a KernelDowndater
such as GivensUpDowndater
which only requires access to a select number of rows of $V$ at a time, we have implemented a matrix type OnDemandMatrix
which stores only the required rows (or columns) at a time. The GivensUpDowndater
or FullQRUpDowndater
will automatically delete unneeded rows/columns throughout the pruning procedure.
CaratheodoryPruning.OnDemandMatrix
— TypeOnDemandMatrix{T,TV<:AbstractVector{T}} <: AbstractMatrix{T}
Matrix subtype for which only a subset of the columns or rows (determined by if cols=true
) need to be stored at a time in case storing the full matrix is too expensive.
To form an n×m
"identity" OnDemandMatrix
which is stored column-wise, call
M = OnDemandMatrix(n, m, j -> [1.0*(i==j) for i in 1:n])
.
To store the matrix row-wise, call
M = OnDemandMatrix(n, m, i -> [1.0*(i==j) for j in 1:m], by=:rows)
.
Will only call the provided column or row function when trying to access in that column or row.
To "forget" or erase a given column or row, indexed by i
, call
forget!(M, i)
.
Useful for use with caratheodory_pruning
with the kernel option :GivensUpDown
where only a subset of rows/columns are required at a time.
Forming an OnDemandMatrix
requires passing the full-size of the matrix, the function that generates new rows or columns, and whether it is to be stored column-wise or row-wise. This type works nicely with transposition.
To manually erase or forget a given row/column, call the forget!
method.
CaratheodoryPruning.forget!
— Functionforget!(M::OnDemandMatrix, i::Int)
Erases from memory the given column or row (determined by M.cols
). If the given column or row is not stored, will do nothing.
forget!(M::OnDemandVector, i::Int)
Erases from memory the given element. If the given element is not stored, will do nothing.
Similarly, if the larger dimension of $V$ is so large that we wish to have complete memory independence from that dimension, we can store the weights in an OnDemandVector
which only stores the required elements at a time. The method caratheodory_pruning
will automatically delete unneeded elements throughout the pruning procedure.
CaratheodoryPruning.OnDemandVector
— TypeOnDemandVector{T} <: AbstractVector{T} where T
Vector subtype for which only a subset of the elements need to be stored at a time in case storing the full vector is too costly.
To form a length n
OnDemandVector
with value 1
at index 1 and zero otherwise, call
v = OnDemandVector(n, i -> 1.0 * (i == 1))
.
To "forget" or erase a given element, indexed by i
, call
forget!(v, i)
.
Useful for use with caratheodory_pruning
with the kernel option :GivensUpDown
where only a subset of elements are required at a time.
The method forget!
works the same for the OnDemandVector
.
Related to on demand matrices is a VandermondeVector
which is a thin wrapper for a standard vector which stores one additional piece of information such as the point used to generate the corresponding slice of the Vandermonde matrix.
CaratheodoryPruning.VandermondeVector
— TypeVandermondeVector{T,TV<:AbstractVector{T},TP} <: AbstractVector{T}
v = VandermondeVector(vec, [pt=nothing])
Vector subtype useful for storing a slice (row or column) of a Vandermonde matrix along with the point used to form the slice. The slice is stored in vec
and the point is stored in pt
. Behaves like a normal vector with contents vec
.
Given v = VandermondeVector(vec, pt)
, the point can be accessed with getpt(v)
or v.pt
.
See the Monte Carlo example for use of this.