### Include Example Scripts Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/README.md Includes necessary example scripts for plotting and linear regression after activating the test environment. ```julia include("examples/plot_utils.jl") include("examples/linear_regression.jl") ... ``` -------------------------------- ### Add FrankWolfe.jl (Master Branch) Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/README.md Install the master branch of the FrankWolfe.jl package directly from its GitHub repository. ```julia Pkg.add(url="https://github.com/ZIB-IOL/FrankWolfe.jl", rev="master") ``` -------------------------------- ### Include Plotting Utilities in Your Project Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/README.md Includes the plotting utilities from the FrankWolfe.jl examples directory into your current project. Ensure Plots.jl is already included in your project. ```julia using Plots using FrankWolfe include(joinpath(dirname(pathof(FrankWolfe)), "../examples/plot_utils.jl")) ``` -------------------------------- ### Add FrankWolfe.jl (Latest Release) Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/README.md Install the most recent release of the FrankWolfe.jl package using the Julia package manager. ```julia using Pkg Pkg.add("FrankWolfe") ``` -------------------------------- ### Solving a Quadratic Minimization Problem on the Probability Simplex Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/README.md This snippet shows a minimal example of using the `frank_wolfe` function to solve a quadratic objective function on the probability simplex. It requires defining the objective function, its gradient, a linear minimization oracle, and a starting vector. ```julia using FrankWolfe # objective function f(p) = p_1^2 + ... + p_n^2 f(p) = sum(abs2, p) # in-place gradient computation for f thanks to '.=' grad!(storage, p) = storage .= 2p # pre-defined type implementing the linear minimization oracle interface for the simplex lmo = FrankWolfe.ProbabilitySimplexLMO(1.) # starting vector (of dimension n=3) p0 = [1., 0., 0.] # an optimal solution is returned in p_opt p_opt, _ = frank_wolfe(f, grad!, lmo, p0; verbose=true); ``` ```julia p_opt ``` -------------------------------- ### Activate Test Environment with TestEnv.jl Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/README.md Activates the test environment for the FrankWolfe.jl package. This is a prerequisite for running the provided examples. ```julia using TestEnv TestEnv.activate() "/tmp/jl_Ux8wKE/Project.toml" ``` -------------------------------- ### Frank-Wolfe Algorithm Output Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md This output shows the performance of the Vanilla Frank-Wolfe Algorithm on a large-scale problem. It details iteration count, primal and dual objective values, dual gap, and time, illustrating memory-agnostic convergence. ```text Vanilla Frank-Wolfe Algorithm. EMPHASIS: memory STEPSIZE: agnostic EPSILON: 1.0e-7 MAXITERATION: 1000 TYPE: Float64 MOMENTUM: nothing GRADIENT_TYPE: Nothing ───────────────────────────────────────────────────────────────────────────────────────────────── Type Iteration Primal Dual Dual Gap Time It/sec ───────────────────────────────────────────────────────────────────────────────────────────────── I 0 1.000000e+00 -1.000000e+00 2.000000e+00 8.783523e+00 0.000000e+00 FW 100 1.326732e-02 -1.326733e-02 2.653465e-02 4.635923e+02 2.157068e-01 FW 200 6.650080e-03 -6.650086e-03 1.330017e-02 9.181294e+02 2.178342e-01 FW 300 4.437059e-03 -4.437064e-03 8.874123e-03 1.372615e+03 2.185609e-01 FW 400 3.329174e-03 -3.329180e-03 6.658354e-03 1.827260e+03 2.189070e-01 FW 500 2.664003e-03 -2.664008e-03 5.328011e-03 2.281865e+03 2.191190e-01 FW 600 2.220371e-03 -2.220376e-03 4.440747e-03 2.736387e+03 2.192672e-01 FW 700 1.903401e-03 -1.903406e-03 3.806807e-03 3.190951e+03 2.193703e-01 FW 800 1.665624e-03 -1.665629e-03 3.331253e-03 3.645425e+03 2.194532e-01 FW 900 1.480657e-03 -1.480662e-03 2.961319e-03 4.099931e+03 2.195159e-01 FW 1000 1.332665e-03 -1.332670e-03 2.665335e-03 4.554703e+03 2.195533e-01 Last 1000 1.331334e-03 -1.331339e-03 2.662673e-03 4.559822e+03 2.195261e-01 ───────────────────────────────────────────────────────────────────────────────────────────────── 4560.661203 seconds (7.41 M allocations: 112.121 GiB, 0.01% gc time) ``` -------------------------------- ### Frank-Wolfe Algorithm with Rational Arithmetic Output Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md This output shows the convergence of the Vanilla Frank-Wolfe Algorithm using rational arithmetic for the approximate Carathéodory problem. It highlights the precision of the solution obtained. ```text Vanilla Frank-Wolfe Algorithm. EMPHASIS: blas STEPSIZE: rationalshortstep EPSILON: 1.0e-7 max_iteration: 100 TYPE: Rational{BigInt} ─────────────────────────────────────────────────────────────────────────────────── Type Iteration Primal Dual Dual Gap Time ─────────────────────────────────────────────────────────────────────────────────── I 0 1.000000e+00 -1.000000e+00 2.000000e+00 1.540385e-01 FW 10 9.090909e-02 -9.090909e-02 1.818182e-01 2.821186e-01 FW 20 4.761905e-02 -4.761905e-02 9.523810e-02 3.027964e-01 FW 30 3.225806e-02 -3.225806e-02 6.451613e-02 3.100331e-01 FW 40 2.439024e-02 -2.439024e-02 4.878049e-02 3.171654e-01 FW 50 1.960784e-02 -1.960784e-02 3.921569e-02 3.244207e-01 FW 60 1.639344e-02 -1.639344e-02 3.278689e-02 3.326185e-01 FW 70 1.408451e-02 -1.408451e-02 2.816901e-02 3.418239e-01 FW 80 1.234568e-02 -1.234568e-02 2.469136e-02 3.518750e-01 FW 90 1.098901e-02 -1.098901e-02 2.197802e-02 3.620287e-01 Last 1.000000e-02 1.000000e-02 0.000000e+00 4.392171e-01 ─────────────────────────────────────────────────────────────────────────────────── 0.600608 seconds (3.83 M allocations: 111.274 MiB, 12.97% gc time) Output type of solution: Rational{BigInt} ``` -------------------------------- ### FrankWolfe Utils Module Documentation Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents the utility functions module for FrankWolfe.jl. ```julia Modules = [FrankWolfe] Pages = ["utils.jl"] ``` -------------------------------- ### FrankWolfe Index Documentation Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Provides an index for the FrankWolfe.jl documentation, specifically referencing the 3_backend.md page. ```julia Pages = ["3_backend.md"] ``` -------------------------------- ### Autodocs for Gradient Descent Module Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/5_gradient_descent.md This snippet generates documentation for the gradient descent module within the FrankWolfe.jl package. ```julia ```@autodocs Modules = [FrankWolfe.Experimental] Pages = ["gradient_descent.jl"] ``` ``` -------------------------------- ### Meta-LMO Wrappers Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/2_lmo.md Provides wrappers for LMOs to extend their behavior, such as caching. ```julia FrankWolfe.CachedLMO ``` ```julia FrankWolfe.ProductLMO ``` ```julia FrankWolfe.SingleLastCachedLMO ``` ```julia FrankWolfe.MultiCacheLMO ``` ```julia FrankWolfe.VectorCacheLMO ``` -------------------------------- ### Autodocs for Line Search Module Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/4_linesearch.md Generates documentation for the FrankWolfe linesearch.jl module, including types and functions related to line search. ```julia ```@autodocs Modules = [FrankWolfe] Pages = ["linesearch.jl"] ``` ``` -------------------------------- ### Keyword Arguments for Extra Vertex Storage Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md Pass these keyword arguments to Frank-Wolfe algorithms that use an active set to enable and configure extra vertex storage. This can help in managing discarded vertices and utilizing stored vertices. ```julia add_dropped_vertices=true, use_extra_vertex_storage=true, extra_vertex_storage=vertex_storage, ``` -------------------------------- ### Benchmarking Large-scale Problem Solvers Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md This output details the performance benchmarking of different components (f, grad, lmo, dual gap, update) for large-scale problems. It compares the standard BLAS update with the memory-efficient 'memory' emphasis mode, showing significant differences in time and memory allocations. ```text Size of single vector (Float64): 7629.39453125 MB Testing f... 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| Time: 0:00:23 Testing grad... 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| Time: 0:00:23 Testing lmo... 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| Time: 0:00:29 Testing dual gap... 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████| Time: 0:00:46 Testing update... (Emphasis: blas) 100%|███████████████████████████████████████████████████████████████████████████████████████████████| Time: 0:01:35 Testing update... (Emphasis: memory) 100%|█████████████████████████████████████████████████████████████████████████████████████████████| Time: 0:00:58 ────────────────────────────────────────────────────────────────────────── Time Allocations ────────────────────── ─────────────────────── Tot / % measured: 278s / 31.4% 969GiB / 30.8% Section ncalls time %tot avg alloc %tot avg ────────────────────────────────────────────────────────────────────────── update (blas) 10 36.1s 41.3% 3.61s 149GiB 50.0% 14.9GiB lmo 10 18.4s 21.1% 1.84s 0.00B 0.00% 0.00B grad 10 12.8s 14.6% 1.28s 74.5GiB 25.0% 7.45GiB f 10 12.7s 14.5% 1.27s 74.5GiB 25.0% 7.45GiB update (memory) 10 5.00s 5.72% 500ms 0.00B 0.00% 0.00B dual gap 10 2.40s 2.75% 240ms 0.00B 0.00% 0.00B ────────────────────────────────────────────────────────────────────────── ``` -------------------------------- ### FrankWolfe Active Set Modules Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents the modules related to active set management in FrankWolfe.jl. ```julia Modules = [FrankWolfe] Pages = ["active_set.jl", "active_set_quadratic.jl", "active_set_quadratic_direct_solve.jl", "active_set_sparsifier.jl"] ``` -------------------------------- ### Define a Custom Linear Minimization Oracle Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/basics.md To use a custom LMO, it must be a subtype of FrankWolfe.LinearMinimizationOracle and implement the compute_extreme_point method. The constraint set does not need explicit representation. ```julia FrankWolfe.compute_extreme_point(lmo::MyLMO, direction; v, kwargs...) -> v ``` -------------------------------- ### FrankWolfe Types Module Documentation Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents the core types module for FrankWolfe.jl. ```julia Modules = [FrankWolfe] Pages = ["types.jl"] ``` -------------------------------- ### Perform Line Search Function Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/4_linesearch.md The core method called at each iteration to compute the step size (gamma). This function is implemented by concrete line search strategies. ```julia ```@docs FrankWolfe.perform_line_search ``` ``` -------------------------------- ### FrankWolfe CallbackState Documentation Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents the CallbackState type used for callbacks in FrankWolfe.jl. ```julia FrankWolfe.CallbackState ``` -------------------------------- ### FrankWolfe Function Gradient Module Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents the module for functions and gradients in FrankWolfe.jl. ```julia Modules = [FrankWolfe] Pages = ["function_gradient.jl"] ``` -------------------------------- ### Callback Function Signature Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md Define a callback function that accepts a `FrankWolfe.CallbackState` struct and additional arguments. This is useful for logging or storing intermediate algorithm states. ```julia callback(state::FrankWolfe.CallbackState, args...) ``` -------------------------------- ### FrankWolfe Custom Vertex Storage Types Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents custom types for efficient storage and operations on extreme points of feasible sets. ```julia FrankWolfe.ScaledHotVector ``` ```julia FrankWolfe.RankOneMatrix ``` -------------------------------- ### Exact Optimal Solution with Rational Arithmetic Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md This output displays the exact optimal solution vector 'x' obtained using rational arithmetic for the approximate Carathéodory problem. Each element of the vector is a rational number. ```julia x = Rational{BigInt}[1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100, 1//100] ``` -------------------------------- ### Compute Extreme Point Method Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/2_lmo.md The core method implemented by all LMO subtypes to compute an extreme point of the feasible set. ```julia compute_extreme_point ``` -------------------------------- ### Standard Algorithm Signature Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/1_algorithms.md The typical function signature for standard algorithms in the package. This signature is used across various optimization methods. ```julia my_algorithm(f, grad!, lmo, x0) ``` -------------------------------- ### Documenting a Julia Function Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/CONTRIBUTING.md Use triple double quotation marks to add documentation comments above Julia functions, supporting Markdown formatting. ```julia """ This explains what the function `f` does, it supports markdown. """ function f(x) # ... end ``` -------------------------------- ### FrankWolfe Oracle Tracking Types Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents wrapper types for oracles that track the number of calls made. ```julia FrankWolfe.TrackingObjective ``` ```julia FrankWolfe.TrackingGradient ``` ```julia FrankWolfe.TrackingLMO ``` -------------------------------- ### FrankWolfe.alternating_linear_minimization Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/1_algorithms.md Converts a problem over the intersection of convex sets into a series of subproblems over single sets using alternating linear minimization. It aims to find a point within the intersection by minimizing the distance to iterates of other subproblems and the original objective function. ```APIDOC ## FrankWolfe.alternating_linear_minimization ### Description Converts a problem over the intersection of convex sets into a series of subproblems over single sets using alternating linear minimization. It aims to find a point within the intersection by minimizing the distance to iterates of other subproblems and the original objective function. ### Method Signature ```julia alternating_linear_minimization(f, grad!, lmos, x0) ``` ### Parameters - **f**: The objective function to minimize. - **grad!**: A function that computes the gradient of `f`. - **lmos**: A list of linear minimization oracles, one for each convex set. - **x0**: The initial point. ``` -------------------------------- ### LMO Interface Definition Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/2_lmo.md Defines the abstract type for Linear Minimization Oracles. ```julia FrankWolfe.LinearMinimizationOracle ``` -------------------------------- ### FrankWolfe.LinearMinimizationOracle Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/2_lmo.md The abstract type for all Linear Minimization Oracles. It is a key component called at each iteration of the FW algorithm. Given `d` in the feasible set `X`, it returns a vertex `v` of the feasible set that minimizes the dot product \langle d, x \rangle. ```APIDOC ## Type: FrankWolfe.LinearMinimizationOracle ### Description Abstract type for Linear Minimization Oracles. These oracles are invoked at each iteration of the Frank-Wolfe algorithm to find a vertex of the feasible set that minimizes a linear objective function. ### Subtypes - `FrankWolfe.CachedLMO` - `FrankWolfe.ProductLMO` - `FrankWolfe.SingleLastCachedLMO` - `FrankWolfe.MultiCacheLMO` - `FrankWolfe.VectorCacheLMO` - Oracles defined in `norm_oracles.jl`, `simplex_oracles.jl`, `polytope_oracles.jl`, `spectral_oracles.jl`, and `moi_oracle.jl`. ``` -------------------------------- ### FrankWolfe.block_coordinate_frank_wolfe Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/1_algorithms.md Implements the Block Coordinate Frank-Wolfe algorithm. This method is suitable for problems where the objective function or constraints can be decomposed into blocks. ```APIDOC ## FrankWolfe.block_coordinate_frank_wolfe ### Description Implements the Block Coordinate Frank-Wolfe algorithm. This method is suitable for problems where the objective function or constraints can be decomposed into blocks. ### Method Signature ```julia block_coordinate_frank_wolfe(f, grad!, lmo, x0) ``` ### Parameters - **f**: The objective function to minimize. - **grad!**: A function that computes the gradient of `f`. - **lmo**: A linear minimization oracle. - **x0**: The initial point. ``` -------------------------------- ### FrankWolfe.alternating_projections Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/1_algorithms.md Solves feasibility problems over intersections of feasible regions using an alternating projections approach. This method is designed for finding a point that satisfies constraints across multiple sets. ```APIDOC ## FrankWolfe.alternating_projections ### Description Solves feasibility problems over intersections of feasible regions using an alternating projections approach. This method is designed for finding a point that satisfies constraints across multiple sets. ### Method Signature ```julia alternating_projections(constraints, x0) ``` ### Parameters - **constraints**: A list of constraints defining the feasible regions. - **x0**: The initial point. ``` -------------------------------- ### FrankWolfe Block-Coordinate Update Step Types Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents subtypes of UpdateStep and the update_block_iterate method for defining iterations in block-coordinate Frank-Wolfe. ```julia FrankWolfe.UpdateStep ``` ```julia FrankWolfe.update_block_iterate ``` ```julia FrankWolfe.FrankWolfeStep ``` ```julia FrankWolfe.BPCGStep ``` -------------------------------- ### Required Methods for Iterate Type Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md These methods must be implemented for iterate types that behave as members of a Hilbert space and are optionally mutable. ```julia Base.similar(::IT) Base.similar(::IT, ::Type{T}) Base.collect(::IT) Base.size(::IT) Base.eltype(::IT) Base.copyto!(dest::IT, src::IT) Base.:+(x1::IT, x2::IT) Base.:*(scalar::Real, x::IT) Base.:-(x1::IT, x2::IT) LinearAlgebra.dot(x1::IT, x2::IT) LinearAlgebra.norm(::IT) ``` -------------------------------- ### FrankWolfe BlockVector Documentation Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents the BlockVector type for representing block vectors in FrankWolfe.jl. ```julia FrankWolfe.BlockVector ``` -------------------------------- ### Active Set Update Methods Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md These methods are used to update the iterate within the active set computation. ```julia FrankWolfe.active_set_update_scale!(x::IT, lambda, atom) FrankWolfe.active_set_update_iterate_pairwise!(x::IT, lambda, fw_atom, away_atom) ``` -------------------------------- ### FrankWolfe Block Coordinate Update Order Types Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/3_backend.md Documents subtypes of BlockCoordinateUpdateOrder and the select_update_indices method for controlling block updates. ```julia FrankWolfe.BlockCoordinateUpdateOrder ``` ```julia FrankWolfe.select_update_indices ``` ```julia FrankWolfe.FullUpdate ``` ```julia FrankWolfe.CyclicUpdate ``` ```julia FrankWolfe.StochasticUpdate ``` ```julia FrankWolfe.LazyUpdate ``` -------------------------------- ### Frank-Wolfe Line Search Method Type Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/4_linesearch.md Defines the abstract type for all line search methods used in Frank-Wolfe algorithms. Implementations must define the `perform_line_search` method. ```julia ```@docs FrankWolfe.LineSearchMethod ``` ``` -------------------------------- ### Compute Active Set Iterate Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md This method is required if the iterate type is not a broadcastable mutable object. It recomputes the iterate from the convex decomposition. ```julia FrankWolfe.compute_active_set_iterate!(active_set::FrankWolfe.ActiveSet{AT, R, IT}) where {AT, R} ``` -------------------------------- ### compute_extreme_point Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/reference/2_lmo.md Computes an extreme point of the feasible set given a direction vector. This is the core method implemented by all subtypes of `LinearMinimizationOracle`. ```APIDOC ## Method: compute_extreme_point ### Description Computes an extreme point of the feasible set given a direction vector `d`. This method is implemented by all subtypes of `FrankWolfe.LinearMinimizationOracle` and is central to the Frank-Wolfe algorithm. ### Signature ```julia compute_extreme_point(lmo::LinearMinimizationOracle, d::AbstractVector) ``` ### Parameters - `lmo` (LinearMinimizationOracle): The Linear Minimization Oracle instance. - `d` (AbstractVector): The direction vector in the dual space. ### Returns An `AbstractVector` representing an extreme point of the feasible set that minimizes \langle d, x \rangle. ``` -------------------------------- ### Reynolds Operator Definition Source: https://github.com/zib-iol/frankwolfe.jl/blob/master/docs/src/advanced.md This mathematical definition illustrates the Reynolds operator used for symmetry reduction. It averages group actions to find an invariant subspace. ```math \mathcal{R}(x)=\frac{1}{|G|}\sum_{g\in G}g\cdot x. ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.