You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: I_ConjugateGradientMethod.m
    path of file: ./repos/Performance-Estimation-Toolbox/Examples/01_Methods for unconstrained convex minimization
    
    the code of the file until where you have to start completion: function I_ConjugateGradientMethod
% In this example, we use a greedy first-order method (GFOM), or conjugate
% gradient, for solving the L-smooth (possibly mu-strongly) 
% convex minimization problem
%   min_x F(x); for notational convenience we denote xs=argmin_x F(x).
%
% We show how to compute the worst-case value of F(xN)-F(xs) when xN is
% obtained by doing N steps of the gradient method starting with an initial
% iterate satisfying ||x0-xs||<=1.
%
% Exact worst-case results on GFOM can be found in:
% [1] Y. Drori and A. Taylor. Efficient first-order methods for convex
% minimization: a constructive approach. Mathematical Programming (2019)

% (0) Initialize an empty PEP
P = pep();

% (1) Set up the objective function
param.L     = 1;      % Smoothness parameter
param.mu    = 0.0;    % Strong convexity parameter


    
function I_ConjugateGradientMethod
% In this example, we use a greedy first-order method (GFOM), or conjugate
% gradient, for solving the L-smooth (possibly mu-strongly) 
% convex minimization problem
%   min_x F(x); for notational convenience we denote xs=argmin_x F(x).
%
% We show how to compute the worst-case value of F(xN)-F(xs) when xN is
% obtained by doing N steps of the gradient method starting with an initial
% iterate satisfying ||x0-xs||<=1.
%
% Exact worst-case results on GFOM can be found in:
% [1] Y. Drori and A. Taylor. Efficient first-order methods for convex
% minimization: a constructive approach. Mathematical Programming (2019)

% (0) Initialize an empty PEP
P = pep();

% (1) Set up the objective function
param.L     = 1;      % Smoothness parameter
param.mu    = 0.0;    % Strong convexity parameter

% F is the objective function
F=P.DeclareFunction('SmoothStronglyConvex',param); 

% (2) Set up the starting point and initial condition
x0      = P.StartingPoint();		 % x0 is some starting point
[xs,fs] = F.OptimalPoint(); 		 % xs is an optimal point, and fs=F(xs)
P.InitialCondition( (x0-xs)^2 <= 1); % Initial condition ||x0-xs||^2<= 1

% (3) Algorithm
N = 10;		% number of iterations

x       = cell(N+1,1);% store iterates in a cell
g       = cell(N+1,1);% store gradients in a cell
x{1}    = x0;
g{1}    = F.gradient(x{1});
dirs{1} = g{1}; % search directions in a cell
for i = 1:N
    % span search in all directions contained in the cell dirs{}
    [x{i+1}, g{i+1}, f{i+1}] = exactlinesearch_step(x{i},F,dirs);
    dirs{2+(i-1)*2}  = x{i+1} - x{1}; % add search directions
    dirs{3+(i-1)*2}  = g{i+1};        % add search directions
end