function parfor_sparseGV( qname, dbname, params )


[~, dbbasename, ~] = fileparts(dbname);
this_sparsegv_matname = fullfile(params.output.gv_sparse.dir, qname, [dbbasename, params.output.gv_sparse.matformat]);

if exist(this_sparsegv_matname, 'file') ~= 2
    %load features
    qfmatname = fullfile(params.input.feature.dir, params.data.q.dir, [qname, params.input.feature.q_sps_matformat]);
    if exist(qfmatname, 'file') ~= 2
        Iqname = fullfile(params.data.dir, params.data.q.dir, qname);
        [ f, d ] = Features_WUSTL( im2single(rgb2gray(imread(Iqname))) );
        d = relja_rootsift(d);
        [qfdir, ~, ~] = fileparts(qfmatname);
        if exist(qfdir, 'dir') ~= 7
            mkdir(qfdir);
        end
        save('-v6', qfmatname, 'f', 'd');
    end
    features_q = load(qfmatname);
    
    dbfmatname = fullfile(params.input.feature.dir, params.data.db.cutout.dir, [dbname, params.input.feature.db_sps_matformat]);
    if exist(dbfmatname, 'file') ~= 2
        Idbname = fullfile(params.data.dir, params.data.db.cutout.dir, dbname);
        [ f, d ] = Features_WUSTL( im2single(rgb2gray(imread(Idbname))) );
        d = relja_rootsift(d);
        [dbfdir, ~, ~] = fileparts(dbfmatname);
        if exist(dbfdir, 'dir') ~= 7
            mkdir(dbfdir);
        end
        save('-v6', dbfmatname, 'f', 'd');
    end
    features_db = load(dbfmatname);
    
    %geometric verification
    if size(features_db.d, 2) < 6
        H = nan(3, 3);
        inls_qidx = [];
        inls_dbidx = [];
        inliernum = 0;
        matches = [];
        inliers = [];
    else
        
        %geometric verification (homography lo-ransac)
        [matches, inliers, H, ~] = at_sparseransac(features_q.f,features_q.d,features_db.f,features_db.d,3,10);
        inliernum = length(inliers);
        inls_qidx = inliers(1, :); inls_dbidx = inliers(2, :);
    end
    
    %save
    if exist(fullfile(params.output.gv_sparse.dir, qname), 'dir') ~= 7
        mkdir(fullfile(params.output.gv_sparse.dir, qname));
    end
    save('-v6', this_sparsegv_matname, 'H', 'inliernum', 'inls_qidx', 'inls_dbidx', 'matches', 'inliers');
    
%     %debug
%     Iq = imread(fullfile(params.data.dir, params.data.q.dir, qname));
%     Idb = imread(fullfile(params.data.dir, params.data.db.cutout.dir, dbname));
%     figure();
%     ultimateSubplot ( 2, 1, 1, 1, 0.01, 0.05 );
%     imshow(rgb2gray(Iq));hold on;
%     plot(features_q.f(1, inls_qidx), features_q.f(2, inls_qidx),'g.');
%     ultimateSubplot ( 2, 1, 2, 1, 0.01, 0.05 );
%     imshow(rgb2gray(Idb));hold on;
%     plot(features_db.f(1, inls_dbidx), features_db.f(2, inls_dbidx),'g.');
% 
%     keyboard;
    
end



end

