%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Requires yalmip
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Part 1
% Spin Glass Chain
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 20;
b = randn(1,N); B = diag(b);
J = 0.5*([B(:,end) B(:,1:end-1)] + [B(end,:); B(1:end-1,:)]);

c_min_e = -sum(abs(b));
c_min_sdp = sdp(J);
c_min_ann = anneal(J);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Part 2
% Spin Glass Grid
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

n = 5; N = n*n;
J = zeros(N);
for i = [1:N]
   if (mod(i,n) == 0)  J(i-n+1,i) = randn();
   else J(i,i+1) = randn(); end
   if (i <= N - n) J(i,i+n) = randn();
   else J(i,i-N+n) = randn();  end
end
b = J(J~=0);
J = 0.5*(J + J');

g_min_e = -sum(abs(b));
g_min_sdp = sdp(J);
g_min_ann = anneal(J);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Print Results
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

disp(sprintf('-----------------------------------------\n'));
disp(sprintf('Spin Glass Chain'));
disp(sprintf('min energy:        %f',c_min_e));
disp(sprintf('sdp min energy:    %f',c_min_sdp));
disp(sprintf('anneal min energy: %f',c_min_ann));
disp(sprintf('\n-----------------------------------------\n'));

disp(sprintf('-----------------------------------------\n'));
disp(sprintf('Spin Glass Grid'));
disp(sprintf('min energy:        %f',g_min_e));
disp(sprintf('sdp min energy:    %f',g_min_sdp));
disp(sprintf('anneal min energy: %f',g_min_ann));
disp(sprintf('\n-----------------------------------------\n'));

