function Problem = UFget (matrix, UF_Index)
%UFGET loads a matrix from the UF Sparse Matrix Collection.
%
% Problem = UFget(matrix) loads a matrix from the UF sparse matrix collection,
% specified as either a number (1 to the # of matrices in the collection) or
% as a string (the name of the matrix). With no input parameters, index=UFget
% returns an index of matrices in the collection. A local copy of the matrix
% is saved (be aware that as of March 2008 the entire collection is 9.5GB
% in size). If no input or output arguments are provided, the index is
% printed. With a 2nd parameter (Problem = UFget (matrix, index)), the index
% file is not loaded. This is faster if you are loading lots of matrices.
%
% Examples:
% index = UFget ; % loads index
% index = UFget ('refresh') ; % forces download of new index
%
% Problem = UFget (6) % 4 ways of loading the same Problem
% Problem = UFget ('HB/arc130')
% Problem = UFget (6, index)
% Problem = UFget ('HB/arc130', index)
%
% See also UFgrep, UFweb, UFget_example, UFget_defaults, urlwrite.
% Copyright 2008, Tim Davis, University of Florida.
%-------------------------------------------------------------------------------
% get the parameter settings
%-------------------------------------------------------------------------------
params = UFget_defaults ;
indexfile = sprintf ('%sUF_Index.mat', params.dir) ;
indexurl = sprintf ('%s/UF_Index.mat', params.url) ;
%-------------------------------------------------------------------------------
% get the index file (download a new one if necessary)
%-------------------------------------------------------------------------------
refresh = 0 ;
if nargin == 0
% if the user passed in a zero or no argument at all, return the index file
matrix = 0 ;
else
% UFget ('refresh') downloads the latest index file from the web
if (ischar (matrix))
if (strcmp (matrix, 'refresh'))
matrix = 0 ;
refresh = 1 ;
end
end
end
if (~refresh)
try
% load the existing index file
if (nargin < 2)
load (indexfile) ;
end
% see if the index file is old; if so, download a fresh copy
refresh = (UF_Index.DownloadTimeStamp + params.refresh < now) ;
catch
% oops, no index file, or a refresh is due. download it.
refresh = 1 ;
end
end
err = '' ; % to catch a download error, if any
if (refresh)
% a new UF_Index.mat file to get access to new matrices (if any)
try
tmp = tempname ; % download to a temp file first
old = sprintf ('%sUF_Index_old.mat', params.dir) ;
urlwrite (indexurl, tmp) ; % download the latest index file
try
movefile (indexfile, old, 'f') ; % keep a backup of the old index
catch
% backup failed, continue anyway
end
movefile (tmp, indexfile, 'f') ; % move the new index into place
catch
err = lasterr ;
end
load (indexfile) ;
UF_Index.DownloadTimeStamp = now ;
save (indexfile, 'UF_Index') ;
end
%-------------------------------------------------------------------------------
% return the index file if requested
%-------------------------------------------------------------------------------
if (matrix == 0)
if (nargout == 0)
% no output arguments have been passed, so print the index file
fprintf ('\nUF sparse matrix collection index: %s\n', ...
UF_Index.LastRevisionDate) ;
fprintf ('\nLegend:\n') ;
fprintf ('(p,n)sym: symmetry of the pattern and values\n') ;
fprintf (' (0 = unsymmetric, 1 = symmetric, - = not computed)\n') ;
fprintf ('type: real\n') ;
fprintf (' complex\n') ;
fprintf (' binary: all entries are 0 or 1\n') ;
nmat = length (UF_Index.nrows) ;
for j = 1:nmat
if (mod (j, 25) == 1)
fprintf ('\n') ;
fprintf ('ID Group/Name nrows-by- ncols nonzeros (p,n)sym type\n') ;
end
s = sprintf ('%s/%s', UF_Index.Group {j}, UF_Index.Name {j}) ;
fprintf ('%4d %-30s %7d-by-%7d %9d ', ...
j, s, UF_Index.nrows (j), UF_Index.ncols (j), UF_Index.nnz (j)) ;
psym = UF_Index.pattern_symmetry (j) ;
nsym = UF_Index.numerical_symmetry (j) ;
if (psym < 0)
fprintf (' - ') ;
else
fprintf (' %4.2f', psym) ;
end
if (nsym < 0)
fprintf (' - ') ;
else
fprintf (' %4.2f', nsym) ;
end
if (UF_Index.isBinary (j))
fprintf (' binary\n') ;
elseif (~UF_Index.isReal (j))
fprintf (' complex\n') ;
else
fprintf (' real\n') ;
end
end
else
Problem = UF_Index ;
end
if (~isempty (err))
fprintf ('\nUFget: unable to download latest index; using old one.\n') ;
disp (err) ;
end
return ;
end
%-------------------------------------------------------------------------------
% determine if the matrix parameter is a matrix index or name
%-------------------------------------------------------------------------------
[group matrix id] = UFget_lookup (matrix, UF_Index) ;
if (id == 0)
error ('invalid matrix') ;
end
%-------------------------------------------------------------------------------
% download the matrix (if needed) and load it into MATLAB
matdir = sprintf ('%s%s%s%s.mat', params.dir, group) ;
matfile = sprintf ('%s%s%s.mat', matdir, filesep, matrix) ;
maturl = sprintf ('%s/%s/%s.mat', params.url, group, matrix) ;
if (~exist (matdir, 'dir'))
mkdir (matdir) ; % create the Group directory
end
if (~exist (matfile, 'file'))
fprintf ('downloading %s\n', maturl) ;
fprintf ('to %s\n', matfile) ;
tmp = tempname ; % download to a temp file first
urlwrite (maturl, tmp) ;
movefile (tmp, matfile, 'f') ; % move the new matrix into place
end
load (matfile) ;