function [param_list, warped_points, warped_image, score] = optimise_warps(ref_image, ref_points, unwarped_image, unwarped_points, spline_type, placement_method, n_points, verbose, do_plot, subplot_fig, pane)
% OPTIMISE_WAPRS: 
%
% Code written by Katherine Smith, 2003
%
%    GENERAL
%
%      [param_list, warped_points, warped_image, score] = 
%        optimise_warps(ref_image, ref_points, unwarped_image, 
%        unwarped_points, spline_type, placement_method, n_points, 
%        verbose, do_plot, subplot_fig, pane)
%
%    INPUT/S
%
%      -X:
%          X
%           
%    OUTPUT/S
%
%      -X:
%           X
%
%    PENDING WORK
%      
%      
%
%    KNOWN BUG/S
%
%      
%
%    COMMENT/S
%
%      -This function was moved and made redandant in May 2004. It was
%      only used by older functions, namely:
%           eval_obj_fn_to_mean_surf.m , eval_obj_fn_to_mean.m,
%           build_1d_model_2_bump.m
%
%    RELATED FUNCTION/S
%
%      
%
%    ABOUT
%
%      -Created:     November 23rd, 2003
%      -Last update: December 1st, 2003
%      -Revision:    0.0.2
%      -Author:      R. S. Schestowitz, University of Manchester
% ==============================================================

[grid, steps] = setup_grid(2, unwarped_image, ref_points, placement_method, n_points);
% set up the grid

if(do_plot) % if <do_plot> then show the unwarped image
  figure(subplot_fig),subplot(10,2,pane,'replace'),plot(unwarped_image); drawnow;
end

warp_params.green = 'biharmCPS'; % initilaise some variables here
param_list = [];
start_image = unwarped_image;
start_points = unwarped_points;

%last_score = msd(ref_image, unwarped_image);

if(strcmp(spline_type,'single_point'))
  for i=1:size(grid,2) % for all grid size
    [params, score] = fminsearch(@eval_msd_cps_warp,[0],optimset('Display',verbose),grid(i),steps(i),start_points, start_image, ref_image, verbose); % warp it
%    [params, score] = fminsearch(@eval_msd_cps_warp,[0],optimset('Display',verbose),grid(i),steps(i),start_points, start_image, ref_image, verbose);
    param_list(size(param_list,1)+1).d = params; % get parameters of warped image
    start_points = cps_warp_1d(start_points, grid(i), steps(i), params(1));
    start_image = interp1(ref_points,unwarped_image,start_points, 'linear',0);
	% step to next image and points
    last_score = score; % currently unused?
  end
elseif(strcmp(spline_type,'multi_point'))
  warped_grid = grid;
  warp_params.green = 'biharmCPS';
  last_score = eval_msd_multi_warp(zeros(size(grid)),grid, unwarped_image, unwarped_points, ref_image, ref_points, 20, warp_params);
  [params, score] = fminsearch(@eval_msd_multi_warp,zeros(size(grid)),optimset('Display',verbose,'TolX',1e-10),grid, unwarped_image, unwarped_points, ref_image, ref_points, 20, warp_params);
  param_list(size(param_list,1)+1,:).d = params; % get parameters returned
  warped_grid = grid + params;
  start_points = nrr_trans_1d(start_points, grid, warped_grid, warp_params,[]);
  start_image = interp1(unwarped_points,unwarped_image,start_points, 'linear',0);
% step forward to next image and points
  disp(['Initial score: ',num2str(last_score),' Final score: ',num2str(score)]);
% display the score/s
end

warped_points = start_points;
warped_image = start_image;
if(do_plot) % if <do_plot> show results after warping
  figure(subplot_fig),subplot(10,2,pane,'replace'),plot(warped_image); drawnow;
end
