%
clear all
tau0=1.0e-4; % to test if the smallest eigenvalue of G(1:m,1:m) is at least tau0
tau = 0.5*tau0; % tau must be smaller than tau0
tol = 1.0e-6; % stopping criterion
% % %%%%%%%%%%%%%%%% Generate a random correlation matrix with given eigenvalues%%%%%%%%%%%%%%%%
n = 300;
m = 100;
n1 = round(n/10);
d1 = rand(n1,1)/n; %% To get larger eigenvalues
k =min(10, n-m);
d3 = n*rand(k,1);
d = rand(n,1);
d(1:n1) =d1;
d(n-k+1:n,1)=d3; %% To get larger eigenvalues
%sum_d =sum(d)
d = n*d/sum(d); % sum(d) =n;
min_d = min(d)
max_d = max(d)
%G =gallery('randcorr',n);
G =gallery('randcorr',d); %generate a correlation matrix with given eigenvalues
G =(G+G')/2;
% Correlation matrix used in RiskMetrics
% % Correlation matrix used in RiskMetrics
%
% load x.mat
% G=extract(x);
% [n, n_c]=size(G);
% m=10;
C=G;
% Generate a random stress matrix
stress_matrix = 2.0*rand(n,n)-ones(n,n);
stress_matrix = 0.5*(stress_matrix + stress_matrix');
for i=1:n
stress_matrix(i,i) =1;
end
stress_matrix(1:m,1:n) = C(1:m,1:n);
stress_matrix((m+1):n,1:m) = C((m+1):n,1:m);
% %%%%%%%%%%%%%%%% Produce a perturbed correlation matrix with C_1 %%%%%%%%%%%%%%%%
alpha_purt =.10;
C =(1-alpha_purt)*C+ (alpha_purt)*stress_matrix;
C =(C+C')/2;
% %%%%%%%%%%%%%%%%%%%%%%%
%% Both C(1:m,1:n) and C(1:n,1:m) are fixed
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %%%%%%%%%%%%%%%%%%%%%%%
% G: the unstresed correlation matrix (n by n)
% C: stressed correlation matrix (n by n)
% C(1:m,1:m) is fixed
% tau0: the threshold for positive definiteness of C
% tau: the lower bound for the smallest eigevalue of X
% tol: stopping crierion for the KKT system: 1.0e-5 ~ 1.0e-6
% X: the calibrated correlation matrix
% val_obj: final objective function value
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[X,val_obj] = CorNewtonSchur(G,C,m,n,tau,tau0,tol);