include("Engine.jl")

using SparseArrays
using AbstractAlgebra
using PolynomialRoots

# initialize the partial gram matrix for a sphere inscribed in a regular
# tetrahedron
J = Int64[]
K = Int64[]
values = BigFloat[]
for j in 1:5
  for k in 1:5
    push!(J, j)
    push!(K, k)
    if j == k
      push!(values, 1)
    elseif (j <= 4 && k <= 4)
      push!(values, -1/BigFloat(3))
    else
      push!(values, -1)
    end
  end
end
gram = sparse(J, K, values)

# set initial guess
Random.seed!(99230)
guess = sqrt(1/BigFloat(3)) * BigFloat[
  1  1 -1 -1  0
  1 -1  1 -1  0
  1 -1 -1  1  0
  1  1  1  1 -2
  1  1  1  1  1
] + 0.2*Engine.rand_on_shell(fill(BigFloat(-1), 5))

# complete the gram matrix using gradient descent
L, history = Engine.realize_gram(gram, guess)
completed_gram = L'*Engine.Q*L
println("Completed Gram matrix:\n")
display(completed_gram)
println("\nSteps: ", size(history.stepsize, 1))
println("Loss: ", history.scaled_loss[end], "\n")