%fill_mm_sub Proj. reconstruction of a normed sub-scene.
%
%   When the central image concept is used, the information which image is
%   the central image is passed to this function as input.
%
%   Parameters:
%
%      Mfull .. complete known parts of the problem, used here for the best
%               estimate of the fundamental matrices

function [P,X, lambda, u1,u2, info] = fill_mm_sub(Mfull, M, central,opt,info)

I = ~isnan(M(1:3:end,:));
[m n] = size(I);
if isempty(central), central = 0; end

P=[]; X=[]; lambda=[]; u1=1:m; u2=1:n;

%estimate the fundamental matrices and epipoles with the method of [Har95]
 [F,ep,rows,nonrows] = M2Fe(Mfull, central);

 if ~isempty(nonrows),
   disp(sprintf('Used local images:%s.', sprintf(' %d', rows))); end
 if length(rows) < 2, return; end

%determine scale faktors lambda_i_p
 if ~central, rows_central = 0; else rows_central = find(rows == central); end
 [lambda, Ilamb] = depth_estimation(M(k2i(rows),:),F,ep,rows, ...
                                    rows_central);

     % prepare info.show_prmm - for show_prmm function
     info.show_prmm.I = I;
     info.show_prmm.Idepths = zeros(m,n); info.show_prmm.Idepths(rows,:)=Ilamb;

%build the rescaled measurement matrix B
 for i = 1:length(rows), B(k2i(i),:) = M(k2i(i),:).*([1;1;1]*lambda(i,:)); end

%balance W by column-wise and "triplet-of-rows"-wise scalar multiplications
 B = balance_triplets(B, opt);

%fit holes in JIM by Jacobs' algorithm
 [P,X, u1,u2, lambda1, info] = fill_prmm(B, Ilamb, central,opt,info);

r1 = setdiff(1:length(rows),u1); r2 = setdiff(1:n,u2);

lambda = lambda(r1,r2);  % to fit P*X
if ~isempty(lambda1),
  new = find(~Ilamb(r1,r2) & I(r1,r2)); lambda(new) = lambda1(new); end

error = eucl_dist_only(B(k2i(r1), r2), P*X, ~isnan(B(3*r1,r2)), 3);
if opt.verbose, disp(sprintf('Error balanced: %f', error)); end

u1 = union(nonrows, rows(u1));
