%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Example script:
% Simple single matrix optimization problems with constraints on singular values.
% An application of Algorithm 1 to a few example optimization problems,
% aiming to illustrate the implementation and usage of the theory presented
% in the paper (section 4 and 5).
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Code implementing the paper "Controlling Singular Values with Semidefinite Programming".
% Disclaimer: The code is provided as-is for academic use only and without any guarantees.
% Please contact the authors to report any bugs.
% Written by Shahar Kovalsky (http://www.wisdom.weizmann.ac.il/~shaharko/)
% and Noam Aigerman (http://www.wisdom.weizmann.ac.il/~noamaig/)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% init
rng(1)
close all
clear
initialize
yalmip('clear')
%% setup variables
N = 5; % matrix dimension
A = sdpvar(N,N,'full');
gamma = sdpvar;
Gamma = sdpvar;
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% find closest matrix to a random matrix with SVs bounded in [0.9,1.1]
% (see problem presented in eq. (1) in the paper)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
objective = norm(A-randn(N), 'fro'); % ||A-rand||_fro
constraints = (0.9<=gamma)+(Gamma<=1.1);
assign(A,eye(N)); % init A to be identity
A_hat = optimizeSingleMatrix(constraints,objective,A,gamma,Gamma)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% find closest non-negative matrix to a random matrix with condition number
% (sigma_max/sigma_min) bounded by 1.5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
objective = norm(A-randn(N), 'fro'); % ||A-rand||_fro
constraints = (Gamma<=1.5*gamma);
assign(A,eye(N)); % init A to be identity
A_hat = optimizeSingleMatrix(constraints,objective,A,gamma,Gamma)
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% find a matrix with a given random first row that minimizes that spread
% of singular values (sigma_max-sigma_min)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
objective = (Gamma-gamma);
constraints = (A(1,:)==randn(1,N));
assign(A,eye(N)); % init A to be identity
A_hat = optimizeSingleMatrix(constraints,objective,A,gamma,Gamma)