include("Engine.jl") using SparseArrays using Random # initialize the partial gram matrix for a sphere inscribed in a regular # tetrahedron J = Int64[] K = Int64[] values = BigFloat[] for j in 1:6 for k in 1:6 filled = false if j == 6 if k <= 4 push!(values, 0) filled = true end elseif k == 6 if j <= 4 push!(values, 0) filled = true end elseif j == k push!(values, 1) filled = true elseif j <= 4 && k <= 4 push!(values, -1/BigFloat(3)) filled = true else push!(values, -1) filled = true end if filled push!(J, j) push!(K, k) end end end gram = sparse(J, K, values) # set initial guess Random.seed!(99230) guess = hcat( sqrt(1/BigFloat(3)) * BigFloat[ 1 1 -1 -1 0 1 -1 1 -1 0 1 -1 -1 1 0 0 0 0 0 1.5 1 1 1 1 -0.5 ] + 0.2*Engine.rand_on_shell(fill(BigFloat(-1), 5)), BigFloat[0, 0, 0, 0, 1] ) frozen = [CartesianIndex(j, 6) for j in 1:5] # complete the gram matrix using Newton's method with backtracking L, success, history = Engine.realize_gram(gram, guess, frozen) completed_gram = L'*Engine.Q*L println("Completed Gram matrix:\n") display(completed_gram) if success println("\nTarget accuracy achieved!") else println("\nFailed to reach target accuracy") end println("Steps: ", size(history.scaled_loss, 1)) println("Loss: ", history.scaled_loss[end], "\n") # test an alternate technique for finding the projected base step from the # unprojected Hessian L_alt, success_alt, history_alt = Engine.realize_gram_alt_proj(gram, guess, frozen) completed_gram_alt = L_alt'*Engine.Q*L_alt println("\nDifference in result using alternate projection:\n") display(completed_gram_alt - completed_gram) println("\nDifference in steps: ", size(history_alt.scaled_loss, 1) - size(history.scaled_loss, 1)) println("Difference in loss: ", history_alt.scaled_loss[end] - history.scaled_loss[end], "\n")