diff --git a/11-09/NWTN.jl b/11-09/NWTN.jl new file mode 100644 index 0000000..d7b364e --- /dev/null +++ b/11-09/NWTN.jl @@ -0,0 +1,387 @@ +using LinearAlgebra, Printf, Plots + +function NWTN(f; + x::Union{Nothing, Vector}=nothing, + eps::Real=1e-6, + MaxFeval::Integer=1000, + m1::Real=1e-4, + m2::Real=0.9, + delta::Real=1e-6, + tau::Real=0.9, + sfgrd::Real=0.2, + MInf::Real=-Inf, + mina::Real=1e-16, + plt::Union{Plots.Plot, Nothing}=nothing, + plotatend::Bool=true, + Plotf::Integer=0, + printing::Bool=true)::Tuple{AbstractArray, String} + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # inner functions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + function f2phi(alpha, derivate=false) + # computes and returns the value of the tomography at alpha + # + # phi( alpha ) = f( x + alpha * d ) + # + # if Plotf > 2 saves the data in gap() for plotting + # + # if the second output parameter is required, put there the derivative + # of the tomography in alpha + # + # phi'( alpha ) = < \nabla f( x + alpha * d ) , d > + # + # saves the point in lastx, the gradient in lastg, the Hessian in lasth, + # and increases feval + + lastx = x + alpha * d + phi, lastg, lastH = f(lastx) + + if Plotf > 2 + if fStar > - Inf + push!(gap, (phi - fStar) / max(abs(fStar), 1)) + else + push!(gap, phi) + end + end + + feval += 1 + + if derivate + return (phi, dot(d, lastg)) + end + return (phi, nothing) + end + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + function ArmijoWolfeLS(phi0, phip0, as, m1, m2, tau) + # performs an Armijo-Wolfe Line Search. + # + # phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0 + # + # as > 0 is the first value to be tested: if phi'( as ) < 0 then as is + # divided by tau < 1 (hence it is increased) until this does not happen + # any longer + # + # m1 and m2 are the standard Armijo-Wolfe parameters; note that the strong + # Wolfe condition is used + # + # returns the optimal step and the optimal f-value + + lsiter = 1 # count iterations of first phase + local phips, phia + while feval ≤ MaxFeval + phia, phips = f2phi(as, true) + + if (phia ≤ phi0 + m1 * as * phip0) && (abs(phips) ≤ - m2 * phip0) + if printing + @printf(" %2d", lsiter) + end + a = as; + return (a, phia) # Armijo + strong Wolfe satisfied, we are done + + end + if phips ≥ 0 + break + end + as = as / tau + lsiter += 1 + end + + if printing + @printf(" %2d ", lsiter) + end + lsiter = 1 # count iterations of second phase + + am = 0 + a = as + phipm = phip0 + while (feval ≤ MaxFeval ) && ((as - am)) > mina && (phips > 1e-12) + + # compute the new value by safeguarded quadratic interpolation + a = (am * phips - as * phipm) / (phips - phipm) + a = max(am + ( as - am ) * sfgrd, min(as - ( as - am ) * sfgrd, a)) + + # compute phi(a) + phia, phip = f2phi(a, true) + + if (phia ≤ phi0 + m1 * a * phip0) && (abs(phip) ≤ -m2 * phip0) + break # Armijo + strong Wolfe satisfied, we are done + end + + # restrict the interval based on sign of the derivative in a + if phip < 0 + am = a + phipm = phip + else + as = a + if as ≤ mina + break + end + phips = phip + end + lsiter += 1 + end + + if printing + @printf("%2d", lsiter) + end + return (a, phia) + end + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + function BacktrackingLS(phi0, phip0, as, m1, tau) + # performs a Backtracking Line Search. + # + # phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0 + # + # as > 0 is the first value to be tested, which is decreased by + # multiplying it by tau < 1 until the Armijo condition with parameter + # m1 is satisfied + # + # returns the optimal step and the optimal f-value + + lsiter = 1 # count ls iterations + while feval ≤ MaxFeval && as > mina + phia, _ = f2phi(as) + if phia ≤ phi0 + m1 * as * phip0 # Armijo satisfied + break # we are done + end + as *= tau + lsiter += 1 + end + + if printing + @printf(" %2d", lsiter) + end + + return (as, phia) + end + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + #Plotf = 2 + # 0 = nothing is plotted + # 1 = the level sets of f and the trajectory are plotted (when n = 2) + # 2 = the function value / gap are plotted, iteration-wise + # 3 = the function value / gap are plotted, function-evaluation-wise + + Interactive = false + + PXY = Matrix{Real}(undef, 2, 0) + + local gap + if Plotf > 1 + if Plotf == 2 + MaxIter = 50 # expected number of iterations for the gap plot + else + MaxIter = 70 # expected number of iterations for the gap plot + end + gap = [] + end + + if Plotf == 2 && plt == nothing + plt = plot(xlims=(0, MaxIter), ylims=(1e-15, 1e+1)) + end + if Plotf > 1 && plt == nothing + plt = plot(xlims=(0, MaxIter)) + end + if plt == nothing + plt = plot() + end + + local fStar + if isnothing(x) + (fStar, x, _) = f(nothing) + else + (fStar, _, _) = f(nothing) + end + + n = size(x, 1) + + if m1 ≤ 0 || m1 ≥ 1 + throw(ArgumentError("m1 is not in (0 ,1)")) + end + + AWLS = (m2 > 0 && m2 < 1) + + if delta < 0 + throw(ArgumentError("delta must be ≥ 0")) + end + + if tau ≤ 0 || tau ≥ 1 + throw(ArgumentError("tau is not in (0 ,1)")) + end + + if sfgrd ≤ 0 || sfgrd ≥ 1 + throw(ArgumentError("sfgrd is not in (0, 1)")) + end + + if mina < 0 + throw(ArgumentError("mina must be ≥ 0")) + end + + # "global" variables- - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + lastx = zeros(n) # last point visited in the line search + lastg = zeros(n) # gradient of lastx + lastH = zeros(n, n) # Hessian of lastx + d = zeros(n) # Newton's direction + feval = 0 # f() evaluations count ("common" with LSs) + + status = "error" + + # initializations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if fStar > -Inf + prevv = Inf + end + + if printing + @printf("Newton's method\n") + if fStar > -Inf + @printf("feval\trel gap\t\t|| g(x) ||\trate\t\tdelta") + else + @printf("feval\tf(x)\t\t\t|| g(x) ||\tdelta") + end + @printf("\t\tls it\ta*") + @printf("\n\n") + end + + + v, _ = f2phi(0) + ng = norm(lastg) + if eps < 0 + ng0 = -ng # norm of first subgradient: why is there a "-"? ;-) + else + ng0 = 1 # un-scaled stopping criterion + end + + # main loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + while true + + # output statistics - - - - - - - - - - - - - - - - - - - - - - - - - - + + if fStar > -Inf + gapk = ( v - fStar ) / max(abs( fStar ), 1) + + if printing + @printf("%4d\t%1.4e\t%1.4e", feval, gapk, ng) + if prevv < Inf + @printf("\t%1.4e", ( v - fStar ) / ( prevv - fStar )) + else + @printf("\t\t") + end + end + prevv = v + + if Plotf > 1 + if Plotf ≥ 2 + push!(gap, gapk) + end + end + else + if printing + @printf("%4d\t%1.8e\t\t%1.4e", feval, v, ng) + end + + if Plotf > 1 + if Plotf ≥ 2 + push!(gap, v) + end + end + end + + # stopping criteria - - - - - - - - - - - - - - - - - - - - - - - - - - + + if ng ≤ eps * ng0 + status = "optimal" + break + end + + if feval > MaxFeval + status = "stopped" + break + end + + # compute Newton's direction- - - - - - - - - - - - - - - - - - - - - - + + lambdan = eigmin(lastH) # smallest eigenvalue + if lambdan < delta + if printing + @printf("\t%1.4e", delta - lambdan) + end + lastH = lastH + (delta - lambdan) * I + else + if printing + @printf("\t0.00e+00") + end + end + d = -lastH \ lastg + phip0 = lastg' * d + + # compute step size - - - - - - - - - - - - - - - - - - - - - - - - - - + # in Newton's method, the default initial stepsize is 1 + + if AWLS + a, v = ArmijoWolfeLS(v, phip0, 1, m1, m2, tau) + else + a, v = BacktrackingLS(v, phip0, 1, m1, tau) + end + + # output statistics - - - - - - - - - - - - - - - - - - - - - - - - - - + + if printing + @printf("\t%1.2e", a) + @printf("\n") + end + + if a ≤ mina + status = "error" + break + end + + if v ≤ MInf + status = "unbounded" + break + end + + # compute new point - - - - - - - - - - - - - - - - - - - - - - - - - - + + # possibly plot the trajectory + if n == 2 && Plotf == 1 + PXY = hcat(PXY, hcat(x, lastx)) + end + + x = lastx + ng = norm(lastg) + + # iterate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if Interactive + readline() + end + end + + if plotatend + if Plotf ≥ 2 + plot!(plt, gap) + elseif Plotf == 1 && n == 2 + plot!(plt, PXY[1, :], PXY[2, :]) + end + display(plt) + end + + # end of main loop- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + return (x, status) +end \ No newline at end of file diff --git a/11-09/NWTN.m b/11-09/NWTN.m new file mode 100644 index 0000000..dab9ae9 --- /dev/null +++ b/11-09/NWTN.m @@ -0,0 +1,553 @@ +function [ x , status ] = NWTN( f , varargin ) + +%function [ x , status ] = NWTN( f , x , eps , MaxFeval , m1 , m2 , delta , +% tau , sfgrd , MInf , mina ) +% +% Apply a classical Newton's method for the minimization of the provided +% function f, which must have the following interface: +% +% [ v , g , H ] = f( x ) +% +% Input: +% +% - x is either a [ n x 1 ] real (column) vector denoting the input of +% f(), or [] (empty). +% +% Output: +% +% - v (real, scalar): if x == [] this is the best known lower bound on +% the unconstrained global optimum of f(); it can be -Inf if either f() +% is not bounded below, or no such information is available. If x ~= [] +% then v = f(x). +% +% - g (real, [ n x 1 ] real vector): this also depends on x. if x == [] +% this is the standard starting point from which the algorithm should +% start, otherwise it is the gradient of f() at x (or a subgradient if +% f() is not differentiable at x, which it should not be if you are +% applying the gradient method to it). +% +% - H (real, [ n x n ] real matrix) must only be specified if x ~= [], +% and it is the Hessian of f() at x. If no such information is +% available, the function throws error. +% +% The other [optional] input parameters are: +% +% - x (either [ n x 1 ] real vector or [], default []): starting point. +% If x == [], the default starting point provided by f() is used. +% +% - eps (real scalar, optional, default value 1e-6): the accuracy in the +% stopping criterion: the algorithm is stopped when the norm of the +% gradient is less than or equal to eps. If a negative value is provided, +% this is used in a *relative* stopping criterion: the algorithm is +% stopped when the norm of the gradient is less than or equal to +% (- eps) * || norm of the first gradient ||. +% +% - MaxFeval (integer scalar, optional, default value 1000): the maximum +% number of function evaluations (hence, iterations will be not more than +% MaxFeval because at each iteration at least a function evaluation is +% performed, possibly more due to the line search). +% +% - m1 (real scalar, optional, default value 1e-4): first parameter of the +% Armijo-Wolfe-type line search (sufficient decrease). Has to be in (0,1) +% +% - m2 (real scalar, optional, default value 0.9): typically the second +% parameter of the Armijo-Wolfe-type line search (strong curvature +% condition). It should to be in (0,1); if not, it is taken to mean that +% the simpler Backtracking line search should be used instead +% +% - delta (real scalar, optional, default value 1e-6): minimum positive +% value for the eigenvalues of the modified Hessian used to compute the +% Newton direction +% +% - tau (real scalar, optional, default value 0.9): scaling parameter for +% the line search. In the Armijo-Wolfe line search it is used in the +% first phase: if the derivative is not positive, then the step is +% divided by tau (which is < 1, hence it is increased). In the +% Backtracking line search, each time the step is multiplied by tau +% (hence it is decreased). +% +% - sfgrd (real scalar, optional, default value 0.2): safeguard parameter +% for the line search. to avoid numerical problems that can occur with +% the quadratic interpolation if the derivative at one endpoint is too +% large w.r.t. the one at the other (which leads to choosing a point +% extremely near to the other endpoint), a *safeguarded* version of +% interpolation is used whereby the new point is chosen in the interval +% [ as * ( 1 + sfgrd ) , am * ( 1 - sfgrd ) ], being [ as , am ] the +% current interval, whatever quadratic interpolation says. If you +% experiemce problems with the line search taking too many iterations to +% converge at "nasty" points, try to increase this +% +% - MInf (real scalar, optional, default value -Inf): if the algorithm +% determines a value for f() <= MInf this is taken as an indication that +% the problem is unbounded below and computation is stopped +% (a "finite -Inf"). +% +% - mina (real scalar, optional, default value 1e-16): if the algorithm +% determines a stepsize value <= mina, this is taken as an indication +% that something has gone wrong (the gradient is not a direction of +% descent, so maybe the function is not differentiable) and computation +% is stopped. It is legal to take mina = 0, thereby in fact skipping this +% test. +% +% Output: +% +% - x ([ n x 1 ] real column vector): the best solution found so far. +% +% - status (string): a string describing the status of the algorithm at +% termination +% +% = 'optimal': the algorithm terminated having proven that x is a(n +% approximately) optimal solution, i.e., the norm of the gradient at x +% is less than the required threshold +% +% = 'unbounded': the algorithm has determined an extrenely large negative +% value for f() that is taken as an indication that the problem is +% unbounded below (a "finite -Inf", see MInf above) +% +% = 'stopped': the algorithm terminated having exhausted the maximum +% number of iterations: x is the bast solution found so far, but not +% necessarily the optimal one +% +% = 'error': the algorithm found a numerical error that prevents it from +% continuing optimization (see mina above) +% +%{ + ======================================= + Author: Antonio Frangioni + Date: 29-10-21 + Version 1.21 + Copyright Antonio Frangioni + ======================================= +%} + +Plotf = 2; +% 0 = nothing is plotted +% 1 = the level sets of f and the trajectory are plotted (when n = 2) +% 2 = the function value / gap are plotted, iteration-wise +% 3 = the function value / gap are plotted, function-evaluation-wise + +Interactive = false; % if we pause at every iteration + +if Plotf > 1 + if Plotf == 2 + MaxIter = 50; % expected number of iterations for the gap plot + else + MaxIter = 70; % expected number of iterations for the gap plot + end + gap = []; + + xlim( [ 0 MaxIter ] ); + ax = gca; + ax.FontSize = 16; + ax.Position = [ 0.03 0.07 0.95 0.92 ]; + ax.Toolbar.Visible = 'off'; +end + +% reading and checking input- - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +if ~ isa( f , 'function_handle' ) + error( 'f not a function' ); +end + +if isempty( varargin ) || isempty( varargin{ 1 } ) + [ fStar , x ] = f( [] ); +else + x = varargin{ 1 }; + if ~ isreal( x ) + error( 'x not a real vector' ); + end + + if size( x , 2 ) ~= 1 + error( 'x is not a (column) vector' ); + end + + fStar = f( [] ); +end + +n = size( x , 1 ); + +if length( varargin ) > 1 + eps = varargin{ 2 }; + if ~ isreal( eps ) || ~ isscalar( eps ) + error( 'eps is not a real scalar' ); + end +else + eps = 1e-6; +end + +if length( varargin ) > 2 + MaxFeval = round( varargin{ 3 } ); + if ~ isscalar( MaxFeval ) + error( 'MaxFeval is not an integer scalar' ); + end +else + MaxFeval = 1000; +end + +if length( varargin ) > 3 + m1 = varargin{ 4 }; + if ~ isscalar( m1 ) + error( 'm1 is not a real scalar' ); + end + if m1 <= 0 || m1 >= 1 + error( 'm1 is not in (0 ,1)' ); + end +else + m1 = 1e-4; +end + +if length( varargin ) > 4 + m2 = varargin{ 5 }; + if ~ isscalar( m1 ) + error( 'm2 is not a real scalar' ); + end +else + m2 = 0.9; +end + +AWLS = ( m2 > 0 && m2 < 1 ); + +if length( varargin ) > 5 + delta = varargin{ 6 }; + if ~ isscalar( delta ) + error( 'delta is not a real scalar' ); + end + if delta < 0 + error( 'delta must be > 0' ); + end +else + delta = 1e-6; +end + +if length( varargin ) > 6 + tau = varargin{ 7 }; + if ~ isscalar( tau ) + error( 'tau is not a real scalar' ); + end + if tau <= 0 || tau >= 1 + error( 'tau is not in (0 ,1)' ); + end +else + tau = 0.9; +end + +if length( varargin ) > 7 + sfgrd = varargin{ 8 }; + if ~ isscalar( sfgrd ) + error( 'sfgrd is not a real scalar' ); + end + if sfgrd <= 0 || sfgrd >= 1 + error( 'sfgrd is not in (0, 1)' ); + end +else + sfgrd = 0.2; +end + +if length( varargin ) > 8 + MInf = varargin{ 9 }; + if ~ isscalar( MInf ) + error( 'MInf is not a real scalar' ); + end +else + MInf = - Inf; +end + +if length( varargin ) > 9 + mina = varargin{ 10 }; + if ~ isscalar( mina ) + error( 'mina is not a real scalar' ); + end + if mina < 0 + error( 'mina is < 0' ); + end +else + mina = 1e-16; +end + +% "global" variables- - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +lastx = zeros( n , 1 ); % last point visited in the line search +lastg = zeros( n , 1 ); % gradient of lastx +lastH = zeros( n , n ); % Hessian of lastx +d = zeros( n , 1 ); % Newton's direction +feval = 0; % f() evaluations count ("common" with LSs) + +% initializations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +fprintf( 'Newton''s method\n'); +if fStar > - Inf + fprintf( 'feval\trel gap\t\t|| g(x) ||\trate\t\tdelta'); + prevv = Inf; +else + fprintf( 'feval\tf(x)\t\t\t|| g(x) ||\tdelta'); +end +fprintf( '\t\tls it\ta*'); +fprintf( '\n\n' ); + +v = f2phi( 0 ); +ng = norm( lastg ); +if eps < 0 + ng0 = - ng; % norm of first subgradient: why is there a "-"? ;-) +else + ng0 = 1; % un-scaled stopping criterion +end + +% main loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +while true + + % output statistics - - - - - - - - - - - - - - - - - - - - - - - - - - + + if fStar > - Inf + gapk = ( v - fStar ) / max( [ abs( fStar ) 1 ] ); + + fprintf( '%4d\t%1.4e\t%1.4e' , feval , gapk , ng ); + if prevv < Inf + fprintf( '\t%1.4e' , ( v - fStar ) / ( prevv - fStar ) ); + else + fprintf( '\t\t' ); + end + prevv = v; + + if Plotf > 1 + if Plotf >= 2 + gap( end + 1 ) = gapk; + end + semilogy( gap , 'Color' , 'k' , 'LineWidth' , 2 ); + if Plotf == 2 + ylim( [ 1e-15 1e+1 ] ); + else + ylim( [ 1e-15 1e+4 ] ); + end + drawnow; + end + else + fprintf( '%4d\t%1.8e\t\t%1.4e' , feval , v , ng ); + + if Plotf > 1 + if Plotf >= 2 + gap( end + 1 ) = v; + end + plot( gap , 'Color' , 'k' , 'LineWidth' , 2 ); + drawnow; + end + end + + % stopping criteria - - - - - - - - - - - - - - - - - - - - - - - - - - + + if ng <= eps * ng0 + status = 'optimal'; + break; + end + + if feval > MaxFeval + status = 'stopped'; + break; + end + + % compute Newton's direction- - - - - - - - - - - - - - - - - - - - - - + + lambdan = eigs( lastH , 1 , 'sa' ); % smallest eigenvalue + if lambdan < delta + fprintf( '\t%1.4e' , delta - lambdan ); + lastH = lastH + ( delta - lambdan ) * eye( n ); + else + fprintf( '\t0.00e+00' ); + end + d = - lastH \ lastg; + phip0 = lastg' * d; + + % compute step size - - - - - - - - - - - - - - - - - - - - - - - - - - + % in Newton's method, the default initial stepsize is 1 + + if AWLS + [ a , v ] = ArmijoWolfeLS( v , phip0 , 1 , m1 , m2 , tau ); + else + [ a , v ] = BacktrackingLS( v , phip0 , 1 , m1 , tau ); + end + + % output statistics - - - - - - - - - - - - - - - - - - - - - - - - - - + + fprintf( '\t%1.2e' , a ); + fprintf( '\n' ); + + if a <= mina + status = 'error'; + break; + end + + if v <= MInf + status = 'unbounded'; + break; + end + + % compute new point - - - - - - - - - - - - - - - - - - - - - - - - - - + + % possibly plot the trajectory + if n == 2 && Plotf == 1 + PXY = [ x , lastx ]; + line( 'XData' , PXY( 1 , : ) , 'YData' , PXY( 2 , : ) , ... + 'LineStyle' , '-' , 'LineWidth' , 2 , 'Marker' , 'o' , ... + 'Color' , [ 0 0 0 ] ); + end + + x = lastx; + ng = norm( lastg ); + + % iterate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if Interactive + pause; + end +end + +% end of main loop- - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% inner functions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ phi , varargout ] = f2phi( alpha ) +% +% computes and returns the value of the tomography at alpha +% +% phi( alpha ) = f( x + alpha * d ) +% +% if Plotf > 2 saves the data in gap() for plotting +% +% if the second output parameter is required, put there the derivative +% of the tomography in alpha +% +% phi'( alpha ) = < \nabla f( x + alpha * d ) , d > +% +% saves the point in lastx, the gradient in lastg, the Hessian in lasth, +% and increases feval + + lastx = x + alpha * d; + [ phi , lastg , lastH ] = f( lastx ); + + if Plotf > 2 + if fStar > - Inf + gap( end + 1 ) = ( phi - fStar ) / max( [ abs( fStar ) 1 ] ); + else + gap( end + 1 ) = phi; + end + end + + if nargout > 1 + varargout{ 1 } = d' * lastg; + end + + feval = feval + 1; +end + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ a , phia ] = ArmijoWolfeLS( phi0 , phip0 , as , m1 , m2 , tau ) + +% performs an Armijo-Wolfe Line Search. +% +% phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0 +% +% as > 0 is the first value to be tested: if phi'( as ) < 0 then as is +% divided by tau < 1 (hence it is increased) until this does not happen +% any longer +% +% m1 and m2 are the standard Armijo-Wolfe parameters; note that the strong +% Wolfe condition is used +% +% returns the optimal step and the optimal f-value + +lsiter = 1; % count iterations of first phase +while feval <= MaxFeval + [ phia , phips ] = f2phi( as ); + + if ( phia <= phi0 + m1 * as * phip0 ) && ( abs( phips ) <= - m2 * phip0 ) + fprintf( ' %2d' , lsiter ); + a = as; + return; % Armijo + strong Wolfe satisfied, we are done + + end + if phips >= 0 + break; + end + as = as / tau; + lsiter = lsiter + 1; +end + +fprintf( ' %2d ' , lsiter ); +lsiter = 1; % count iterations of second phase + +am = 0; +a = as; +phipm = phip0; +while ( feval <= MaxFeval ) && ( ( as - am ) ) > mina && ( phips > 1e-12 ) + + % compute the new value by safeguarded quadratic interpolation + a = ( am * phips - as * phipm ) / ( phips - phipm ); + a = max( [ am + ( as - am ) * sfgrd ... + min( [ as - ( as - am ) * sfgrd a ] ) ] ); + + % compute phi( a ) + [ phia , phip ] = f2phi( a ); + + if ( phia <= phi0 + m1 * a * phip0 ) && ( abs( phip ) <= - m2 * phip0 ) + break; % Armijo + strong Wolfe satisfied, we are done + end + + % restrict the interval based on sign of the derivative in a + if phip < 0 + am = a; + phipm = phip; + else + as = a; + if as <= mina + break; + end + phips = phip; + end + lsiter = lsiter + 1; +end + +fprintf( '%2d' , lsiter ); + +end + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ as , phia ] = BacktrackingLS( phi0 , phip0 , as , m1 , tau ) + +% performs a Backtracking Line Search. +% +% phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0 +% +% as > 0 is the first value to be tested, which is decreased by +% multiplying it by tau < 1 until the Armijo condition with parameter +% m1 is satisfied +% +% returns the optimal step and the optimal f-value + +lsiter = 1; % count ls iterations +while feval <= MaxFeval && as > mina + [ phia , ~ ] = f2phi( as ); + if phia <= phi0 + m1 * as * phip0 % Armijo satisfied + break; % we are done + end + as = as * tau; + lsiter = lsiter + 1; +end + +fprintf( ' %2d' , lsiter ); + +end + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +end % the end- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/11-09/SDG.jl b/11-09/SDG.jl new file mode 100644 index 0000000..6b38e7a --- /dev/null +++ b/11-09/SDG.jl @@ -0,0 +1,423 @@ +using LinearAlgebra, Printf, Plots + +function SDG(f; + x::Union{Nothing, Vector}=nothing, + astart::Real=1, + eps::Real=1e-6, + MaxFeval::Integer=1000, + m1::Real=1e-3, + m2::Real=0.9, + tau::Real=0.9, + sfgrd::Real=0.01, + MInf::Real=-Inf, + mina::Real=1e-16, + plt::Union{Plots.Plot, Nothing}=nothing, + plotatend::Bool=true, + Plotf::Integer=0, + printing::Bool=true)::Tuple{AbstractArray, String} + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # local functions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + function f2phi(alpha, derivate=false) + lastx = x .- alpha .* g + (phi, lastg, _) = f(lastx) + + if (Plotf > 2) + if fStar > -Inf + push!(gap, (phi - fStar) / max(abs(fStar), 1)) + else + push!(gap, phi) + end + end + feval += 1 + + if derivate + return phi, dot(-g, lastg) + end + return phi, nothing + end + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + function ArmijoWolfeLS(phi0, phip0, as, m1, m2, tau) + # performs an Armijo-Wolfe Line Search. + # + # Inputs: + # + # - phi0 = phi( 0 ) + # + # - phip0 = phi'( 0 ) (< 0) + # + # - as (> 0) is the first value to be tested: if the Armijo condition + # + # phi( as ) <= phi0 + m1 * as * phip0 + # + # is satisfied but the Wolfe condition is not, which means that the + # derivative in as is still negative, which means that longer steps + # might be possible), then as is divided by tau < 1 (hence it is + # increased) until this does not happen any longer + # + # - m1 (> 0 and < 1, typically small, like 0.01) is the parameter of + # the Armijo condition + # + # - m2 (> m1 > 0, typically large, like 0.9) is the parameter of the + # Wolfe condition + # + # - tau (> 0 and < 1) is the increasing coefficient for the first phase + # (extrapolation) + # + # Outputs: + # + # - a is the "optimal" step + # + # - phia = phi( a ) (the "optimal" f-value) + + lsiter = 1 # count iterations of first phase + local phips, phia + while feval ≤ MaxFeval + (phia, phips) = f2phi(as, true) # compute phi( a ) and phi'( a ) + + if phia > phi0 + m1 * as * phip0 # Armijo not satisfied + break + end + + if phips ≥ m2 * phip0 # Wolfe satisfied + if printing + @printf("%2d ", lsiter) + end + a = as + return (a, phia) # Armijo + Wolfe satisfied, done + end + if phips ≥ 0 # derivative is positive, break + break + end + as = as / tau + lsiter += 1 + end + + if printing + @printf("%2d ", lsiter) + end + lsiter = 1 # count iterations of second phase + + am = 0 + a = as + phipm = phip0 + while (feval ≤ MaxFeval) && ((as - am) > abs(mina)) && (abs(phips) > 1e-12) + + if (phipm < 0) && (phips > 0) + # if the derivative in as is positive and that in am is negative, + # then compute the new step by safeguarded quadratic interpolation + a = (am * phips - as * phipm) / (phips - phipm) + a = max(am + ( as - am ) * sfgrd, min(as - ( as - am ) * sfgrd, a)) + else + a = (as - am) / 2 # else just use dumb binary search + end + + phia, phipa = f2phi(a, true) # compute phi( a ) and phi'( a ) + + if phia ≤ phi0 + m1 * as * phip0 # Armijo satisfied + if phipa ≥ m2 * phip0 # Wolfe satisfied + break # Armijo + Wolfe satisfied, done + end + + am = a # Armijo is satisfied but Wolfe is not, i.e., the + phipm = phipa # derivative is still negative: move the left + # endpoint of the interval to a + else # Armijo not satisfied + as = a # move the right endpoint of the interval to a + phips = phipa + end + + lsiter += 1 + end + + if printing + @printf("%2d", lsiter) + end + + return (a, phia) + end + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + function BacktrackingLS(phi0, phip0, as, m1, tau) + # performs a Backtracking Line Search. + # + # phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0 + # + # as > 0 is the first value to be tested, which is decreased by + # multiplying it by tau < 1 until the Armijo condition with parameter + # m1 is satisfied + # + # returns the optimal step and the optimal f-value + + local phia + + lsiter = 1 # count ls iterations + while feval ≤ MaxFeval && as > mina + (phia, _) = f2phi(as) + if phia ≤ phi0 + m1 * as * phip0 # Armijo satisfied + break # we are done + end + as = as * tau + lsiter += 1 + end + + if printing + @printf("\t%2d", lsiter) + end + return (as, phia) + end + + # Plotf = 1 + # 0 = nothing is plotted + # 1 = the level sets of f and the trajectory are plotted (when n = 2) + # 2 = the function value / gap are plotted, iteration-wise + # 3 = the function value / gap are plotted, function-evaluation-wise + Interactive = false + + local gap + PXY = Matrix{Real}(undef, 2, 0) + + status = "error" + + if Plotf > 1 + if Plotf == 2 + MaxIter = 200 # expected number of iterations for the gap plot + else + MaxIter = 1000 # expected number of iterations for the gap plot + end + gap = [] + end + + if x == nothing + (fStar, x, _) = f(nothing) + else + (fStar, _, _) = f(nothing) + end + + n = size(x, 1) + + if astart == 0 + throw(ArgumentError("astart must be ≠ 0")) + end + + if m1 ≤ 0 || m1 ≥ 1 + throw(ArgumentError("m1: ($m1) is not in (0, 1)")) + end + + AWLS = (m2 > 0 && m2 < 1) + + if tau ≤ 0 || tau ≥ 1 + throw(ArgumentError("tau: ($tau) is not in (0, 1)")) + end + + if sfgrd ≤ 0 || sfgrd ≥ 1 + throw(ArgumentError("sfgrd: ($sfgrd) is not in (0, 1)")) + end + + if mina < 0 + throw(ArgumentError("mina: ($mina) must be ≥ 0")) + end + + if Plotf > 1 && plt == nothing + plt = plot(xlims=(0, MaxIter)) + elseif plt == nothing + plt = plot() + end + + # "global" variables- - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + lastx = zeros(n) # last point visited in the line search + lastg = zeros(n) # gradient of lastx + feval = 1 # f() evaluations count ("common" with LSs) + + # initializations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if printing + println("Gradient method") + end + if fStar > -Inf + if printing + print("feval\trel gap\t\t|| g(x) ||\trate\t") + end + prevv = Inf + else + if printing + print("feval\tf(x)\t\t\t|| g(x) ||") + end + end + if astart > 0 + if printing + print("\tls feval\ta*") + end + end + if printing + print("\n\n") + end + + # compute first f-value and gradient in x^0 - - - - - - - - - - - - - - - - + + g = zeros(2, 1) + v, _ = f2phi(0) + g = lastg + + # compute norm of the (first) gradient- - - - - - - - - - - - - - - - - - - + + ng = norm(g) + if eps < 0 + ng0 = -ng # norm of first subgradient: why is there a "-"? ;-) + else + ng0 = 1 # un-scaled stopping criterion + end + + # main loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + while true + # output statistics & plot gap/f-values - - - - - - - - - - - - - - - - + + if fStar > -Inf + gapk = (v .- fStar) / max(abs(fStar), 1) + + if printing + @printf("%4d\t%1.4e\t%1.4e", feval, gapk, ng) + end + if prevv < Inf + if printing + @printf("\t%1.4e", (v .- fStar) / (prevv - fStar)) + end + else + if printing + print(" \t ") + end + end + prevv = v + + if Plotf > 1 + if Plotf ≥ 2 + push!(gap, gapk) + end + plot!(plt, yscale=:log) + if Plotf == 2 + plot!(plt, ylims=(1e-15, 1e+1)) + else + plot!(plt, ylims=(1e-15, 1e+4)) + end + end + else + if printing + @printf("%4d\t%1.8e\t\t%1.4e", feval, v, ng) + end + + if Plotf ≥ 2 + push!(gap, v) + end + end + + # stopping criteria - - - - - - - - - - - - - - - - - - - - - - - - - - + + if ng ≤ (eps * ng0) + status = "optimal" + if printing + print("\n") + end + break + end + + if feval > MaxFeval + status = "stopped" + if printing + print("\n") + end + break + end + + # compute step size - - - - - - - - - - - - - - - - - - - - - - - - - - + + phip0 = -ng * ng + + if astart < 0 + # fixed-step approach + lastx = x .+ astart .* g + (v, lastg, _) = f(lastx) + feval = feval + 1 + else + # line-search approach, either Armijo-Wolfe or Backtracking + + if AWLS + a, v = ArmijoWolfeLS(v, phip0, astart, m1, m2, tau) + else + a, v = BacktrackingLS(v, phip0, astart, m1, tau) + end + end + + # output statistics - - - - - - - - - - - - - - - - - - - - - - - - - - + + if astart > 0 + if printing + @printf("\t%1.4e\n", a) + end + + if a ≤ mina + status = "error" + if printing + print("\n") + end + break + end + else + if printing + print("\n") + end + end + + if v ≤ MInf + status = "unbounded" + if printing + print("\n") + end + break + end + + # compute new point - - - - - - - - - - - - - - - - - - - - - - - - - - + + # possibly plot the trajectory + if n == 2 && Plotf == 1 + PXY = hcat(PXY, hcat(x, lastx)) + end + + x = lastx + + # update gradient - - - - - - - - - - - - - - - - - - - - - - - - - - - + + g = lastg + ng = norm(g) + + # iterate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if Interactive + readline() + end + end + + if plotatend + if Plotf ≥ 2 + plot!(plt, gap) + elseif Plotf == 1 && n == 2 + plot!(plt, PXY[1, :], PXY[2, :]) + end + display(plt) + end + + # end of main loop- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + return (x, status) +end diff --git a/11-09/SDG.m b/11-09/SDG.m new file mode 100644 index 0000000..8e1d836 --- /dev/null +++ b/11-09/SDG.m @@ -0,0 +1,602 @@ +function [ x , status ] = SDG( f , varargin ) + +%function [ x , status ] = SDG( f , x , astart , eps , MaxFeval , m1 , ... +% m2 , tau , sfgrd , MInf , mina ) +% +% Apply the classical Steepest Descent algorithm for the minimization of +% the provided function f, which must have the following interface: +% +% [ v , g ] = f( x ) +% +% Input: +% +% - x is either a [ n x 1 ] real (column) vector denoting the input of +% f(), or [] (empty). +% +% Output: +% +% - v (real, scalar): if x == [] this is the best known lower bound on +% the unconstrained global optimum of f(); it can be -Inf if either f() +% is not bounded below, or no such information is available. If x ~= [] +% then v = f( x ). +% +% - g (real, [ n x 1 ] real vector): this also depends on x. if x == [] +% this is the standard starting point from which the algorithm should +% start, otherwise it is the gradient of f() at x (or a subgradient if +% f() is not differentiable at x, which it should not be if you are +% applying the gradient method to it). +% +% The other [optional] input parameters are: +% +% - x (either [ n x 1 ] real vector or [], default []): starting point. +% If x == [], the default starting point provided by f() is used. +% +% - astart (real scalar, optional, default value 1): if it is > 0, then it +% is used as the starting value of alpha in the line search, be it the +% Armijo-Wolfe or the Backtracking one. Otherwise, it is taken to mean +% that no line search is to be performed, i.e., a fixed step approach +% has to be used with step = - astart (hence, astart == 0 is an invald +% setting in either case). +% +% - eps (real scalar, optional, default value 1e-6): the accuracy in the +% stopping criterion: the algorithm is stopped when the norm of the +% gradient is less than or equal to eps. If a negative value is provided, +% this is used in a *relative* stopping criterion: the algorithm is +% stopped when the norm of the gradient is less than or equal to +% (- eps) * || norm of the first gradient ||. +% +% - MaxFeval (integer scalar, optional, default value 1000): the maximum +% number of function evaluations (hence, iterations will be not more than +% MaxFeval because at each iteration at least a function evaluation is +% performed, possibly more due to the line search). +% +% - m1 (real scalar, optional, must be in ( 0 , 1 ), default value 1e-3): +% parameter of the Armijo condition (sufficient decrease) in the line +% search +% +% - m2 (real scalar, optional, default value 0.9): typically the parameter +% of the Wolfe condition (sufficient derivative increase) in the line +% search. It should to be in ( 0 , 1 ); if not, it is taken to mean that +% the simpler Backtracking line search should be used instead +% +% - tau (real scalar, optional, default value 0.9): scaling parameter for +% the line search. In the Armijo-Wolfe line search it is used in the +% first phase to identify a point where the Armijo condition is not +% satisfied or the derivative is positive by divding the current +% value (starting with astart, see above) by tau (which is < 1, hence it +% is increased). In the Backtracking line search, each time the step is +% multiplied by tau (hence it is decreased). +% +% - sfgrd (real scalar, optional, default value 0.01): safeguard parameter +% for the line search. to avoid numerical problems that can occur with +% the quadratic interpolation if the derivative at one endpoint is too +% large w.r.t. the one at the other (which leads to choosing a point +% extremely near to the other endpoint), a *safeguarded* version of +% interpolation is used whereby the new point is chosen in the interval +% [ as * ( 1 + sfgrd ) , am * ( 1 - sfgrd ) ], being [ as , am ] the +% current interval, whatever quadratic interpolation says. If you +% experiemce problems with the line search taking too many iterations to +% converge at "nasty" points, try to increase this +% +% - MInf (real scalar, optional, default value -Inf): if the algorithm +% determines a value for f() <= MInf this is taken as an indication that +% the problem is unbounded below and computation is stopped +% (a "finite -Inf"). +% +% - mina (real scalar, optional, default value 1e-16): if the algorithm +% determines a stepsize value <= mina, this is taken as an indication +% that something has gone wrong (the gradient is not a direction of +% descent, so maybe the function is not differentiable) and computation +% is stopped. It is legal to take mina = 0, thereby in fact skipping this +% test. +% +% Output: +% +% - x ([ n x 1 ] real column vector): the best solution found so far +% +% - status (string): a string describing the status of the algorithm at +% termination +% +% = 'optimal': the algorithm terminated having proven that x is a(n +% approximately) optimal solution, i.e., the norm of the gradient at x +% is less than the required threshold +% +% = 'unbounded': the algorithm has determined an extrenely large negative +% value for f() that is taken as an indication that the problem is +% unbounded below (a "finite -Inf", see MInf above) +% +% = 'stopped': the algorithm terminated having exhausted the maximum +% number of iterations: x is the bast solution found so far, but not +% necessarily the optimal one +% +% = 'error': the algorithm found a numerical error that prevents it from +% continuing optimization (see mina above) +% +%{ + ======================================= + Author: Antonio Frangioni + Date: 27-04-23 + Version 1.30 + Copyright Antonio Frangioni + ======================================= +%} + +Plotf = 1; +% 0 = nothing is plotted +% 1 = the level sets of f and the trajectory are plotted (when n = 2) +% 2 = the function value / gap are plotted, iteration-wise +% 3 = the function value / gap are plotted, function-evaluation-wise + +Interactive = true; % if we pause at every iteration + +if Plotf > 1 + if Plotf == 2 + MaxIter = 200; % expected number of iterations for the gap plot + else + MaxIter = 1000; % expected number of iterations for the gap plot + end + gap = []; +end + +% reading and checking input- - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +if ~ isa( f , 'function_handle' ) + error( 'f not a function' ); +end + +if isempty( varargin ) || isempty( varargin{ 1 } ) + [ fStar , x ] = f( [] ); +else + x = varargin{ 1 }; + if ~ isreal( x ) + error( 'x not a real vector' ); + end + + if size( x , 2 ) ~= 1 + error( 'x is not a (column) vector' ); + end + + fStar = f( [] ); +end + +n = size( x , 1 ); + +if length( varargin ) > 1 + astart = varargin{ 2 }; + if ~ isscalar( astart ) + error( 'astart is not a real scalar' ); + end + if astart == 0 + error( 'astart must be != 0' ); + end +else + astart = 1; +end + +if length( varargin ) > 2 + eps = varargin{ 3 }; + if ~ isreal( eps ) || ~ isscalar( eps ) + error( 'eps is not a real scalar' ); + end +else + eps = 1e-6; +end + +if length( varargin ) > 3 + MaxFeval = round( varargin{ 4 } ); + if ~ isscalar( MaxFeval ) + error( 'MaxFeval is not an integer scalar' ); + end +else + MaxFeval = 1000; +end + +if length( varargin ) > 4 + m1 = varargin{ 5 }; + if ~ isscalar( m1 ) + error( 'm1 is not a real scalar' ); + end + if m1 <= 0 || m1 >= 1 + error( 'm1 is not in ( 0 , 1 )' ); + end +else + m1 = 1e-3; +end + +if length( varargin ) > 5 + m2 = varargin{ 6 }; + if ~ isscalar( m1 ) + error( 'm2 is not a real scalar' ); + end +else + m2 = 0.9; +end + +AWLS = ( m2 > 0 && m2 < 1 ); + +if length( varargin ) > 6 + tau = varargin{ 7 }; + if ~ isscalar( tau ) + error( 'tau is not a real scalar' ); + end + if tau <= 0 || tau >= 1 + error( 'tau is not in ( 0 , 1 )' ); + end +else + tau = 0.9; +end + +if length( varargin ) > 7 + sfgrd = varargin{ 8 }; + if ~ isscalar( sfgrd ) + error( 'sfgrd is not a real scalar' ); + end + if sfgrd <= 0 || sfgrd >= 1 + error( 'sfgrd is not in ( 0 , 1 )' ); + end +else + sfgrd = 0.01; +end + +if length( varargin ) > 8 + MInf = varargin{ 9 }; + if ~ isscalar( MInf ) + error( 'MInf is not a real scalar' ); + end +else + MInf = - Inf; +end + +if length( varargin ) > 9 + mina = varargin{ 10 }; + if ~ isscalar( mina ) + error( 'mina is not a real scalar' ); + end + if mina < 0 + error( 'mina is < 0' ); + end +else + mina = 1e-16; +end + +if Plotf > 1 + xlim( [ 0 MaxIter ] ); + ax = gca; + ax.FontSize = 16; + ax.Position = [ 0.03 0.07 0.95 0.92 ]; + ax.Toolbar.Visible = 'off'; +end + +% "global" variables- - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +lastx = zeros( n , 1 ); % last point visited in the line search +lastg = zeros( n , 1 ); % gradient of lastx +feval = 1; % f() evaluations count ("common" with LSs) + +% initializations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +fprintf( 'Gradient method\n'); +if fStar > - Inf + fprintf( 'feval\trel gap\t\t|| g(x) ||\trate\t'); + prevv = Inf; +else + fprintf( 'feval\tf(x)\t\t\t|| g(x) ||'); +end +if astart > 0 + fprintf( '\tls feval\ta*' ); +end +fprintf( '\n\n' ); + +% compute first f-value and gradient in x^0 - - - - - - - - - - - - - - - - + +g = 0; +v = f2phi( 0 ); +g = lastg; + +% compute norm of the (first) gradient- - - - - - - - - - - - - - - - - - - + +ng = norm( g ); +if eps < 0 + ng0 = - ng; % norm of first subgradient: why is there a "-"? ;-) +else + ng0 = 1; % un-scaled stopping criterion +end + +% main loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +while true + + % output statistics & plot gap/f-values - - - - - - - - - - - - - - - - + + if fStar > - Inf + gapk = ( v - fStar ) / max( [ abs( fStar ) 1 ] ); + + fprintf( '%4d\t%1.4e\t%1.4e' , feval , gapk , ng ); + if prevv < Inf + fprintf( '\t%1.4e' , ( v - fStar ) / ( prevv - fStar ) ); + else + fprintf( ' \t ' ); + end + prevv = v; + + if Plotf > 1 + if Plotf >= 2 + gap( end + 1 ) = gapk; + end + semilogy( gap , 'Color' , 'k' , 'LineWidth' , 2 ); + if Plotf == 2 + ylim( [ 1e-15 1e+1 ] ); + else + ylim( [ 1e-15 1e+4 ] ); + end + %drawnow; + end + else + fprintf( '%4d\t%1.8e\t\t%1.4e' , feval , v , ng ); + + if Plotf > 1 + if Plotf >= 2 + gap( end + 1 ) = v; + end + plot( gap , 'Color' , 'k' , 'LineWidth' , 2 ); + %drawnow; + end + end + + % stopping criteria - - - - - - - - - - - - - - - - - - - - - - - - - - + + if ng <= eps * ng0 + status = 'optimal'; + fprintf( '\n' ); + break; + end + + if feval > MaxFeval + status = 'stopped'; + fprintf( '\n' ); + break; + end + + % compute step size - - - - - - - - - - - - - - - - - - - - - - - - - - + + phip0 = - ng * ng; + + if astart < 0 + % fixed-step approach + + lastx = x + astart * g; + [ v , lastg ] = f( lastx ); + feval = feval + 1; + else + % line-search approach, either Armijo-Wolfe or Backtracking + + if AWLS + [ a , v ] = ArmijoWolfeLS( v , phip0 , astart , m1 , m2 , tau ); + else + [ a , v ] = BacktrackingLS( v , phip0 , astart , m1 , tau ); + end + end + + % output statistics - - - - - - - - - - - - - - - - - - - - - - - - - - + + if astart > 0 + fprintf( '\t%1.4e\n' , a ); + + if a <= mina + status = 'error'; + fprintf( '\n' ); + break; + end + else + fprintf( '\n' ); + end + + + if v <= MInf + status = 'unbounded'; + fprintf( '\n' ); + break; + end + + % compute new point - - - - - - - - - - - - - - - - - - - - - - - - - - + + % possibly plot the trajectory + if n == 2 && Plotf == 1 + PXY = [ x , lastx ]; + line( 'XData' , PXY( 1 , : ) , 'YData' , PXY( 2 , : ) , ... + 'LineStyle' , '-' , 'LineWidth' , 2 , 'Marker' , 'o' , ... + 'Color' , [ 0 0 0 ] ); + end + + x = lastx; + + % update gradient - - - - - - - - - - - - - - - - - - - - - - - - - - - + + g = lastg; + ng = norm( g ); + + % iterate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + if Interactive + pause; + end +end + +% end of main loop- - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% inner functions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ phi , varargout ] = f2phi( alpha ) +% +% computes and returns the value of the tomography at alpha +% +% phi( alpha ) = f( x - alpha * g ) +% +% if Plotf > 2 saves the data in gap() for plotting +% +% if the second output parameter is required, put there the derivative +% of the tomography in alpha +% +% phi'( alpha ) = < \nabla f( x - alpha * g ) , - g > +% +% saves the point in lastx, the gradient in lastg and increases feval + + lastx = x - alpha * g; + [ phi , lastg ] = f( lastx ); + + if Plotf > 2 + if fStar > - Inf + gap( end + 1 ) = ( phi - fStar ) / max( [ abs( fStar ) 1 ] ); + else + gap( end + 1 ) = phi; + end + end + + if nargout > 1 + varargout{ 1 } = - g' * lastg; + end + + feval = feval + 1; +end + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ a , phia ] = ArmijoWolfeLS( phi0 , phip0 , as , m1 , m2 , tau ) + +% performs an Armijo-Wolfe Line Search. +% +% Inputs: +% +% - phi0 = phi( 0 ) +% +% - phip0 = phi'( 0 ) (< 0) +% +% - as (> 0) is the first value to be tested: if the Armijo condition +% +% phi( as ) <= phi0 + m1 * as * phip0 +% +% is satisfied but the Wolfe condition is not, which means that the +% derivative in as is still negative, which means that longer steps +% might be possible), then as is divided by tau < 1 (hence it is +% increased) until this does not happen any longer +% +% - m1 (> 0 and < 1, typically small, like 0.01) is the parameter of +% the Armijo condition +% +% - m2 (> m1 > 0, typically large, like 0.9) is the parameter of the +% Wolfe condition +% +% - tau (> 0 and < 1) is the increasing coefficient for the first phase +% (extrapolation) +% +% Outputs: +% +% - a is the "optimal" step +% +% - phia = phi( a ) (the "optimal" f-value) + +lsiter = 1; % count iterations of first phase +while feval <= MaxFeval + [ phia , phips ] = f2phi( as ); % compute phi( a ) and phi'( a ) + + if phia > phi0 + m1 * as * phip0 % Armijo not satisfied + break; + end + + if phips >= m2 * phip0 % Wolfe satisfied + fprintf( ' %2d ' , lsiter ); + a = as; + return; % Armijo + Wolfe satisfied, done + end + if phips >= 0 % derivative is positive, break + break; + end + as = as / tau; + lsiter = lsiter + 1; +end + +fprintf( ' %2d ' , lsiter ); +lsiter = 1; % count iterations of second phase + +am = 0; +a = as; +phipm = phip0; +while ( feval <= MaxFeval ) && ( ( as - am ) ) > abs( mina ) && ... + ( abs( phips ) > 1e-12 ) + + if ( phipm < 0 ) && ( phips > 0 ) + % if the derivative in as is positive and that in am is negative, + % then compute the new step by safeguarded quadratic interpolation + a = ( am * phips - as * phipm ) / ( phips - phipm ); + a = max( [ am + ( as - am ) * sfgrd ... + min( [ as - ( as - am ) * sfgrd a ] ) ] ); + else + a = ( as - am ) / 2; % else just use dumb binary search + end + + [ phia , phipa ] = f2phi( a ); % compute phi( a ) and phi'( a ) + + if phia <= phi0 + m1 * as * phip0 % Armijo satisfied + if phipa >= m2 * phip0 % Wolfe satisfied + break; % Armijo + Wolfe satisfied, done + end + + am = a; % Armijo is satisfied but Wolfe is not, i.e., the + phipm = phipa; % derivative is still negative: move the left + % endpoint of the interval to a + else % Armijo not satisfied + as = a; % move the right endpoint of the interval to a + phips = phipa; + end + + lsiter = lsiter + 1; +end + +fprintf( '%2d' , lsiter ); + +end + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ as , phia ] = BacktrackingLS( phi0 , phip0 , as , m1 , tau ) + +% performs a Backtracking Line Search. +% +% phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0 +% +% as > 0 is the first value to be tested, which is decreased by +% multiplying it by tau < 1 until the Armijo condition with parameter +% m1 is satisfied +% +% returns the optimal step and the optimal f-value + +lsiter = 1; % count ls iterations +while feval <= MaxFeval && as > mina + [ phia , ~ ] = f2phi( as ); + if phia <= phi0 + m1 * as * phip0 % Armijo satisfied + break; % we are done + end + as = as * tau; + lsiter = lsiter + 1; +end + +fprintf( '\t%2d' , lsiter ); + +end + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +end % the end- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/11-09/TestFunctions Matlab/TestFunctions.m b/11-09/TestFunctions Matlab/TestFunctions.m new file mode 100644 index 0000000..2423c94 --- /dev/null +++ b/11-09/TestFunctions Matlab/TestFunctions.m @@ -0,0 +1,415 @@ +function TF = TestFunctions() + +%function TF = TestFunctions() +% +% Produces a cell array of function handlers, useful to test unconstrained +% optimization algorithms. +% +% Each function in the array has the following interface: +% +% [ v , varargout ] = f( x ) +% +% Input: +% +% - x is either a [ n x 1 ] real (column) vector denoting the input of +% f(), or [] (empty). +% +% Output: +% +% - v (real, scalar): if x == [] this is the best known lower bound on +% the unconstrained global optimum of f(); it can be -Inf if either f() +% is not bounded below, or no such information is available. If x ~= [] +% then v = f(x). +% +% - g (real, [ n x 1 ] real vector) is the first optional argument. This +% also depends on x. if x == [] this is the standard starting point of an +% optimization algorithm, otherwise it is the gradient of f() at x, or a +% subgradient if f() is not differentiable at x. +% +% - H (real, [ n x n ] real matrix) is the first optional argument. This +% must only be specified if x ~= [], and it is the Hessian of f() at x. +% If no such information is available, the function throws error. +% +% The current list of functions is the following: +% +% 1 Standard 2x2 PSD quadratic function with nicely conditioned Hessian. +% +% 2 Standard 2x2 PSD quadratic function with less nicely conditioned +% Hessian. +% +% 3 Standard 2x2 PSD quadratic function with Hessian having one zero +% eigenvalue. +% +% 4 Standard 2x2 quadratic function with indefinite Hessian (one positive +% and one negative eigenvalue) +% +% 5 Standard 2x2 quadratic function with "very elongated" Hessian (a +% very small positive minimum eigenvalue, the other much larger) +% +% 6 the 2-dim Rosenbrock function +% +% 7 the "six-hump camel" function +% +% 8 the Ackley function +% +% 9 a 2-dim nondifferentiable function coming from Lasso regularization +% +% 10 a 76-dim (nonconvex, differentiable) function coming from a fitting +% problem with ( X , y ) both [ 288 , 1 ] (i.e., a fitting with only +% one feature) using a "rough" NN with 1 input, 1 output, 3 hidden +% layers of 5 nodes each, and tanh activation function +% +% 11 same as 10 plus a 1e-4 || x ||^2 / 2 ridge stabilising term +% +%{ + ======================================= + Author: Antonio Frangioni + Date: 08-11-18 + Version 1.01 + Copyright Antonio Frangioni + ======================================= +%} + +TF = cell( 10 , 1 ); +TF{ 1 } = @(x) genericquad( [ 6 -2 ; -2 6 ] , [ 10 ; 5 ] , x ); +% eigenvalues: 4, 8 +TF{ 2 } = @(x) genericquad( [ 5 -3 ; -3 5 ] , [ 10 ; 5 ] , x ); +% eigenvalues: 2, 8 +TF{ 3 } = @(x) genericquad( [ 4 -4 ; -4 4 ] , [ 10 ; 5 ] , x ); +% eigenvalues: 0, 8 +TF{ 4 } = @(x) genericquad( [ 3 -5 ; -5 3 ] , [ 10 ; 5 ] , x ); +% eigenvalues: -2, 8 +TF{ 5 } = @(x) genericquad( [ 101 -99 ; -99 101 ] , [ 10 ; 5 ] , x ); +% eigenvalues: 2, 200 +% HBG: alpha = 0.0165 , beta = 0.678 +TF{ 6 } = @rosenbrock; +TF{ 7 } = @sixhumpcamel; +TF{ 8 } = @ackley; +TF{ 9 } = @lasso; +TF{ 10 } = @myNN; +TF{ 11 } = @myNN2; + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = genericquad( Q , q , x ) + % generic quadratic function f(x) = x' * Q * x / 2 + q' * x + +if isempty( x ) % informative call + if min( eig( Q ) ) > 1e-14 + xStar = Q \ -q; + v = 0.5 * xStar' * Q * xStar + q' * xStar; + else + v = - Inf; + end + if nargout > 1 + varargout{ 1 } = [ 0 ; 0 ]; + end +else + if ~ isequal( size( x ) , [ 2 1 ] ) + error( 'genericquad: x is of wrong size' ); + end + v = 0.5 * x' * Q * x + q' * x; % f(x) + if nargout > 1 + varargout{ 1 } = Q * x + q; % \nabla f(x) + if nargout > 2 + varargout{ 2 } = Q; % \nabla^2 f(x) + end + end +end +end % genericquad + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = rosenbrock( x ) +% rosenbrock's valley-shaped function +% syms x y +% f = @(x, y) 100 * ( y - x^2 )^2 + ( x - 1 )^2 +% +% diff( f , x ) +% 2 * x - 400 * x * ( - x^2 + y ) - 2 +% +% diff( f , y ) +% - 200 * x^2 + 200 * y +% +% diff( f , x , 2 ) +% 1200 * x^2 - 400 * y + 2 +% +% diff( f , y , 2 ) +% 200 +% +% diff( f , x , y ) +% -400 * x + +if isempty( x ) % informative call + v = 0; + if nargout > 1 + varargout{ 1 } = [ -1 ; 1 ]; + end +else + v = 100 * ( x( 2 ) - x( 1 )^2 )^2 + ( x( 1 ) - 1 )^2; % f(x) + if nargout > 1 + g = zeros( 2 , 1 ); + g( 1 ) = 2 * x( 1 ) - 400* x( 1 ) * ( x( 2 ) - x( 1 )^2 ) - 2; + g( 2 ) = - 200 * x( 1 )^2 + 200 * x( 2 ); + + varargout{ 1 } = g; % \nabla f(x) + if nargout > 2 + H = zeros( 2 , 2 ); + H( 1 , 1 ) = 1200 * x( 1 )^2 - 400 * x( 2 ) + 2; + H( 2 , 2 ) = 200; + H( 2 , 1 ) = -400 * x( 1 ); + H( 1 , 2 ) = H( 2 , 1 ); + varargout{ 2 } = H; % \nabla^2 f(x) + end + end +end +end % rosenbrock + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = sixhumpcamel( x ) +% six-hump-camel valley-shaped function +% syms x y +% f = @(x, y) ( 4 - 2.1 * x^2 + x^4 / 3 ) * x^2 + x * y + 4 * ( y^2 - 1 ) * +% y^2 +% +% diff( f , x ) +% 2 * x^5 - ( 42 * x^3 ) / 5 + 8 * x + y +% +% diff( f , y ) +% 16 * y^3 - 8 * y + x +% +% diff( f , x , 2 ) +% 10 * x^4 - ( 126 * x^2 ) / 5 + 8 +% +% diff( f , y , 2 ) +% 48 * y^2 - 8 +% +% diff( f , x , y ) +% 1 + +if isempty( x ) % informative call + v = -1.03162845349; + if nargout > 1 + varargout{ 1 } = [ 0 ; 0 ]; + end +else + v = ( 4 - 2.1 * x( 1 )^2 + x( 1 )^4 / 3 ) * x( 1 )^2 + ... + x( 1 ) * x( 2 ) + 4 * ( x( 2 )^2 - 1 ) * x( 2 )^2; % f(x) + if nargout > 1 + g = zeros( 2 , 1 ); + g( 1 ) = 2 * x( 1 )^5 - ( 42 * x( 1 )^3 ) / 5 + 8 * x( 1 ) + x( 2 ); + g( 2 ) = 16 * x( 2 )^3 - 8 * x( 2 ) + x( 1 ); + + varargout{ 1 } = g; % \nabla f(x) + if nargout > 2 + H = zeros( 2 , 2 ); + H( 1 , 1 ) = 10 * x( 1 )^4 - ( 126 * x( 1 )^2 ) / 5 + 8; + H( 2 , 2 ) = 48 * x( 2 )^2 - 8; + H( 2 , 1 ) = 1; + H( 1 , 2 ) = H( 2 , 1 ); + varargout{ 2 } = H; % \nabla^2 f(x) + end + end +end +end % sixhumpcamel + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = ackley( xx ) + +% syms x y +% f = @(x, y) - 20 * exp( - 0.2 * sqrt( ( x^2 + y^2 ) / 2 ) ) ... +% - exp( ( cos( 2 * pi * x ) + cos( 2 * pi * y ) ) / 2 ) ... +% + 20 + exp(1) +% + +ManuallyComputedfGH = 0; + +if isempty( xx ) % informative call + v = 0; + if nargout > 1 + varargout{ 1 } = [ 2 ; 2 ]; + end +else + if ~ isequal( size( xx ) , [ 2 1 ] ) + error( 'ackley: x is of wrong size' ); + end + + if ManuallyComputedfGH + +% diff( f , x ) +% pi*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*x) + +% (2*x*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) +% +% diff( f , y ) +% pi*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*y) + +% (2*y*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) +% +% diff( f , x , 2 ) +% +% (2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) + +% 2*pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*cos(2*pi*x) - +% (x^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(5*(x^2/2 + y^2/2)) - +% (x^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(3/2) - +% pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*x)^2 +% +% diff( f , y , 2 ) +% (2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) + +% 2*pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*cos(2*pi*y) - +% (y^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(5*(x^2/2 + y^2/2)) - +% (y^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(3/2) - +% pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*y)^2 +% +% diff( f , x , y) +% - (x*y*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(5*(x^2/2 + y^2/2)) - +% (x*y*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(3/2) - +% pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*x)*sin(2*pi*y) + + x = xx( 1 ); + y = xx( 2 ); + sqn2 = ( x^2 + y^2 ) / 2; + cosx = cos( 2 * pi * x ); + cosy = cos( 2 * pi * y ); + comp1 = exp( - (sqn2)^(1/2) / 5 ); + comp2 = exp( ( cosx + cosy ) / 2 ); + + v = - 20 * comp1 - comp2 + 20 + exp( 1 ); + + if nargout > 1 + sinx = sin( 2 * pi * x ); + siny = sin( 2 * pi * y ); + + g = zeros( 2 , 1 ); + g( 1 ) = pi * comp2 * sinx + 2 * x * comp1 / (sqn2)^(1/2); + + g( 2 ) = pi * comp2 * siny + 2 * y * comp1 / (sqn2)^(1/2); + + varargout{ 1 } = g; % \nabla f(x) + if nargout > 2 + H = zeros( 2 , 2 ); + + H( 1 , 1 ) = (2*comp1)/(sqn2)^(1/2) + 2*pi^2*comp2*cosx ... + - (x^2*comp1)/(5*sqn2) - (x^2*comp1)/(sqn2)^(3/2)... + - pi^2*comp2*sinx^2; + + H( 2 , 2 ) = (2*comp1)/(sqn2)^(1/2) + 2*pi^2*comp2*cosy ... + - (y^2*comp1)/(5*sqn2) - (y^2*comp1)/(sqn2)^(3/2)... + - pi^2*comp2*siny^2; + + H( 1 , 2 ) = - (x*y*comp1)/(5*(sqn2)) ... + - (x*y*comp1)/(sqn2)^(3/2) ... + - pi^2*comp2*sinx*siny; + + H( 2 , 1 ) = H( 1 , 2 ); + varargout{ 2 } = H; % \nabla^2 f(x) + end + end + else + if nargout > 2 + [ H , g , v ] = ackley_Hes( xx ); + varargout{ 2 } = H; + varargout{ 1 } = g'; + elseif nargout > 1 + [ g , v ] = ackley_Grd( xx ); + varargout{ 1 } = g'; + else + v = - 20 * exp( - ( ( xx( 1 )^2 + xx( 2 )^2 ) / 2 )^(1/2) / 5 )... + - exp( cos( 2 * pi * xx( 1 ) ) / 2 + ... + cos( 2 * pi * xx( 2 ) ) / 2 ) + 20 + exp( 1 ); + end + end +end +end % ackley + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = lasso( x ) +% nondifferentiable lasso example: +% +% f( x , y ) = || 3 * x + 2 * y - 2 ||_2^2 + 10 ( | x | + | y | ) + +if isempty( x ) % informative call + v = ( 2 - 1/3 )^2 + 10/9; % optimal solution [ 1/9 , 0 ] + if nargout > 1 + varargout{ 1 } = [ 0 ; 0 ]; + end +else + v = ( 3 * x( 1 ) + 2 * x( 2 ) - 2 )^2 + ... + 10 * ( abs( x( 1 ) ) + abs( x( 2 ) ) ); % f(x) + if nargout > 1 + g = zeros( 2 , 1 ); + g( 1 ) = 18 * x( 1 ) + 12 * x( 2 ) - 12 + 10 * sign( x( 1 ) ); + g( 2 ) = 12 * x( 1 ) + 8 * x( 2 ) - 8 + 10 * sign( x( 2 ) ); + + varargout{ 1 } = g; % \nabla f(x) + if nargout > 2 + error( 'lasso: Hessian not available' ); + end + end +end +end % lasso + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = myNN( x ) +% 1 x 5 x 5 x 5 x 1 = 76 w NN for solving a 1D fitting problem + +if isempty( x ) % informative call + v = - Inf; % optimal value unknown (although 0 may perhaps be good) + if nargout > 1 + % Xavier initialization: uniform random in [ - A , A ] with + % A = \sqrt{6} / \sqrt{n + m}, with n and m the input and output + % layers. in our case n + m is either 6 or 10, so we take A = 1 + % + % note that starting point is random, so each run will be different + % (unless an explicit starting point is provided); if stability is + % neeed, the seed of the generator has to be set externally + varargout{ 1 } = 2 * rand( 76 , 1 ) - 1; + end +else + v = testNN( x ); % f(x) + if nargout > 1 + varargout{ 1 } = testNN_Jac( x )'; % \nabla f( x ) + if nargout > 2 + varargout{ 2 } = testNN_Hes( x )'; % \nabla^2 f( x ) + end + end +end +end % myNN + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [ v , varargout ] = myNN2( x ) +% 1 x 5 x 5 x 5 x 1 = 76 w NN for solving a 1D fitting problem +% plus ridge stabilization \lambda || x ||^2 / 2 + +lambda = 1e+2; + +if isempty( x ) % informative call + v = - Inf; % optimal value unknown (although 0 may perhaps be good) + if nargout > 1 + % Xavier initialization: uniform random in [ - A , A ] with + % A = \sqrt{6} / \sqrt{n + m}, with n and m the input and output + % layers. in our case n + m is either 6 or 10, so we take A = 1 + % + % note that starting point is random, so each run will be different + % (unless an explicit starting point is provided); if stability is + % neeed, the seed of the generator has to be set externally + varargout{ 1 } = 2 * rand( 76 , 1 ) - 1; + end +else + v = testNN( x ) + lambda * x' * x / 2; % f(x) + if nargout > 1 + varargout{ 1 } = testNN_Jac( x )' + lambda * x; % \nabla f( x ) + if nargout > 2 + varargout{ 2 } = testNN_Hes( x )' + lambda * eye( 76 ); + % \nabla^2 f( x ) + end + end +end +end % myNN2 + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/roughNN.m b/11-09/TestFunctions Matlab/roughNN.m new file mode 100644 index 0000000..a7c0ac1 --- /dev/null +++ b/11-09/TestFunctions Matlab/roughNN.m @@ -0,0 +1,42 @@ +function v = roughNN( w , x ) +% +% v = roughNN( w , x ) +% +% returns the falue of the function v = f( x ) as currently estimated by +% a small NN with 1 input, 1 output, 3 hidden layers of 5 nodes each, and +% tanh activation function. +% +% Input: +% +% - w is the [ 76 x 1 ] real vector containing the weights of the NN, +% i.e., w is made as follows: +% [ 1 .. 5 ] are the [ 5 x 1 ] weigths of the first layer +% [ 6 .. 10 ] are the [ 5 x 1 ] biases of the first layer +% [ 11 .. 35 ] are the [ 5 x 5 ] weigths of the second layer +% [ 36 .. 40 ] are the [ 5 x 1 ] biases of the second layer +% [ 41 .. 65 ] are the [ 5 x 5 ] weigths of the third layer +% [ 66 .. 70 ] are the [ 5 x 1 ] biases of the third layer +% [ 71 .. 75 ] are the [ 5 x 1 ] weigths of the fourth (output) layer +% [ 76 ] is the [ 1 x 1 ] bias of the fourth (output) layer +% +% - x is the real scalar containing the input of f() +% +% Output: +% +% - v (real, scalar): v = f( x ) as estimated by the NN with weights w +% +%{ +% ======================================= +% Author: Antonio Frangioni +% Date: 28-08-22 +% Version 1.00 +% Copyright Antonio Frangioni +% ======================================= +%} + +g = tanh( ( ones( 5 , 1 ) * x ) .* w( 1 : 5 ) + w( 6 : 10 ) ); +g = tanh( reshape( w( 11 : 35 ) , [ 5 5 ] ) * g + w( 36 : 40 ) ); +g = tanh( reshape( w( 41 : 65 ) , [ 5 5 ] ) * g + w( 66 : 70 ) ); +v = g' * w( 71 : 75 ) + w( 76 ); + +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN.m b/11-09/TestFunctions Matlab/testNN.m new file mode 100644 index 0000000..45e4e42 --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN.m @@ -0,0 +1,627 @@ +function v = testNN( w ) +% +% v = testNN( w ) +% +% returns the falue of the empirical error of the NN (or, in fact, +% whatever function is encoded in 'roughNN()') with the weights contained +% in w. +% +% The empirical error is estimated over a 288-strong input/output pair +% ( X , y ), with X containing only one feature, that is hard-coded into +% the function so that its gradient can be easily computed by ADiGator. +% +% Input: +% +% - w is the real vector containing the weights of the NN, see roughNN +% for details +% +% Output: +% +% - the MSE of the error done by roughNN() on the given test set +% +%{ +% ======================================= +% Author: Antonio Frangioni +% Date: 28-08-22 +% Version 1.00 +% Copyright Antonio Frangioni +% ======================================= +%} + +N = 288; % size + +% inputs +X = [ +0.0000000000000000 +0.0034843205574913 +0.0069686411149826 +0.0104529616724739 +0.0139372822299652 +0.0174216027874564 +0.0209059233449477 +0.0243902439024390 +0.0278745644599303 +0.0313588850174216 +0.0348432055749129 +0.0383275261324042 +0.0418118466898955 +0.0452961672473868 +0.0487804878048781 +0.0522648083623693 +0.0557491289198606 +0.0592334494773519 +0.0627177700348432 +0.0662020905923345 +0.0696864111498258 +0.0731707317073171 +0.0766550522648084 +0.0801393728222996 +0.0836236933797909 +0.0871080139372822 +0.0905923344947735 +0.0940766550522648 +0.0975609756097561 +0.1010452961672474 +0.1045296167247387 +0.1080139372822300 +0.1114982578397213 +0.1149825783972125 +0.1184668989547038 +0.1219512195121951 +0.1254355400696864 +0.1289198606271777 +0.1324041811846690 +0.1358885017421603 +0.1393728222996516 +0.1428571428571428 +0.1463414634146341 +0.1498257839721254 +0.1533101045296167 +0.1567944250871080 +0.1602787456445993 +0.1637630662020906 +0.1672473867595819 +0.1707317073170732 +0.1742160278745645 +0.1777003484320558 +0.1811846689895470 +0.1846689895470383 +0.1881533101045296 +0.1916376306620209 +0.1951219512195122 +0.1986062717770035 +0.2020905923344948 +0.2055749128919861 +0.2090592334494774 +0.2125435540069686 +0.2160278745644599 +0.2195121951219512 +0.2229965156794425 +0.2264808362369338 +0.2299651567944251 +0.2334494773519164 +0.2369337979094077 +0.2404181184668990 +0.2439024390243902 +0.2473867595818815 +0.2508710801393728 +0.2543554006968641 +0.2578397212543554 +0.2613240418118467 +0.2648083623693380 +0.2682926829268293 +0.2717770034843205 +0.2752613240418119 +0.2787456445993031 +0.2822299651567944 +0.2857142857142857 +0.2891986062717770 +0.2926829268292683 +0.2961672473867596 +0.2996515679442509 +0.3031358885017422 +0.3066202090592334 +0.3101045296167247 +0.3135888501742160 +0.3170731707317073 +0.3205574912891986 +0.3240418118466899 +0.3275261324041812 +0.3310104529616725 +0.3344947735191638 +0.3379790940766551 +0.3414634146341464 +0.3449477351916376 +0.3484320557491289 +0.3519163763066202 +0.3554006968641115 +0.3588850174216028 +0.3623693379790941 +0.3658536585365854 +0.3693379790940767 +0.3728222996515679 +0.3763066202090593 +0.3797909407665505 +0.3832752613240418 +0.3867595818815331 +0.3902439024390244 +0.3937282229965157 +0.3972125435540070 +0.4006968641114982 +0.4041811846689896 +0.4076655052264808 +0.4111498257839721 +0.4146341463414634 +0.4181184668989547 +0.4216027874564460 +0.4250871080139373 +0.4285714285714285 +0.4320557491289199 +0.4355400696864111 +0.4390243902439024 +0.4425087108013937 +0.4459930313588850 +0.4494773519163763 +0.4529616724738676 +0.4564459930313589 +0.4599303135888502 +0.4634146341463415 +0.4668989547038327 +0.4703832752613241 +0.4738675958188153 +0.4773519163763066 +0.4808362369337979 +0.4843205574912892 +0.4878048780487805 +0.4912891986062718 +0.4947735191637631 +0.4982578397212544 +0.5017421602787456 +0.5052264808362370 +0.5087108013937283 +0.5121951219512195 +0.5156794425087108 +0.5191637630662020 +0.5226480836236933 +0.5261324041811847 +0.5296167247386759 +0.5331010452961673 +0.5365853658536586 +0.5400696864111498 +0.5435540069686411 +0.5470383275261324 +0.5505226480836236 +0.5540069686411150 +0.5574912891986064 +0.5609756097560976 +0.5644599303135889 +0.5679442508710801 +0.5714285714285714 +0.5749128919860627 +0.5783972125435540 +0.5818815331010453 +0.5853658536585367 +0.5888501742160279 +0.5923344947735192 +0.5958188153310104 +0.5993031358885017 +0.6027874564459930 +0.6062717770034843 +0.6097560975609756 +0.6132404181184670 +0.6167247386759582 +0.6202090592334495 +0.6236933797909407 +0.6271777003484320 +0.6306620209059233 +0.6341463414634146 +0.6376306620209059 +0.6411149825783973 +0.6445993031358885 +0.6480836236933798 +0.6515679442508711 +0.6550522648083623 +0.6585365853658536 +0.6620209059233449 +0.6655052264808362 +0.6689895470383276 +0.6724738675958188 +0.6759581881533101 +0.6794425087108014 +0.6829268292682926 +0.6864111498257840 +0.6898954703832753 +0.6933797909407666 +0.6968641114982579 +0.7003484320557491 +0.7038327526132404 +0.7073170731707317 +0.7108013937282229 +0.7142857142857143 +0.7177700348432056 +0.7212543554006969 +0.7247386759581882 +0.7282229965156795 +0.7317073170731707 +0.7351916376306620 +0.7386759581881532 +0.7421602787456446 +0.7456445993031359 +0.7491289198606272 +0.7526132404181185 +0.7560975609756098 +0.7595818815331010 +0.7630662020905923 +0.7665505226480837 +0.7700348432055749 +0.7735191637630662 +0.7770034843205575 +0.7804878048780488 +0.7839721254355401 +0.7874564459930313 +0.7909407665505226 +0.7944250871080140 +0.7979094076655052 +0.8013937282229965 +0.8048780487804879 +0.8083623693379791 +0.8118466898954704 +0.8153310104529616 +0.8188153310104529 +0.8222996515679443 +0.8257839721254355 +0.8292682926829268 +0.8327526132404182 +0.8362369337979094 +0.8397212543554007 +0.8432055749128919 +0.8466898954703833 +0.8501742160278746 +0.8536585365853658 +0.8571428571428572 +0.8606271777003485 +0.8641114982578397 +0.8675958188153310 +0.8710801393728222 +0.8745644599303136 +0.8780487804878049 +0.8815331010452961 +0.8850174216027875 +0.8885017421602788 +0.8919860627177700 +0.8954703832752613 +0.8989547038327526 +0.9024390243902439 +0.9059233449477352 +0.9094076655052264 +0.9128919860627178 +0.9163763066202091 +0.9198606271777003 +0.9233449477351916 +0.9268292682926830 +0.9303135888501742 +0.9337979094076655 +0.9372822299651568 +0.9407665505226481 +0.9442508710801394 +0.9477351916376306 +0.9512195121951219 +0.9547038327526133 +0.9581881533101045 +0.9616724738675958 +0.9651567944250871 +0.9686411149825784 +0.9721254355400697 +0.9756097560975610 +0.9790940766550522 +0.9825783972125436 +0.9860627177700348 +0.9895470383275261 +0.9930313588850174 +0.9965156794425087 +1.0000000000000000 ]; + +% outputs +y = [ +0.096798166000 +0.143459740000 +0.208317990000 +-0.038018393000 +0.148793230000 +0.512799550000 +-0.120798510000 +0.177158750000 +0.083816932000 +0.000756494710 +0.006887211700 +0.213572840000 +0.493783350000 +0.035274935000 +0.243769090000 +0.087417919000 +0.476797600000 +0.271438160000 +0.178877000000 +0.302770820000 +0.219586200000 +0.397548740000 +0.215089090000 +0.086588415000 +0.304056660000 +0.513946170000 +0.113409000000 +0.270068060000 +0.471061630000 +0.046628439000 +0.443157150000 +0.477349380000 +0.411852220000 +0.280063680000 +0.410626170000 +0.442082230000 +0.585090200000 +0.561297160000 +0.426446760000 +0.739395540000 +0.506414480000 +0.409925250000 +0.483992110000 +0.696575460000 +0.615166110000 +0.737349800000 +0.632542540000 +1.013287300000 +0.408451860000 +0.613835270000 +0.681370910000 +0.724988310000 +0.947395900000 +0.779004190000 +0.745667780000 +0.789666080000 +0.908202240000 +0.707755840000 +0.894037990000 +0.606428220000 +0.843615470000 +0.727874550000 +0.784348430000 +0.937189250000 +0.737952220000 +0.769620390000 +0.701166820000 +0.604155740000 +0.924881630000 +1.130475900000 +0.936493470000 +0.935667120000 +0.819976810000 +1.219958800000 +0.949769640000 +1.185254200000 +1.048672000000 +0.957402250000 +1.160938800000 +1.147023700000 +0.983283410000 +1.194051400000 +1.265849000000 +0.987167510000 +0.956395550000 +1.052589900000 +1.041239900000 +1.105649800000 +0.941725790000 +1.082398200000 +1.127045200000 +0.990602660000 +0.980803460000 +0.763155870000 +0.768571290000 +0.718186990000 +0.743430540000 +0.899271220000 +0.672586160000 +1.243876900000 +1.009891400000 +0.580803050000 +0.709665650000 +0.858643730000 +0.609667610000 +0.789520360000 +1.014111700000 +0.817911210000 +0.824534040000 +0.676622590000 +0.735885580000 +0.609022520000 +0.859070820000 +0.729465540000 +0.907844320000 +0.969161960000 +0.938595000000 +0.765435590000 +0.688922170000 +0.574990840000 +0.770659830000 +0.891310740000 +0.690971710000 +0.711048000000 +0.824634750000 +0.857126400000 +0.510549630000 +0.748820900000 +0.744129450000 +0.688191070000 +0.841053850000 +0.648943870000 +0.576231820000 +0.738291460000 +0.762720980000 +0.658108930000 +0.807248650000 +0.457323660000 +0.521077750000 +0.218860160000 +0.755337450000 +0.525976310000 +0.634217410000 +0.821176590000 +0.675074910000 +0.599022390000 +0.535501720000 +0.624415250000 +0.748616920000 +0.428448630000 +0.643341520000 +0.768654000000 +0.435878620000 +0.747073780000 +0.746823840000 +0.509674810000 +0.413964070000 +0.702246380000 +0.756141550000 +0.719368010000 +0.744580020000 +0.450466060000 +0.713008860000 +0.536099090000 +0.536595750000 +0.385158420000 +0.781369420000 +0.640457830000 +0.762680940000 +0.836824400000 +0.437730550000 +0.703038130000 +0.603083350000 +0.740709380000 +0.768477480000 +0.724346000000 +0.477804350000 +0.580883120000 +0.639146320000 +1.073252500000 +0.783713950000 +0.948384040000 +0.663369380000 +0.634232460000 +0.696070360000 +0.526957260000 +0.794798220000 +0.587766610000 +0.408654360000 +0.749043110000 +0.387306230000 +0.350567280000 +0.675537030000 +0.495158740000 +0.507149810000 +0.625867220000 +0.583647850000 +0.630796900000 +0.712643020000 +0.504536230000 +0.504499780000 +0.381836730000 +0.647114640000 +0.814415180000 +0.618741310000 +0.808727320000 +0.824111580000 +0.901249190000 +0.910594790000 +0.668334220000 +0.652467030000 +0.797380800000 +0.699257390000 +1.025428600000 +1.022629700000 +0.837597600000 +0.766407010000 +0.913657810000 +0.744506570000 +0.829397600000 +0.773018020000 +0.872046570000 +1.028215500000 +0.972177970000 +1.033239200000 +0.724398150000 +0.887466840000 +0.710846670000 +0.912868530000 +0.899725750000 +1.039970600000 +1.003988400000 +0.929601600000 +0.747319110000 +0.742110530000 +0.495198080000 +0.724133980000 +0.546209190000 +0.904975290000 +0.886555800000 +0.756973180000 +0.663691170000 +0.725449860000 +0.927661000000 +0.871628610000 +0.583857660000 +0.657822350000 +0.445564610000 +0.654537190000 +0.685853290000 +0.690412010000 +0.306045040000 +0.591718740000 +0.366728870000 +0.420310670000 +0.575582700000 +0.482907520000 +0.394669790000 +0.491601190000 +0.627475460000 +0.270874460000 +0.144405290000 +0.155561360000 +0.171715630000 +0.196642150000 +0.368318080000 +-0.046015957000 +0.287831380000 +0.121822920000 +0.390236930000 +0.084253654000 +0.201575720000 +0.048222309000 +0.075602342000 +0.128340910000 +0.123106810000 +0.069294711000 +0.308367180000 +0.213239800000 +0.401070710000 +0.073746174000 +0.268322470000 +-0.213145400000 +0.191332180000 +0.145485930000 +0.028213679000 +0.183566020000 +0.206160990000 ]; + +% compute MSE of prediction on all ( X( i ) , y( i ) ) + +v = 0; % return value + +for i = 1 : N % for all input / output pairs + + v = v + ( y( i ) - roughNN( w , X( i ) ) )^2; + +end + +v = v / 2; + +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN_ADiGatorGrd.m b/11-09/TestFunctions Matlab/testNN_ADiGatorGrd.m new file mode 100644 index 0000000..71bd762 --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN_ADiGatorGrd.m @@ -0,0 +1,227 @@ +% This code was generated using ADiGator version 1.4 +% ©2010-2014 Matthew J. Weinstein and Anil V. Rao +% ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +% Contact: mweinstein@ufl.edu +% Bugs/suggestions may be reported to the sourceforge forums +% DISCLAIMER +% ADiGator is a general-purpose software distributed under the GNU General +% Public License version 3.0. While the software is distributed with the +% hope that it will be useful, both the software and generated code are +% provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +% or fitness for any purpose or application. + +function v = testNN_ADiGatorGrd(w) +global ADiGator_testNN_ADiGatorGrd +if isempty(ADiGator_testNN_ADiGatorGrd); ADiGator_LoadData(); end +Gator1Data = ADiGator_testNN_ADiGatorGrd.testNN_ADiGatorGrd.Gator1Data; +% ADiGator Start Derivative Computations +%User Line: % +%User Line: % v = testNN( w ) +%User Line: % +%User Line: % returns the falue of the empirical error of the NN (or, in fact, +%User Line: % whatever function is encoded in 'roughNN()') with the weights contained +%User Line: % in w. +%User Line: % +%User Line: % The empirical error is estimated over a 288-strong input/output pair +%User Line: % ( X , y ), with X containing only one feature, that is hard-coded into +%User Line: % the function so that its gradient can be easily computed by ADiGator. +%User Line: % +%User Line: % Input: +%User Line: % +%User Line: % - w is the real vector containing the weights of the NN, see roughNN +%User Line: % for details +%User Line: % +%User Line: % Output: +%User Line: % +%User Line: % - the MSE of the error done by roughNN() on the given test set +%User Line: % +%User Line: %{ +%User Line: % ======================================= +%User Line: % Author: Antonio Frangioni +%User Line: % Date: 28-08-22 +%User Line: % Version 1.00 +%User Line: % Copyright Antonio Frangioni +%User Line: % ======================================= +%User Line: %} +N.f = 288; +%User Line: N = 288; +%User Line: % inputs +X.f = [;0.0000000000000000;0.0034843205574913;0.0069686411149826;0.0104529616724739;0.0139372822299652;0.0174216027874564;0.0209059233449477;0.0243902439024390;0.0278745644599303;0.0313588850174216;0.0348432055749129;0.0383275261324042;0.0418118466898955;0.0452961672473868;0.0487804878048781;0.0522648083623693;0.0557491289198606;0.0592334494773519;0.0627177700348432;0.0662020905923345;0.0696864111498258;0.0731707317073171;0.0766550522648084;0.0801393728222996;0.0836236933797909;0.0871080139372822;0.0905923344947735;0.0940766550522648;0.0975609756097561;0.1010452961672474;0.1045296167247387;0.1080139372822300;0.1114982578397213;0.1149825783972125;0.1184668989547038;0.1219512195121951;0.1254355400696864;0.1289198606271777;0.1324041811846690;0.1358885017421603;0.1393728222996516;0.1428571428571428;0.1463414634146341;0.1498257839721254;0.1533101045296167;0.1567944250871080;0.1602787456445993;0.1637630662020906;0.1672473867595819;0.1707317073170732;0.1742160278745645;0.1777003484320558;0.1811846689895470;0.1846689895470383;0.1881533101045296;0.1916376306620209;0.1951219512195122;0.1986062717770035;0.2020905923344948;0.2055749128919861;0.2090592334494774;0.2125435540069686;0.2160278745644599;0.2195121951219512;0.2229965156794425;0.2264808362369338;0.2299651567944251;0.2334494773519164;0.2369337979094077;0.2404181184668990;0.2439024390243902;0.2473867595818815;0.2508710801393728;0.2543554006968641;0.2578397212543554;0.2613240418118467;0.2648083623693380;0.2682926829268293;0.2717770034843205;0.2752613240418119;0.2787456445993031;0.2822299651567944;0.2857142857142857;0.2891986062717770;0.2926829268292683;0.2961672473867596;0.2996515679442509;0.3031358885017422;0.3066202090592334;0.3101045296167247;0.3135888501742160;0.3170731707317073;0.3205574912891986;0.3240418118466899;0.3275261324041812;0.3310104529616725;0.3344947735191638;0.3379790940766551;0.3414634146341464;0.3449477351916376;0.3484320557491289;0.3519163763066202;0.3554006968641115;0.3588850174216028;0.3623693379790941;0.3658536585365854;0.3693379790940767;0.3728222996515679;0.3763066202090593;0.3797909407665505;0.3832752613240418;0.3867595818815331;0.3902439024390244;0.3937282229965157;0.3972125435540070;0.4006968641114982;0.4041811846689896;0.4076655052264808;0.4111498257839721;0.4146341463414634;0.4181184668989547;0.4216027874564460;0.4250871080139373;0.4285714285714285;0.4320557491289199;0.4355400696864111;0.4390243902439024;0.4425087108013937;0.4459930313588850;0.4494773519163763;0.4529616724738676;0.4564459930313589;0.4599303135888502;0.4634146341463415;0.4668989547038327;0.4703832752613241;0.4738675958188153;0.4773519163763066;0.4808362369337979;0.4843205574912892;0.4878048780487805;0.4912891986062718;0.4947735191637631;0.4982578397212544;0.5017421602787456;0.5052264808362370;0.5087108013937283;0.5121951219512195;0.5156794425087108;0.5191637630662020;0.5226480836236933;0.5261324041811847;0.5296167247386759;0.5331010452961673;0.5365853658536586;0.5400696864111498;0.5435540069686411;0.5470383275261324;0.5505226480836236;0.5540069686411150;0.5574912891986064;0.5609756097560976;0.5644599303135889;0.5679442508710801;0.5714285714285714;0.5749128919860627;0.5783972125435540;0.5818815331010453;0.5853658536585367;0.5888501742160279;0.5923344947735192;0.5958188153310104;0.5993031358885017;0.6027874564459930;0.6062717770034843;0.6097560975609756;0.6132404181184670;0.6167247386759582;0.6202090592334495;0.6236933797909407;0.6271777003484320;0.6306620209059233;0.6341463414634146;0.6376306620209059;0.6411149825783973;0.6445993031358885;0.6480836236933798;0.6515679442508711;0.6550522648083623;0.6585365853658536;0.6620209059233449;0.6655052264808362;0.6689895470383276;0.6724738675958188;0.6759581881533101;0.6794425087108014;0.6829268292682926;0.6864111498257840;0.6898954703832753;0.6933797909407666;0.6968641114982579;0.7003484320557491;0.7038327526132404;0.7073170731707317;0.7108013937282229;0.7142857142857143;0.7177700348432056;0.7212543554006969;0.7247386759581882;0.7282229965156795;0.7317073170731707;0.7351916376306620;0.7386759581881532;0.7421602787456446;0.7456445993031359;0.7491289198606272;0.7526132404181185;0.7560975609756098;0.7595818815331010;0.7630662020905923;0.7665505226480837;0.7700348432055749;0.7735191637630662;0.7770034843205575;0.7804878048780488;0.7839721254355401;0.7874564459930313;0.7909407665505226;0.7944250871080140;0.7979094076655052;0.8013937282229965;0.8048780487804879;0.8083623693379791;0.8118466898954704;0.8153310104529616;0.8188153310104529;0.8222996515679443;0.8257839721254355;0.8292682926829268;0.8327526132404182;0.8362369337979094;0.8397212543554007;0.8432055749128919;0.8466898954703833;0.8501742160278746;0.8536585365853658;0.8571428571428572;0.8606271777003485;0.8641114982578397;0.8675958188153310;0.8710801393728222;0.8745644599303136;0.8780487804878049;0.8815331010452961;0.8850174216027875;0.8885017421602788;0.8919860627177700;0.8954703832752613;0.8989547038327526;0.9024390243902439;0.9059233449477352;0.9094076655052264;0.9128919860627178;0.9163763066202091;0.9198606271777003;0.9233449477351916;0.9268292682926830;0.9303135888501742;0.9337979094076655;0.9372822299651568;0.9407665505226481;0.9442508710801394;0.9477351916376306;0.9512195121951219;0.9547038327526133;0.9581881533101045;0.9616724738675958;0.9651567944250871;0.9686411149825784;0.9721254355400697;0.9756097560975610;0.9790940766550522;0.9825783972125436;0.9860627177700348;0.9895470383275261;0.9930313588850174;0.9965156794425087;1.0000000000000000 ]; +%User Line: X = [;0.0000000000000000;0.0034843205574913;0.0069686411149826;0.0104529616724739;0.0139372822299652;0.0174216027874564;0.0209059233449477;0.0243902439024390;0.0278745644599303;0.0313588850174216;0.0348432055749129;0.0383275261324042;0.0418118466898955;0.0452961672473868;0.0487804878048781;0.0522648083623693;0.0557491289198606;0.0592334494773519;0.0627177700348432;0.0662020905923345;0.0696864111498258;0.0731707317073171;0.0766550522648084;0.0801393728222996;0.0836236933797909;0.0871080139372822;0.0905923344947735;0.0940766550522648;0.0975609756097561;0.1010452961672474;0.1045296167247387;0.1080139372822300;0.1114982578397213;0.1149825783972125;0.1184668989547038;0.1219512195121951;0.1254355400696864;0.1289198606271777;0.1324041811846690;0.1358885017421603;0.1393728222996516;0.1428571428571428;0.1463414634146341;0.1498257839721254;0.1533101045296167;0.1567944250871080;0.1602787456445993;0.1637630662020906;0.1672473867595819;0.1707317073170732;0.1742160278745645;0.1777003484320558;0.1811846689895470;0.1846689895470383;0.1881533101045296;0.1916376306620209;0.1951219512195122;0.1986062717770035;0.2020905923344948;0.2055749128919861;0.2090592334494774;0.2125435540069686;0.2160278745644599;0.2195121951219512;0.2229965156794425;0.2264808362369338;0.2299651567944251;0.2334494773519164;0.2369337979094077;0.2404181184668990;0.2439024390243902;0.2473867595818815;0.2508710801393728;0.2543554006968641;0.2578397212543554;0.2613240418118467;0.2648083623693380;0.2682926829268293;0.2717770034843205;0.2752613240418119;0.2787456445993031;0.2822299651567944;0.2857142857142857;0.2891986062717770;0.2926829268292683;0.2961672473867596;0.2996515679442509;0.3031358885017422;0.3066202090592334;0.3101045296167247;0.3135888501742160;0.3170731707317073;0.3205574912891986;0.3240418118466899;0.3275261324041812;0.3310104529616725;0.3344947735191638;0.3379790940766551;0.3414634146341464;0.3449477351916376;0.3484320557491289;0.3519163763066202;0.3554006968641115;0.3588850174216028;0.3623693379790941;0.3658536585365854;0.3693379790940767;0.3728222996515679;0.3763066202090593;0.3797909407665505;0.3832752613240418;0.3867595818815331;0.3902439024390244;0.3937282229965157;0.3972125435540070;0.4006968641114982;0.4041811846689896;0.4076655052264808;0.4111498257839721;0.4146341463414634;0.4181184668989547;0.4216027874564460;0.4250871080139373;0.4285714285714285;0.4320557491289199;0.4355400696864111;0.4390243902439024;0.4425087108013937;0.4459930313588850;0.4494773519163763;0.4529616724738676;0.4564459930313589;0.4599303135888502;0.4634146341463415;0.4668989547038327;0.4703832752613241;0.4738675958188153;0.4773519163763066;0.4808362369337979;0.4843205574912892;0.4878048780487805;0.4912891986062718;0.4947735191637631;0.4982578397212544;0.5017421602787456;0.5052264808362370;0.5087108013937283;0.5121951219512195;0.5156794425087108;0.5191637630662020;0.5226480836236933;0.5261324041811847;0.5296167247386759;0.5331010452961673;0.5365853658536586;0.5400696864111498;0.5435540069686411;0.5470383275261324;0.5505226480836236;0.5540069686411150;0.5574912891986064;0.5609756097560976;0.5644599303135889;0.5679442508710801;0.5714285714285714;0.5749128919860627;0.5783972125435540;0.5818815331010453;0.5853658536585367;0.5888501742160279;0.5923344947735192;0.5958188153310104;0.5993031358885017;0.6027874564459930;0.6062717770034843;0.6097560975609756;0.6132404181184670;0.6167247386759582;0.6202090592334495;0.6236933797909407;0.6271777003484320;0.6306620209059233;0.6341463414634146;0.6376306620209059;0.6411149825783973;0.6445993031358885;0.6480836236933798;0.6515679442508711;0.6550522648083623;0.6585365853658536;0.6620209059233449;0.6655052264808362;0.6689895470383276;0.6724738675958188;0.6759581881533101;0.6794425087108014;0.6829268292682926;0.6864111498257840;0.6898954703832753;0.6933797909407666;0.6968641114982579;0.7003484320557491;0.7038327526132404;0.7073170731707317;0.7108013937282229;0.7142857142857143;0.7177700348432056;0.7212543554006969;0.7247386759581882;0.7282229965156795;0.7317073170731707;0.7351916376306620;0.7386759581881532;0.7421602787456446;0.7456445993031359;0.7491289198606272;0.7526132404181185;0.7560975609756098;0.7595818815331010;0.7630662020905923;0.7665505226480837;0.7700348432055749;0.7735191637630662;0.7770034843205575;0.7804878048780488;0.7839721254355401;0.7874564459930313;0.7909407665505226;0.7944250871080140;0.7979094076655052;0.8013937282229965;0.8048780487804879;0.8083623693379791;0.8118466898954704;0.8153310104529616;0.8188153310104529;0.8222996515679443;0.8257839721254355;0.8292682926829268;0.8327526132404182;0.8362369337979094;0.8397212543554007;0.8432055749128919;0.8466898954703833;0.8501742160278746;0.8536585365853658;0.8571428571428572;0.8606271777003485;0.8641114982578397;0.8675958188153310;0.8710801393728222;0.8745644599303136;0.8780487804878049;0.8815331010452961;0.8850174216027875;0.8885017421602788;0.8919860627177700;0.8954703832752613;0.8989547038327526;0.9024390243902439;0.9059233449477352;0.9094076655052264;0.9128919860627178;0.9163763066202091;0.9198606271777003;0.9233449477351916;0.9268292682926830;0.9303135888501742;0.9337979094076655;0.9372822299651568;0.9407665505226481;0.9442508710801394;0.9477351916376306;0.9512195121951219;0.9547038327526133;0.9581881533101045;0.9616724738675958;0.9651567944250871;0.9686411149825784;0.9721254355400697;0.9756097560975610;0.9790940766550522;0.9825783972125436;0.9860627177700348;0.9895470383275261;0.9930313588850174;0.9965156794425087;1.0000000000000000 ]; +%User Line: % outputs +y.f = [;0.096798166000;0.143459740000;0.208317990000;-0.038018393000;0.148793230000;0.512799550000;-0.120798510000;0.177158750000;0.083816932000;0.000756494710;0.006887211700;0.213572840000;0.493783350000;0.035274935000;0.243769090000;0.087417919000;0.476797600000;0.271438160000;0.178877000000;0.302770820000;0.219586200000;0.397548740000;0.215089090000;0.086588415000;0.304056660000;0.513946170000;0.113409000000;0.270068060000;0.471061630000;0.046628439000;0.443157150000;0.477349380000;0.411852220000;0.280063680000;0.410626170000;0.442082230000;0.585090200000;0.561297160000;0.426446760000;0.739395540000;0.506414480000;0.409925250000;0.483992110000;0.696575460000;0.615166110000;0.737349800000;0.632542540000;1.013287300000;0.408451860000;0.613835270000;0.681370910000;0.724988310000;0.947395900000;0.779004190000;0.745667780000;0.789666080000;0.908202240000;0.707755840000;0.894037990000;0.606428220000;0.843615470000;0.727874550000;0.784348430000;0.937189250000;0.737952220000;0.769620390000;0.701166820000;0.604155740000;0.924881630000;1.130475900000;0.936493470000;0.935667120000;0.819976810000;1.219958800000;0.949769640000;1.185254200000;1.048672000000;0.957402250000;1.160938800000;1.147023700000;0.983283410000;1.194051400000;1.265849000000;0.987167510000;0.956395550000;1.052589900000;1.041239900000;1.105649800000;0.941725790000;1.082398200000;1.127045200000;0.990602660000;0.980803460000;0.763155870000;0.768571290000;0.718186990000;0.743430540000;0.899271220000;0.672586160000;1.243876900000;1.009891400000;0.580803050000;0.709665650000;0.858643730000;0.609667610000;0.789520360000;1.014111700000;0.817911210000;0.824534040000;0.676622590000;0.735885580000;0.609022520000;0.859070820000;0.729465540000;0.907844320000;0.969161960000;0.938595000000;0.765435590000;0.688922170000;0.574990840000;0.770659830000;0.891310740000;0.690971710000;0.711048000000;0.824634750000;0.857126400000;0.510549630000;0.748820900000;0.744129450000;0.688191070000;0.841053850000;0.648943870000;0.576231820000;0.738291460000;0.762720980000;0.658108930000;0.807248650000;0.457323660000;0.521077750000;0.218860160000;0.755337450000;0.525976310000;0.634217410000;0.821176590000;0.675074910000;0.599022390000;0.535501720000;0.624415250000;0.748616920000;0.428448630000;0.643341520000;0.768654000000;0.435878620000;0.747073780000;0.746823840000;0.509674810000;0.413964070000;0.702246380000;0.756141550000;0.719368010000;0.744580020000;0.450466060000;0.713008860000;0.536099090000;0.536595750000;0.385158420000;0.781369420000;0.640457830000;0.762680940000;0.836824400000;0.437730550000;0.703038130000;0.603083350000;0.740709380000;0.768477480000;0.724346000000;0.477804350000;0.580883120000;0.639146320000;1.073252500000;0.783713950000;0.948384040000;0.663369380000;0.634232460000;0.696070360000;0.526957260000;0.794798220000;0.587766610000;0.408654360000;0.749043110000;0.387306230000;0.350567280000;0.675537030000;0.495158740000;0.507149810000;0.625867220000;0.583647850000;0.630796900000;0.712643020000;0.504536230000;0.504499780000;0.381836730000;0.647114640000;0.814415180000;0.618741310000;0.808727320000;0.824111580000;0.901249190000;0.910594790000;0.668334220000;0.652467030000;0.797380800000;0.699257390000;1.025428600000;1.022629700000;0.837597600000;0.766407010000;0.913657810000;0.744506570000;0.829397600000;0.773018020000;0.872046570000;1.028215500000;0.972177970000;1.033239200000;0.724398150000;0.887466840000;0.710846670000;0.912868530000;0.899725750000;1.039970600000;1.003988400000;0.929601600000;0.747319110000;0.742110530000;0.495198080000;0.724133980000;0.546209190000;0.904975290000;0.886555800000;0.756973180000;0.663691170000;0.725449860000;0.927661000000;0.871628610000;0.583857660000;0.657822350000;0.445564610000;0.654537190000;0.685853290000;0.690412010000;0.306045040000;0.591718740000;0.366728870000;0.420310670000;0.575582700000;0.482907520000;0.394669790000;0.491601190000;0.627475460000;0.270874460000;0.144405290000;0.155561360000;0.171715630000;0.196642150000;0.368318080000;-0.046015957000;0.287831380000;0.121822920000;0.390236930000;0.084253654000;0.201575720000;0.048222309000;0.075602342000;0.128340910000;0.123106810000;0.069294711000;0.308367180000;0.213239800000;0.401070710000;0.073746174000;0.268322470000;-0.213145400000;0.191332180000;0.145485930000;0.028213679000;0.183566020000;0.206160990000 ]; +%User Line: y = [;0.096798166000;0.143459740000;0.208317990000;-0.038018393000;0.148793230000;0.512799550000;-0.120798510000;0.177158750000;0.083816932000;0.000756494710;0.006887211700;0.213572840000;0.493783350000;0.035274935000;0.243769090000;0.087417919000;0.476797600000;0.271438160000;0.178877000000;0.302770820000;0.219586200000;0.397548740000;0.215089090000;0.086588415000;0.304056660000;0.513946170000;0.113409000000;0.270068060000;0.471061630000;0.046628439000;0.443157150000;0.477349380000;0.411852220000;0.280063680000;0.410626170000;0.442082230000;0.585090200000;0.561297160000;0.426446760000;0.739395540000;0.506414480000;0.409925250000;0.483992110000;0.696575460000;0.615166110000;0.737349800000;0.632542540000;1.013287300000;0.408451860000;0.613835270000;0.681370910000;0.724988310000;0.947395900000;0.779004190000;0.745667780000;0.789666080000;0.908202240000;0.707755840000;0.894037990000;0.606428220000;0.843615470000;0.727874550000;0.784348430000;0.937189250000;0.737952220000;0.769620390000;0.701166820000;0.604155740000;0.924881630000;1.130475900000;0.936493470000;0.935667120000;0.819976810000;1.219958800000;0.949769640000;1.185254200000;1.048672000000;0.957402250000;1.160938800000;1.147023700000;0.983283410000;1.194051400000;1.265849000000;0.987167510000;0.956395550000;1.052589900000;1.041239900000;1.105649800000;0.941725790000;1.082398200000;1.127045200000;0.990602660000;0.980803460000;0.763155870000;0.768571290000;0.718186990000;0.743430540000;0.899271220000;0.672586160000;1.243876900000;1.009891400000;0.580803050000;0.709665650000;0.858643730000;0.609667610000;0.789520360000;1.014111700000;0.817911210000;0.824534040000;0.676622590000;0.735885580000;0.609022520000;0.859070820000;0.729465540000;0.907844320000;0.969161960000;0.938595000000;0.765435590000;0.688922170000;0.574990840000;0.770659830000;0.891310740000;0.690971710000;0.711048000000;0.824634750000;0.857126400000;0.510549630000;0.748820900000;0.744129450000;0.688191070000;0.841053850000;0.648943870000;0.576231820000;0.738291460000;0.762720980000;0.658108930000;0.807248650000;0.457323660000;0.521077750000;0.218860160000;0.755337450000;0.525976310000;0.634217410000;0.821176590000;0.675074910000;0.599022390000;0.535501720000;0.624415250000;0.748616920000;0.428448630000;0.643341520000;0.768654000000;0.435878620000;0.747073780000;0.746823840000;0.509674810000;0.413964070000;0.702246380000;0.756141550000;0.719368010000;0.744580020000;0.450466060000;0.713008860000;0.536099090000;0.536595750000;0.385158420000;0.781369420000;0.640457830000;0.762680940000;0.836824400000;0.437730550000;0.703038130000;0.603083350000;0.740709380000;0.768477480000;0.724346000000;0.477804350000;0.580883120000;0.639146320000;1.073252500000;0.783713950000;0.948384040000;0.663369380000;0.634232460000;0.696070360000;0.526957260000;0.794798220000;0.587766610000;0.408654360000;0.749043110000;0.387306230000;0.350567280000;0.675537030000;0.495158740000;0.507149810000;0.625867220000;0.583647850000;0.630796900000;0.712643020000;0.504536230000;0.504499780000;0.381836730000;0.647114640000;0.814415180000;0.618741310000;0.808727320000;0.824111580000;0.901249190000;0.910594790000;0.668334220000;0.652467030000;0.797380800000;0.699257390000;1.025428600000;1.022629700000;0.837597600000;0.766407010000;0.913657810000;0.744506570000;0.829397600000;0.773018020000;0.872046570000;1.028215500000;0.972177970000;1.033239200000;0.724398150000;0.887466840000;0.710846670000;0.912868530000;0.899725750000;1.039970600000;1.003988400000;0.929601600000;0.747319110000;0.742110530000;0.495198080000;0.724133980000;0.546209190000;0.904975290000;0.886555800000;0.756973180000;0.663691170000;0.725449860000;0.927661000000;0.871628610000;0.583857660000;0.657822350000;0.445564610000;0.654537190000;0.685853290000;0.690412010000;0.306045040000;0.591718740000;0.366728870000;0.420310670000;0.575582700000;0.482907520000;0.394669790000;0.491601190000;0.627475460000;0.270874460000;0.144405290000;0.155561360000;0.171715630000;0.196642150000;0.368318080000;-0.046015957000;0.287831380000;0.121822920000;0.390236930000;0.084253654000;0.201575720000;0.048222309000;0.075602342000;0.128340910000;0.123106810000;0.069294711000;0.308367180000;0.213239800000;0.401070710000;0.073746174000;0.268322470000;-0.213145400000;0.191332180000;0.145485930000;0.028213679000;0.183566020000;0.206160990000 ]; +%User Line: % compute MSE of prediction on all ( X( i ) , y( i ) ) +v.f = 0; +%User Line: v = 0; +cadaforvar1.f = 1:N.f; +%User Line: cadaforvar1 = 1 : N; +v.dw = zeros(76,1); +for cadaforcount1 = 1:288 + i.f = cadaforvar1.f(:,cadaforcount1); + %User Line: i = cadaforvar1(:,cadaforcount1); + cadainput2_1.dw = w.dw; cadainput2_1.f = w.f; + %User Line: cadainput2_1 = w; + cadainput2_2.f = X.f(i.f); + %User Line: cadainput2_2 = X( i ); + cadaoutput2_1 = ADiGator_roughNN(cadainput2_1,cadainput2_2); + % Call to function: roughNN + cada1f1 = y.f(i.f); + cada1f2dw = -cadaoutput2_1.dw; + cada1f2 = cada1f1 - cadaoutput2_1.f; + cada1f3dw = 2.*cada1f2.^(2-1).*cada1f2dw; + cada1f3 = cada1f2^2; + cada1td1 = v.dw; + cada1td1 = cada1td1 + cada1f3dw; + v.dw = cada1td1; + v.f = v.f + cada1f3; + %User Line: v = v + ( y( i ) - cadaoutput2_1 )^2; +end +v.dw = v.dw./2; +v.f = v.f/2; +%User Line: v = v / 2; +v.dw_size = 76; +v.dw_location = Gator1Data.Index1; +end +function v = ADiGator_roughNN(w,x) +global ADiGator_testNN_ADiGatorGrd +Gator1Data = ADiGator_testNN_ADiGatorGrd.ADiGator_roughNN.Gator1Data; +% ADiGator Start Derivative Computations +%User Line: % +%User Line: % v = roughNN( w , x ) +%User Line: % +%User Line: % returns the falue of the function v = f( x ) as currently estimated by +%User Line: % a small NN with 1 input, 1 output, 3 hidden layers of 5 nodes each, and +%User Line: % tanh activation function. +%User Line: % +%User Line: % Input: +%User Line: % +%User Line: % - w is the [ 76 x 1 ] real vector containing the weights of the NN, +%User Line: % i.e., w is made as follows: +%User Line: % [ 1 .. 5 ] are the [ 5 x 1 ] weigths of the first layer +%User Line: % [ 6 .. 10 ] are the [ 5 x 1 ] biases of the first layer +%User Line: % [ 11 .. 35 ] are the [ 5 x 5 ] weigths of the second layer +%User Line: % [ 36 .. 40 ] are the [ 5 x 1 ] biases of the second layer +%User Line: % [ 41 .. 65 ] are the [ 5 x 5 ] weigths of the third layer +%User Line: % [ 66 .. 70 ] are the [ 5 x 1 ] biases of the third layer +%User Line: % [ 71 .. 75 ] are the [ 5 x 1 ] weigths of the fourth (output) layer +%User Line: % [ 76 ] is the [ 1 x 1 ] bias of the fourth (output) layer +%User Line: % +%User Line: % - x is the real scalar containing the input of f() +%User Line: % +%User Line: % Output: +%User Line: % +%User Line: % - v (real, scalar): v = f( x ) as estimated by the NN with weights w +%User Line: % +%User Line: %{ +%User Line: % ======================================= +%User Line: % Author: Antonio Frangioni +%User Line: % Date: 28-08-22 +%User Line: % Version 1.00 +%User Line: % Copyright Antonio Frangioni +%User Line: % ======================================= +%User Line: %} +cada1f2 = Gator1Data.Data1*x.f; +cada1f3dw = w.dw(Gator1Data.Index1); +cada1f3 = w.f(Gator1Data.Index9); +cada1f4dw = cada1f2(:).*cada1f3dw; +cada1f4 = cada1f2.*cada1f3; +cada1f5dw = w.dw(Gator1Data.Index2); +cada1f5 = w.f(Gator1Data.Index10); +cada1td1 = zeros(10,1); +cada1td1(Gator1Data.Index11) = cada1f4dw; +cada1td1(Gator1Data.Index12) = cada1td1(Gator1Data.Index12) + cada1f5dw; +cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +cada1tf1 = cada1f6(Gator1Data.Index13); +g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +%User Line: g = tanh( ( ones( 5 , 1 ) * x ) .* w( 1 : 5 ) + w( 6 : 10 ) ); +cada1f1dw = w.dw(Gator1Data.Index3); +cada1f1 = w.f(Gator1Data.Index14); +cada1f2dw = cada1f1dw; +cada1f2 = reshape(cada1f1,5,5); +cada1f3 = 5; +cada1td2 = zeros(5,25); +cada1td2(Gator1Data.Index15) = cada1f2dw; +cada1td2 = g.f.'*cada1td2; +cada1td1 = zeros(75,1); +cada1td1(Gator1Data.Index17) = cada1td2(Gator1Data.Index16); +cada1td2 = zeros(5,10); +cada1td2(Gator1Data.Index18) = g.dw; +cada1td2 = cada1f2*cada1td2; +cada1td2 = cada1td2(:); +cada1td1(Gator1Data.Index20) = cada1td1(Gator1Data.Index20) + cada1td2(Gator1Data.Index19); +cada1f4dw = cada1td1; +cada1f4 = cada1f2*g.f; +cada1f5dw = w.dw(Gator1Data.Index4); +cada1f5 = w.f(Gator1Data.Index21); +cada1td1 = zeros(80,1); +cada1td1(Gator1Data.Index22) = cada1f4dw; +cada1td1(Gator1Data.Index23) = cada1td1(Gator1Data.Index23) + cada1f5dw; +cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +cada1tf1 = cada1f6(Gator1Data.Index24); +g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +%User Line: g = tanh( reshape( w( 11 : 35 ) , [ 5 5 ] ) * g + w( 36 : 40 ) ); +cada1f1dw = w.dw(Gator1Data.Index5); +cada1f1 = w.f(Gator1Data.Index25); +cada1f2dw = cada1f1dw; +cada1f2 = reshape(cada1f1,5,5); +cada1f3 = 5; +cada1td2 = zeros(5,25); +cada1td2(Gator1Data.Index26) = cada1f2dw; +cada1td2 = g.f.'*cada1td2; +cada1td1 = zeros(225,1); +cada1td1(Gator1Data.Index28) = cada1td2(Gator1Data.Index27); +cada1td2 = zeros(5,40); +cada1td2(Gator1Data.Index29) = g.dw; +cada1td2 = cada1f2*cada1td2; +cada1td2 = cada1td2(:); +cada1td1(Gator1Data.Index31) = cada1td1(Gator1Data.Index31) + cada1td2(Gator1Data.Index30); +cada1f4dw = cada1td1; +cada1f4 = cada1f2*g.f; +cada1f5dw = w.dw(Gator1Data.Index6); +cada1f5 = w.f(Gator1Data.Index32); +cada1td1 = zeros(230,1); +cada1td1(Gator1Data.Index33) = cada1f4dw; +cada1td1(Gator1Data.Index34) = cada1td1(Gator1Data.Index34) + cada1f5dw; +cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +cada1tf1 = cada1f6(Gator1Data.Index35); +g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +%User Line: g = tanh( reshape( w( 41 : 65 ) , [ 5 5 ] ) * g + w( 66 : 70 ) ); +cada1f1dw = w.dw(Gator1Data.Index7); +cada1f1 = w.f(Gator1Data.Index36); +cada1f2dw = g.dw; +cada1f2 = g.f.'; +cada1f3 = 5; +cada1td2 = sparse(Gator1Data.Index37,Gator1Data.Index38,cada1f2dw,5,70); +cada1td2 = cada1f1.'*cada1td2; +cada1td1 = zeros(75,1); +cada1td1(Gator1Data.Index40) = cada1td2(Gator1Data.Index39); +cada1td2 = zeros(5,5); +cada1td2(Gator1Data.Index41) = cada1f1dw; +cada1td2 = cada1f2*cada1td2; +cada1td2 = cada1td2(:); +cada1td1(Gator1Data.Index43) = cada1td1(Gator1Data.Index43) + cada1td2(Gator1Data.Index42); +cada1f4dw = cada1td1; +cada1f4 = cada1f2*cada1f1; +cada1f5dw = w.dw(Gator1Data.Index8); +cada1f5 = w.f(76); +cada1td1 = zeros(76,1); +cada1td1(Gator1Data.Index44) = cada1f4dw; +cada1td1(76) = cada1td1(76) + cada1f5dw; +v.dw = cada1td1; +v.f = cada1f4 + cada1f5; +%User Line: v = g' * w( 71 : 75 ) + w( 76 ); +end + + +function ADiGator_LoadData() +global ADiGator_testNN_ADiGatorGrd +ADiGator_testNN_ADiGatorGrd = load('testNN_ADiGatorGrd.mat'); +return +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN_ADiGatorGrd.mat b/11-09/TestFunctions Matlab/testNN_ADiGatorGrd.mat new file mode 100644 index 0000000..f092430 Binary files /dev/null and b/11-09/TestFunctions Matlab/testNN_ADiGatorGrd.mat differ diff --git a/11-09/TestFunctions Matlab/testNN_ADiGatorHes.m b/11-09/TestFunctions Matlab/testNN_ADiGatorHes.m new file mode 100644 index 0000000..b53580d --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN_ADiGatorHes.m @@ -0,0 +1,508 @@ +% This code was generated using ADiGator version 1.4 +% ©2010-2014 Matthew J. Weinstein and Anil V. Rao +% ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +% Contact: mweinstein@ufl.edu +% Bugs/suggestions may be reported to the sourceforge forums +% DISCLAIMER +% ADiGator is a general-purpose software distributed under the GNU General +% Public License version 3.0. While the software is distributed with the +% hope that it will be useful, both the software and generated code are +% provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +% or fitness for any purpose or application. + +function v = testNN_ADiGatorHes(w) +global ADiGator_testNN_ADiGatorHes +if isempty(ADiGator_testNN_ADiGatorHes); ADiGator_LoadData(); end +Gator1Data = ADiGator_testNN_ADiGatorHes.testNN_ADiGatorHes.Gator1Data; +Gator2Data = ADiGator_testNN_ADiGatorHes.testNN_ADiGatorHes.Gator2Data; +% ADiGator Start Derivative Computations +%User Line: % +%User Line: % v = testNN( w ) +%User Line: % +%User Line: % returns the falue of the empirical error of the NN (or, in fact, +%User Line: % whatever function is encoded in 'roughNN()') with the weights contained +%User Line: % in w. +%User Line: % +%User Line: % The empirical error is estimated over a 288-strong input/output pair +%User Line: % ( X , y ), with X containing only one feature, that is hard-coded into +%User Line: % the function so that its gradient can be easily computed by ADiGator. +%User Line: % +%User Line: % Input: +%User Line: % +%User Line: % - w is the real vector containing the weights of the NN, see roughNN +%User Line: % for details +%User Line: % +%User Line: % Output: +%User Line: % +%User Line: % - the MSE of the error done by roughNN() on the given test set +%User Line: % +%User Line: %{ +%User Line: % ======================================= +%User Line: % Author: Antonio Frangioni +%User Line: % Date: 28-08-22 +%User Line: % Version 1.00 +%User Line: % Copyright Antonio Frangioni +%User Line: % ======================================= +%User Line: %} +N.f = 288; +% Deriv 1 Line: N.f = 288; +%User Line: N = 288; +%User Line: % inputs +X.f = Gator2Data.Data1; +% Deriv 1 Line: X.f = [;0.0000000000000000;0.0034843205574913;0.0069686411149826;0.0104529616724739;0.0139372822299652;0.0174216027874564;0.0209059233449477;0.0243902439024390;0.0278745644599303;0.0313588850174216;0.0348432055749129;0.0383275261324042;0.0418118466898955;0.0452961672473868;0.0487804878048781;0.0522648083623693;0.0557491289198606;0.0592334494773519;0.0627177700348432;0.0662020905923345;0.0696864111498258;0.0731707317073171;0.0766550522648084;0.0801393728222996;0.0836236933797909;0.0871080139372822;0.0905923344947735;0.0940766550522648;0.0975609756097561;0.1010452961672474;0.1045296167247387;0.1080139372822300;0.1114982578397213;0.1149825783972125;0.1184668989547038;0.1219512195121951;0.1254355400696864;0.1289198606271777;0.1324041811846690;0.1358885017421603;0.1393728222996516;0.1428571428571428;0.1463414634146341;0.1498257839721254;0.1533101045296167;0.1567944250871080;0.1602787456445993;0.1637630662020906;0.1672473867595819;0.1707317073170732;0.1742160278745645;0.1777003484320558;0.1811846689895470;0.1846689895470383;0.1881533101045296;0.1916376306620209;0.1951219512195122;0.1986062717770035;0.2020905923344948;0.2055749128919861;0.2090592334494774;0.2125435540069686;0.2160278745644599;0.2195121951219512;0.2229965156794425;0.2264808362369338;0.2299651567944251;0.2334494773519164;0.2369337979094077;0.2404181184668990;0.2439024390243902;0.2473867595818815;0.2508710801393728;0.2543554006968641;0.2578397212543554;0.2613240418118467;0.2648083623693380;0.2682926829268293;0.2717770034843205;0.2752613240418119;0.2787456445993031;0.2822299651567944;0.2857142857142857;0.2891986062717770;0.2926829268292683;0.2961672473867596;0.2996515679442509;0.3031358885017422;0.3066202090592334;0.3101045296167247;0.3135888501742160;0.3170731707317073;0.3205574912891986;0.3240418118466899;0.3275261324041812;0.3310104529616725;0.3344947735191638;0.3379790940766551;0.3414634146341464;0.3449477351916376;0.3484320557491289;0.3519163763066202;0.3554006968641115;0.3588850174216028;0.3623693379790941;0.3658536585365854;0.3693379790940767;0.3728222996515679;0.3763066202090593;0.3797909407665505;0.3832752613240418;0.3867595818815331;0.3902439024390244;0.3937282229965157;0.3972125435540070;0.4006968641114982;0.4041811846689896;0.4076655052264808;0.4111498257839721;0.4146341463414634;0.4181184668989547;0.4216027874564460;0.4250871080139373;0.4285714285714285;0.4320557491289199;0.4355400696864111;0.4390243902439024;0.4425087108013937;0.4459930313588850;0.4494773519163763;0.4529616724738676;0.4564459930313589;0.4599303135888502;0.4634146341463415;0.4668989547038327;0.4703832752613241;0.4738675958188153;0.4773519163763066;0.4808362369337979;0.4843205574912892;0.4878048780487805;0.4912891986062718;0.4947735191637631;0.4982578397212544;0.5017421602787456;0.5052264808362370;0.5087108013937283;0.5121951219512195;0.5156794425087108;0.5191637630662020;0.5226480836236933;0.5261324041811847;0.5296167247386759;0.5331010452961673;0.5365853658536586;0.5400696864111498;0.5435540069686411;0.5470383275261324;0.5505226480836236;0.5540069686411150;0.5574912891986064;0.5609756097560976;0.5644599303135889;0.5679442508710801;0.5714285714285714;0.5749128919860627;0.5783972125435540;0.5818815331010453;0.5853658536585367;0.5888501742160279;0.5923344947735192;0.5958188153310104;0.5993031358885017;0.6027874564459930;0.6062717770034843;0.6097560975609756;0.6132404181184670;0.6167247386759582;0.6202090592334495;0.6236933797909407;0.6271777003484320;0.6306620209059233;0.6341463414634146;0.6376306620209059;0.6411149825783973;0.6445993031358885;0.6480836236933798;0.6515679442508711;0.6550522648083623;0.6585365853658536;0.6620209059233449;0.6655052264808362;0.6689895470383276;0.6724738675958188;0.6759581881533101;0.6794425087108014;0.6829268292682926;0.6864111498257840;0.6898954703832753;0.6933797909407666;0.6968641114982579;0.7003484320557491;0.7038327526132404;0.7073170731707317;0.7108013937282229;0.7142857142857143;0.7177700348432056;0.7212543554006969;0.7247386759581882;0.7282229965156795;0.7317073170731707;0.7351916376306620;0.7386759581881532;0.7421602787456446;0.7456445993031359;0.7491289198606272;0.7526132404181185;0.7560975609756098;0.7595818815331010;0.7630662020905923;0.7665505226480837;0.7700348432055749;0.7735191637630662;0.7770034843205575;0.7804878048780488;0.7839721254355401;0.7874564459930313;0.7909407665505226;0.7944250871080140;0.7979094076655052;0.8013937282229965;0.8048780487804879;0.8083623693379791;0.8118466898954704;0.8153310104529616;0.8188153310104529;0.8222996515679443;0.8257839721254355;0.8292682926829268;0.8327526132404182;0.8362369337979094;0.8397212543554007;0.8432055749128919;0.8466898954703833;0.8501742160278746;0.8536585365853658;0.8571428571428572;0.8606271777003485;0.8641114982578397;0.8675958188153310;0.8710801393728222;0.8745644599303136;0.8780487804878049;0.8815331010452961;0.8850174216027875;0.8885017421602788;0.8919860627177700;0.8954703832752613;0.8989547038327526;0.9024390243902439;0.9059233449477352;0.9094076655052264;0.9128919860627178;0.9163763066202091;0.9198606271777003;0.9233449477351916;0.9268292682926830;0.9303135888501742;0.9337979094076655;0.9372822299651568;0.9407665505226481;0.9442508710801394;0.9477351916376306;0.9512195121951219;0.9547038327526133;0.9581881533101045;0.9616724738675958;0.9651567944250871;0.9686411149825784;0.9721254355400697;0.9756097560975610;0.9790940766550522;0.9825783972125436;0.9860627177700348;0.9895470383275261;0.9930313588850174;0.9965156794425087;1.0000000000000000 ]; +%User Line: X = [;0.0000000000000000;0.0034843205574913;0.0069686411149826;0.0104529616724739;0.0139372822299652;0.0174216027874564;0.0209059233449477;0.0243902439024390;0.0278745644599303;0.0313588850174216;0.0348432055749129;0.0383275261324042;0.0418118466898955;0.0452961672473868;0.0487804878048781;0.0522648083623693;0.0557491289198606;0.0592334494773519;0.0627177700348432;0.0662020905923345;0.0696864111498258;0.0731707317073171;0.0766550522648084;0.0801393728222996;0.0836236933797909;0.0871080139372822;0.0905923344947735;0.0940766550522648;0.0975609756097561;0.1010452961672474;0.1045296167247387;0.1080139372822300;0.1114982578397213;0.1149825783972125;0.1184668989547038;0.1219512195121951;0.1254355400696864;0.1289198606271777;0.1324041811846690;0.1358885017421603;0.1393728222996516;0.1428571428571428;0.1463414634146341;0.1498257839721254;0.1533101045296167;0.1567944250871080;0.1602787456445993;0.1637630662020906;0.1672473867595819;0.1707317073170732;0.1742160278745645;0.1777003484320558;0.1811846689895470;0.1846689895470383;0.1881533101045296;0.1916376306620209;0.1951219512195122;0.1986062717770035;0.2020905923344948;0.2055749128919861;0.2090592334494774;0.2125435540069686;0.2160278745644599;0.2195121951219512;0.2229965156794425;0.2264808362369338;0.2299651567944251;0.2334494773519164;0.2369337979094077;0.2404181184668990;0.2439024390243902;0.2473867595818815;0.2508710801393728;0.2543554006968641;0.2578397212543554;0.2613240418118467;0.2648083623693380;0.2682926829268293;0.2717770034843205;0.2752613240418119;0.2787456445993031;0.2822299651567944;0.2857142857142857;0.2891986062717770;0.2926829268292683;0.2961672473867596;0.2996515679442509;0.3031358885017422;0.3066202090592334;0.3101045296167247;0.3135888501742160;0.3170731707317073;0.3205574912891986;0.3240418118466899;0.3275261324041812;0.3310104529616725;0.3344947735191638;0.3379790940766551;0.3414634146341464;0.3449477351916376;0.3484320557491289;0.3519163763066202;0.3554006968641115;0.3588850174216028;0.3623693379790941;0.3658536585365854;0.3693379790940767;0.3728222996515679;0.3763066202090593;0.3797909407665505;0.3832752613240418;0.3867595818815331;0.3902439024390244;0.3937282229965157;0.3972125435540070;0.4006968641114982;0.4041811846689896;0.4076655052264808;0.4111498257839721;0.4146341463414634;0.4181184668989547;0.4216027874564460;0.4250871080139373;0.4285714285714285;0.4320557491289199;0.4355400696864111;0.4390243902439024;0.4425087108013937;0.4459930313588850;0.4494773519163763;0.4529616724738676;0.4564459930313589;0.4599303135888502;0.4634146341463415;0.4668989547038327;0.4703832752613241;0.4738675958188153;0.4773519163763066;0.4808362369337979;0.4843205574912892;0.4878048780487805;0.4912891986062718;0.4947735191637631;0.4982578397212544;0.5017421602787456;0.5052264808362370;0.5087108013937283;0.5121951219512195;0.5156794425087108;0.5191637630662020;0.5226480836236933;0.5261324041811847;0.5296167247386759;0.5331010452961673;0.5365853658536586;0.5400696864111498;0.5435540069686411;0.5470383275261324;0.5505226480836236;0.5540069686411150;0.5574912891986064;0.5609756097560976;0.5644599303135889;0.5679442508710801;0.5714285714285714;0.5749128919860627;0.5783972125435540;0.5818815331010453;0.5853658536585367;0.5888501742160279;0.5923344947735192;0.5958188153310104;0.5993031358885017;0.6027874564459930;0.6062717770034843;0.6097560975609756;0.6132404181184670;0.6167247386759582;0.6202090592334495;0.6236933797909407;0.6271777003484320;0.6306620209059233;0.6341463414634146;0.6376306620209059;0.6411149825783973;0.6445993031358885;0.6480836236933798;0.6515679442508711;0.6550522648083623;0.6585365853658536;0.6620209059233449;0.6655052264808362;0.6689895470383276;0.6724738675958188;0.6759581881533101;0.6794425087108014;0.6829268292682926;0.6864111498257840;0.6898954703832753;0.6933797909407666;0.6968641114982579;0.7003484320557491;0.7038327526132404;0.7073170731707317;0.7108013937282229;0.7142857142857143;0.7177700348432056;0.7212543554006969;0.7247386759581882;0.7282229965156795;0.7317073170731707;0.7351916376306620;0.7386759581881532;0.7421602787456446;0.7456445993031359;0.7491289198606272;0.7526132404181185;0.7560975609756098;0.7595818815331010;0.7630662020905923;0.7665505226480837;0.7700348432055749;0.7735191637630662;0.7770034843205575;0.7804878048780488;0.7839721254355401;0.7874564459930313;0.7909407665505226;0.7944250871080140;0.7979094076655052;0.8013937282229965;0.8048780487804879;0.8083623693379791;0.8118466898954704;0.8153310104529616;0.8188153310104529;0.8222996515679443;0.8257839721254355;0.8292682926829268;0.8327526132404182;0.8362369337979094;0.8397212543554007;0.8432055749128919;0.8466898954703833;0.8501742160278746;0.8536585365853658;0.8571428571428572;0.8606271777003485;0.8641114982578397;0.8675958188153310;0.8710801393728222;0.8745644599303136;0.8780487804878049;0.8815331010452961;0.8850174216027875;0.8885017421602788;0.8919860627177700;0.8954703832752613;0.8989547038327526;0.9024390243902439;0.9059233449477352;0.9094076655052264;0.9128919860627178;0.9163763066202091;0.9198606271777003;0.9233449477351916;0.9268292682926830;0.9303135888501742;0.9337979094076655;0.9372822299651568;0.9407665505226481;0.9442508710801394;0.9477351916376306;0.9512195121951219;0.9547038327526133;0.9581881533101045;0.9616724738675958;0.9651567944250871;0.9686411149825784;0.9721254355400697;0.9756097560975610;0.9790940766550522;0.9825783972125436;0.9860627177700348;0.9895470383275261;0.9930313588850174;0.9965156794425087;1.0000000000000000 ]; +%User Line: % outputs +y.f = Gator2Data.Data2; +% Deriv 1 Line: y.f = [;0.096798166000;0.143459740000;0.208317990000;-0.038018393000;0.148793230000;0.512799550000;-0.120798510000;0.177158750000;0.083816932000;0.000756494710;0.006887211700;0.213572840000;0.493783350000;0.035274935000;0.243769090000;0.087417919000;0.476797600000;0.271438160000;0.178877000000;0.302770820000;0.219586200000;0.397548740000;0.215089090000;0.086588415000;0.304056660000;0.513946170000;0.113409000000;0.270068060000;0.471061630000;0.046628439000;0.443157150000;0.477349380000;0.411852220000;0.280063680000;0.410626170000;0.442082230000;0.585090200000;0.561297160000;0.426446760000;0.739395540000;0.506414480000;0.409925250000;0.483992110000;0.696575460000;0.615166110000;0.737349800000;0.632542540000;1.013287300000;0.408451860000;0.613835270000;0.681370910000;0.724988310000;0.947395900000;0.779004190000;0.745667780000;0.789666080000;0.908202240000;0.707755840000;0.894037990000;0.606428220000;0.843615470000;0.727874550000;0.784348430000;0.937189250000;0.737952220000;0.769620390000;0.701166820000;0.604155740000;0.924881630000;1.130475900000;0.936493470000;0.935667120000;0.819976810000;1.219958800000;0.949769640000;1.185254200000;1.048672000000;0.957402250000;1.160938800000;1.147023700000;0.983283410000;1.194051400000;1.265849000000;0.987167510000;0.956395550000;1.052589900000;1.041239900000;1.105649800000;0.941725790000;1.082398200000;1.127045200000;0.990602660000;0.980803460000;0.763155870000;0.768571290000;0.718186990000;0.743430540000;0.899271220000;0.672586160000;1.243876900000;1.009891400000;0.580803050000;0.709665650000;0.858643730000;0.609667610000;0.789520360000;1.014111700000;0.817911210000;0.824534040000;0.676622590000;0.735885580000;0.609022520000;0.859070820000;0.729465540000;0.907844320000;0.969161960000;0.938595000000;0.765435590000;0.688922170000;0.574990840000;0.770659830000;0.891310740000;0.690971710000;0.711048000000;0.824634750000;0.857126400000;0.510549630000;0.748820900000;0.744129450000;0.688191070000;0.841053850000;0.648943870000;0.576231820000;0.738291460000;0.762720980000;0.658108930000;0.807248650000;0.457323660000;0.521077750000;0.218860160000;0.755337450000;0.525976310000;0.634217410000;0.821176590000;0.675074910000;0.599022390000;0.535501720000;0.624415250000;0.748616920000;0.428448630000;0.643341520000;0.768654000000;0.435878620000;0.747073780000;0.746823840000;0.509674810000;0.413964070000;0.702246380000;0.756141550000;0.719368010000;0.744580020000;0.450466060000;0.713008860000;0.536099090000;0.536595750000;0.385158420000;0.781369420000;0.640457830000;0.762680940000;0.836824400000;0.437730550000;0.703038130000;0.603083350000;0.740709380000;0.768477480000;0.724346000000;0.477804350000;0.580883120000;0.639146320000;1.073252500000;0.783713950000;0.948384040000;0.663369380000;0.634232460000;0.696070360000;0.526957260000;0.794798220000;0.587766610000;0.408654360000;0.749043110000;0.387306230000;0.350567280000;0.675537030000;0.495158740000;0.507149810000;0.625867220000;0.583647850000;0.630796900000;0.712643020000;0.504536230000;0.504499780000;0.381836730000;0.647114640000;0.814415180000;0.618741310000;0.808727320000;0.824111580000;0.901249190000;0.910594790000;0.668334220000;0.652467030000;0.797380800000;0.699257390000;1.025428600000;1.022629700000;0.837597600000;0.766407010000;0.913657810000;0.744506570000;0.829397600000;0.773018020000;0.872046570000;1.028215500000;0.972177970000;1.033239200000;0.724398150000;0.887466840000;0.710846670000;0.912868530000;0.899725750000;1.039970600000;1.003988400000;0.929601600000;0.747319110000;0.742110530000;0.495198080000;0.724133980000;0.546209190000;0.904975290000;0.886555800000;0.756973180000;0.663691170000;0.725449860000;0.927661000000;0.871628610000;0.583857660000;0.657822350000;0.445564610000;0.654537190000;0.685853290000;0.690412010000;0.306045040000;0.591718740000;0.366728870000;0.420310670000;0.575582700000;0.482907520000;0.394669790000;0.491601190000;0.627475460000;0.270874460000;0.144405290000;0.155561360000;0.171715630000;0.196642150000;0.368318080000;-0.046015957000;0.287831380000;0.121822920000;0.390236930000;0.084253654000;0.201575720000;0.048222309000;0.075602342000;0.128340910000;0.123106810000;0.069294711000;0.308367180000;0.213239800000;0.401070710000;0.073746174000;0.268322470000;-0.213145400000;0.191332180000;0.145485930000;0.028213679000;0.183566020000;0.206160990000 ]; +%User Line: y = [;0.096798166000;0.143459740000;0.208317990000;-0.038018393000;0.148793230000;0.512799550000;-0.120798510000;0.177158750000;0.083816932000;0.000756494710;0.006887211700;0.213572840000;0.493783350000;0.035274935000;0.243769090000;0.087417919000;0.476797600000;0.271438160000;0.178877000000;0.302770820000;0.219586200000;0.397548740000;0.215089090000;0.086588415000;0.304056660000;0.513946170000;0.113409000000;0.270068060000;0.471061630000;0.046628439000;0.443157150000;0.477349380000;0.411852220000;0.280063680000;0.410626170000;0.442082230000;0.585090200000;0.561297160000;0.426446760000;0.739395540000;0.506414480000;0.409925250000;0.483992110000;0.696575460000;0.615166110000;0.737349800000;0.632542540000;1.013287300000;0.408451860000;0.613835270000;0.681370910000;0.724988310000;0.947395900000;0.779004190000;0.745667780000;0.789666080000;0.908202240000;0.707755840000;0.894037990000;0.606428220000;0.843615470000;0.727874550000;0.784348430000;0.937189250000;0.737952220000;0.769620390000;0.701166820000;0.604155740000;0.924881630000;1.130475900000;0.936493470000;0.935667120000;0.819976810000;1.219958800000;0.949769640000;1.185254200000;1.048672000000;0.957402250000;1.160938800000;1.147023700000;0.983283410000;1.194051400000;1.265849000000;0.987167510000;0.956395550000;1.052589900000;1.041239900000;1.105649800000;0.941725790000;1.082398200000;1.127045200000;0.990602660000;0.980803460000;0.763155870000;0.768571290000;0.718186990000;0.743430540000;0.899271220000;0.672586160000;1.243876900000;1.009891400000;0.580803050000;0.709665650000;0.858643730000;0.609667610000;0.789520360000;1.014111700000;0.817911210000;0.824534040000;0.676622590000;0.735885580000;0.609022520000;0.859070820000;0.729465540000;0.907844320000;0.969161960000;0.938595000000;0.765435590000;0.688922170000;0.574990840000;0.770659830000;0.891310740000;0.690971710000;0.711048000000;0.824634750000;0.857126400000;0.510549630000;0.748820900000;0.744129450000;0.688191070000;0.841053850000;0.648943870000;0.576231820000;0.738291460000;0.762720980000;0.658108930000;0.807248650000;0.457323660000;0.521077750000;0.218860160000;0.755337450000;0.525976310000;0.634217410000;0.821176590000;0.675074910000;0.599022390000;0.535501720000;0.624415250000;0.748616920000;0.428448630000;0.643341520000;0.768654000000;0.435878620000;0.747073780000;0.746823840000;0.509674810000;0.413964070000;0.702246380000;0.756141550000;0.719368010000;0.744580020000;0.450466060000;0.713008860000;0.536099090000;0.536595750000;0.385158420000;0.781369420000;0.640457830000;0.762680940000;0.836824400000;0.437730550000;0.703038130000;0.603083350000;0.740709380000;0.768477480000;0.724346000000;0.477804350000;0.580883120000;0.639146320000;1.073252500000;0.783713950000;0.948384040000;0.663369380000;0.634232460000;0.696070360000;0.526957260000;0.794798220000;0.587766610000;0.408654360000;0.749043110000;0.387306230000;0.350567280000;0.675537030000;0.495158740000;0.507149810000;0.625867220000;0.583647850000;0.630796900000;0.712643020000;0.504536230000;0.504499780000;0.381836730000;0.647114640000;0.814415180000;0.618741310000;0.808727320000;0.824111580000;0.901249190000;0.910594790000;0.668334220000;0.652467030000;0.797380800000;0.699257390000;1.025428600000;1.022629700000;0.837597600000;0.766407010000;0.913657810000;0.744506570000;0.829397600000;0.773018020000;0.872046570000;1.028215500000;0.972177970000;1.033239200000;0.724398150000;0.887466840000;0.710846670000;0.912868530000;0.899725750000;1.039970600000;1.003988400000;0.929601600000;0.747319110000;0.742110530000;0.495198080000;0.724133980000;0.546209190000;0.904975290000;0.886555800000;0.756973180000;0.663691170000;0.725449860000;0.927661000000;0.871628610000;0.583857660000;0.657822350000;0.445564610000;0.654537190000;0.685853290000;0.690412010000;0.306045040000;0.591718740000;0.366728870000;0.420310670000;0.575582700000;0.482907520000;0.394669790000;0.491601190000;0.627475460000;0.270874460000;0.144405290000;0.155561360000;0.171715630000;0.196642150000;0.368318080000;-0.046015957000;0.287831380000;0.121822920000;0.390236930000;0.084253654000;0.201575720000;0.048222309000;0.075602342000;0.128340910000;0.123106810000;0.069294711000;0.308367180000;0.213239800000;0.401070710000;0.073746174000;0.268322470000;-0.213145400000;0.191332180000;0.145485930000;0.028213679000;0.183566020000;0.206160990000 ]; +%User Line: % compute MSE of prediction on all ( X( i ) , y( i ) ) +v.f = 0; +% Deriv 1 Line: v.f = 0; +%User Line: v = 0; +cadaforvar1.f = 1:N.f; +% Deriv 1 Line: cadaforvar1.f = 1:N.f; +%User Line: cadaforvar1 = 1 : N; +v.dw = Gator2Data.Data3; +% Deriv 1 Line: v.dw = zeros(76,1); +v.dwdw = zeros(5776,1); +for cadaforcount1 = 1:288 + i.f = cadaforvar1.f(:,cadaforcount1); + % Deriv 1 Line: i.f = cadaforvar1.f(:,cadaforcount1); + %User Line: i = cadaforvar1(:,cadaforcount1); + cadainput2_1.dw = w.dw; + % Deriv 1 Line: cadainput2_1.dw = w.dw; + cadainput2_1.f = w.f; + % Deriv 1 Line: cadainput2_1.f = w.f; + %User Line: cadainput2_1 = w; + cadainput2_2.f = X.f(i.f); + % Deriv 1 Line: cadainput2_2.f = X.f(i.f); + %User Line: cadainput2_2 = X( i ); + cadaoutput2_1 = ADiGator_roughNN(cadainput2_1,cadainput2_2); + % Call to function: ADiGator_roughNN + % Call to function: roughNN + cada1f1 = y.f(i.f); + % Deriv 1 Line: cada1f1 = y.f(i.f); + cada1f2dwdw = -cadaoutput2_1.dwdw; + cada1f2dw = uminus(cadaoutput2_1.dw); + % Deriv 1 Line: cada1f2dw = -cadaoutput2_1.dw; + cada1f2 = cada1f1 - cadaoutput2_1.f; + % Deriv 1 Line: cada1f2 = cada1f1 - cadaoutput2_1.f; + cada2f1dw = 1.*cada1f2.^(1-1).*cada1f2dw; + cada2f1 = cada1f2^1; + cada2f2dw = 2.*cada2f1dw; + cada2f2 = 2*cada2f1; + cada2tempdw = cada2f2dw(Gator2Data.Index1); + cada2tf1 = cada1f2dw(Gator2Data.Index2); + cada2td1 = cada2tf1(:).*cada2tempdw; + cada2td1(Gator2Data.Index3) = cada2td1(Gator2Data.Index3) + cada2f2.*cada1f2dwdw; + cada1f3dwdw = cada2td1; + cada1f3dw = cada2f2*cada1f2dw; + % Deriv 1 Line: cada1f3dw = 2.*cada1f2.^(2-1).*cada1f2dw; + cada1f3 = cada1f2^2; + % Deriv 1 Line: cada1f3 = cada1f2^2; + cada1td1dw = v.dwdw; cada1td1 = v.dw; + % Deriv 1 Line: cada1td1 = v.dw; + cada2td1 = cada1td1dw; + cada2td1 = cada2td1 + cada1f3dwdw; + cada1td1dw = cada2td1; + cada1td1 = cada1td1 + cada1f3dw; + % Deriv 1 Line: cada1td1 = cada1td1 + cada1f3dw; + v.dwdw = cada1td1dw; v.dw = cada1td1; + % Deriv 1 Line: v.dw = cada1td1; + v.f = v.f + cada1f3; + % Deriv 1 Line: v.f = v.f + cada1f3; + %User Line: v = v + ( y( i ) - cadaoutput2_1 )^2; +end +v.dwdw = v.dwdw./2; +v.dw = v.dw/2; +% Deriv 1 Line: v.dw = v.dw./2; +v.f = v.f/2; +% Deriv 1 Line: v.f = v.f/2; +%User Line: v = v / 2; +v.dw_size = 76; +% Deriv 1 Line: v.dw_size = 76; +v.dw_location = Gator1Data.Index1; +% Deriv 1 Line: v.dw_location = Gator1Data.Index1; +v.dwdw_size = [v.dw_size,76]; +v.dwdw_location = [v.dw_location(Gator2Data.Index4,:), Gator2Data.Index5]; +end +function v = ADiGator_roughNN(w,x) +global ADiGator_testNN_ADiGatorHes +Gator1Data = ADiGator_testNN_ADiGatorHes.ADiGator_roughNN.Gator1Data; +Gator2Data = ADiGator_testNN_ADiGatorHes.ADiGator_roughNN.Gator2Data; +% ADiGator Start Derivative Computations +%User Line: % +%User Line: % v = roughNN( w , x ) +%User Line: % +%User Line: % returns the falue of the function v = f( x ) as currently estimated by +%User Line: % a small NN with 1 input, 1 output, 3 hidden layers of 5 nodes each, and +%User Line: % tanh activation function. +%User Line: % +%User Line: % Input: +%User Line: % +%User Line: % - w is the [ 76 x 1 ] real vector containing the weights of the NN, +%User Line: % i.e., w is made as follows: +%User Line: % [ 1 .. 5 ] are the [ 5 x 1 ] weigths of the first layer +%User Line: % [ 6 .. 10 ] are the [ 5 x 1 ] biases of the first layer +%User Line: % [ 11 .. 35 ] are the [ 5 x 5 ] weigths of the second layer +%User Line: % [ 36 .. 40 ] are the [ 5 x 1 ] biases of the second layer +%User Line: % [ 41 .. 65 ] are the [ 5 x 5 ] weigths of the third layer +%User Line: % [ 66 .. 70 ] are the [ 5 x 1 ] biases of the third layer +%User Line: % [ 71 .. 75 ] are the [ 5 x 1 ] weigths of the fourth (output) layer +%User Line: % [ 76 ] is the [ 1 x 1 ] bias of the fourth (output) layer +%User Line: % +%User Line: % - x is the real scalar containing the input of f() +%User Line: % +%User Line: % Output: +%User Line: % +%User Line: % - v (real, scalar): v = f( x ) as estimated by the NN with weights w +%User Line: % +%User Line: %{ +%User Line: % ======================================= +%User Line: % Author: Antonio Frangioni +%User Line: % Date: 28-08-22 +%User Line: % Version 1.00 +%User Line: % Copyright Antonio Frangioni +%User Line: % ======================================= +%User Line: %} +cada1f2 = Gator1Data.Data1*x.f; +% Deriv 1 Line: cada1f2 = Gator1Data.Data1*x.f; +cada1f3dw = w.dw(Gator1Data.Index1); +% Deriv 1 Line: cada1f3dw = w.dw(Gator1Data.Index1); +cada1f3 = w.f(Gator1Data.Index9); +% Deriv 1 Line: cada1f3 = w.f(Gator1Data.Index9); +cada2f1 = cada1f2(:); +cada1f4dw = cada2f1.*cada1f3dw; +% Deriv 1 Line: cada1f4dw = cada1f2(:).*cada1f3dw; +cada1f4 = cada1f2.*cada1f3; +% Deriv 1 Line: cada1f4 = cada1f2.*cada1f3; +cada1f5dw = w.dw(Gator1Data.Index2); +% Deriv 1 Line: cada1f5dw = w.dw(Gator1Data.Index2); +cada1f5 = w.f(Gator1Data.Index10); +% Deriv 1 Line: cada1f5 = w.f(Gator1Data.Index10); +cada1td1 = zeros(10,1); +% Deriv 1 Line: cada1td1 = zeros(10,1); +cada1td1(Gator1Data.Index11) = cada1f4dw; +% Deriv 1 Line: cada1td1(Gator1Data.Index11) = cada1f4dw; +cada2f1 = cada1td1(Gator1Data.Index12); +cada2f2 = cada2f1 + cada1f5dw; +cada1td1(Gator1Data.Index12) = cada2f2; +% Deriv 1 Line: cada1td1(Gator1Data.Index12) = cada1td1(Gator1Data.Index12) + cada1f5dw; +cada1f6dw = cada1td1; +% Deriv 1 Line: cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +% Deriv 1 Line: cada1f6 = cada1f4 + cada1f5; +cada1tf1dw = cada1f6dw(Gator2Data.Index1); +cada1tf1 = cada1f6(Gator1Data.Index13); +% Deriv 1 Line: cada1tf1 = cada1f6(Gator1Data.Index13); +cada2f1dw = cada1tf1dw(Gator2Data.Index2); +cada2f1 = cada1tf1(:); +cada2tf1 = cada2f1(Gator2Data.Index28); +cada2f2dw = -sech(cada2tf1(:)).*tanh(cada2tf1(:)).*cada2f1dw; +cada2f2 = sech(cada2f1); +cada2tf2 = cada2f2(Gator2Data.Index29); +cada2f3dw = 2.*cada2tf2(:).^(2-1).*cada2f2dw; +cada2f3 = cada2f2.^2; +cada2tf1 = cada1f6dw(Gator2Data.Index30); +g.dwdw = cada2tf1(:).*cada2f3dw; +g.dw = cada2f3.*cada1f6dw; +% Deriv 1 Line: g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +% Deriv 1 Line: g.f = tanh(cada1f6); +%User Line: g = tanh( ( ones( 5 , 1 ) * x ) .* w( 1 : 5 ) + w( 6 : 10 ) ); +cada1f1dw = w.dw(Gator1Data.Index3); +% Deriv 1 Line: cada1f1dw = w.dw(Gator1Data.Index3); +cada1f1 = w.f(Gator1Data.Index14); +% Deriv 1 Line: cada1f1 = w.f(Gator1Data.Index14); +cada1f2dw = cada1f1dw; +% Deriv 1 Line: cada1f2dw = cada1f1dw; +cada1f2 = reshape(cada1f1,5,5); +% Deriv 1 Line: cada1f2 = reshape(cada1f1,5,5); +cada1f3 = 5; +% Deriv 1 Line: cada1f3 = 5; +cada1td2 = zeros(5,25); +% Deriv 1 Line: cada1td2 = zeros(5,25); +cada1td2(Gator1Data.Index15) = cada1f2dw; +% Deriv 1 Line: cada1td2(Gator1Data.Index15) = cada1f2dw; +cada2f1dw = g.dw; +cada2f1 = g.f.'; +cada2td1 = zeros(5,10); +cada2td1(Gator2Data.Index31) = cada2f1dw; +cada2td1 = cada1td2.'*cada2td1; +cada2td1 = cada2td1(:); +cada1td2dw = cada2td1(Gator2Data.Index32); +cada1td2 = cada2f1*cada1td2; +% Deriv 1 Line: cada1td2 = g.f.'*cada1td2; +cada1td1 = zeros(75,1); +cada1td1dw = zeros(200,1); +% Deriv 1 Line: cada1td1 = zeros(75,1); +cada2f1dw = cada1td2dw(Gator2Data.Index3); +cada2f1 = cada1td2(Gator1Data.Index16); +cada1td1dw(logical(Gator2Data.Index16)) = cada2f1dw(nonzeros(Gator2Data.Index16)); +cada1td1(Gator1Data.Index17) = cada2f1; +% Deriv 1 Line: cada1td1(Gator1Data.Index17) = cada1td2(Gator1Data.Index16); +cada1td2 = zeros(5,10); +cada1td2dw = zeros(20,1); +% Deriv 1 Line: cada1td2 = zeros(5,10); +cada1td2dw = g.dwdw(Gator2Data.Index17); +cada1td2(Gator1Data.Index18) = g.dw; +% Deriv 1 Line: cada1td2(Gator1Data.Index18) = g.dw; +cada2td2 = zeros(5,25); +cada2td2(Gator2Data.Index33) = cada1f2dw; +cada2td2 = cada1td2.'*cada2td2; +cada2td1 = zeros(150,1); +cada2td1(Gator2Data.Index35) = cada2td2(Gator2Data.Index34); +cada2td2 = zeros(5,20); +cada2td2(Gator2Data.Index36) = cada1td2dw; +cada2td2 = cada1f2*cada2td2; +cada2td2 = cada2td2(:); +cada2td1(Gator2Data.Index38) = cada2td1(Gator2Data.Index38) + cada2td2(Gator2Data.Index37); +cada1td2dw = cada2td1; +cada1td2 = cada1f2*cada1td2; +% Deriv 1 Line: cada1td2 = cada1f2*cada1td2; +cada1td2dw = cada1td2dw(Gator2Data.Index4); +cada1td2 = cada1td2(:); +% Deriv 1 Line: cada1td2 = cada1td2(:); +cada2f1 = cada1td1(Gator1Data.Index20); +cada2f2dw = cada1td2dw(Gator2Data.Index5); +cada2f2 = cada1td2(Gator1Data.Index19); +cada2f3dw = cada2f2dw; +cada2f3 = cada2f1 + cada2f2; +cada1td1dw(logical(Gator2Data.Index18)) = cada2f3dw(nonzeros(Gator2Data.Index18)); +cada1td1(Gator1Data.Index20) = cada2f3; +% Deriv 1 Line: cada1td1(Gator1Data.Index20) = cada1td1(Gator1Data.Index20) + cada1td2(Gator1Data.Index19); +cada1f4dwdw = cada1td1dw; cada1f4dw = cada1td1; +% Deriv 1 Line: cada1f4dw = cada1td1; +cada1f4 = cada1f2*g.f; +% Deriv 1 Line: cada1f4 = cada1f2*g.f; +cada1f5dw = w.dw(Gator1Data.Index4); +% Deriv 1 Line: cada1f5dw = w.dw(Gator1Data.Index4); +cada1f5 = w.f(Gator1Data.Index21); +% Deriv 1 Line: cada1f5 = w.f(Gator1Data.Index21); +cada1td1 = zeros(80,1); +cada1td1dw = zeros(200,1); +% Deriv 1 Line: cada1td1 = zeros(80,1); +cada1td1dw = cada1f4dwdw(Gator2Data.Index19); +cada1td1(Gator1Data.Index22) = cada1f4dw; +% Deriv 1 Line: cada1td1(Gator1Data.Index22) = cada1f4dw; +cada2f1 = cada1td1(Gator1Data.Index23); +cada2f2 = cada2f1 + cada1f5dw; +cada1td1(Gator1Data.Index23) = cada2f2; +% Deriv 1 Line: cada1td1(Gator1Data.Index23) = cada1td1(Gator1Data.Index23) + cada1f5dw; +cada1f6dwdw = cada1td1dw; cada1f6dw = cada1td1; +% Deriv 1 Line: cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +% Deriv 1 Line: cada1f6 = cada1f4 + cada1f5; +cada1tf1dw = cada1f6dw(Gator2Data.Index6); +cada1tf1 = cada1f6(Gator1Data.Index24); +% Deriv 1 Line: cada1tf1 = cada1f6(Gator1Data.Index24); +cada2f1dw = cada1tf1dw(Gator2Data.Index7); +cada2f1 = cada1tf1(:); +cada2tf1 = cada2f1(Gator2Data.Index39); +cada2f2dw = -sech(cada2tf1(:)).*tanh(cada2tf1(:)).*cada2f1dw; +cada2f2 = sech(cada2f1); +cada2tf2 = cada2f2(Gator2Data.Index40); +cada2f3dw = 2.*cada2tf2(:).^(2-1).*cada2f2dw; +cada2f3 = cada2f2.^2; +cada2tf1 = cada1f6dw(Gator2Data.Index41); +cada2td1 = cada2tf1(:).*cada2f3dw; +cada2tf1 = cada2f3(Gator2Data.Index42); +cada2td1(Gator2Data.Index43) = cada2td1(Gator2Data.Index43) + cada2tf1(:).*cada1f6dwdw; +g.dwdw = cada2td1; +g.dw = cada2f3.*cada1f6dw; +% Deriv 1 Line: g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +% Deriv 1 Line: g.f = tanh(cada1f6); +%User Line: g = tanh( reshape( w( 11 : 35 ) , [ 5 5 ] ) * g + w( 36 : 40 ) ); +cada1f1dw = w.dw(Gator1Data.Index5); +% Deriv 1 Line: cada1f1dw = w.dw(Gator1Data.Index5); +cada1f1 = w.f(Gator1Data.Index25); +% Deriv 1 Line: cada1f1 = w.f(Gator1Data.Index25); +cada1f2dw = cada1f1dw; +% Deriv 1 Line: cada1f2dw = cada1f1dw; +cada1f2 = reshape(cada1f1,5,5); +% Deriv 1 Line: cada1f2 = reshape(cada1f1,5,5); +cada1f3 = 5; +% Deriv 1 Line: cada1f3 = 5; +cada1td2 = zeros(5,25); +% Deriv 1 Line: cada1td2 = zeros(5,25); +cada1td2(Gator1Data.Index26) = cada1f2dw; +% Deriv 1 Line: cada1td2(Gator1Data.Index26) = cada1f2dw; +cada2f1dw = g.dw; +cada2f1 = g.f.'; +cada2td1 = zeros(5,40); +cada2td1(Gator2Data.Index44) = cada2f1dw; +cada2td1 = cada1td2.'*cada2td1; +cada2td1 = cada2td1(:); +cada1td2dw = cada2td1(Gator2Data.Index45); +cada1td2 = cada2f1*cada1td2; +% Deriv 1 Line: cada1td2 = g.f.'*cada1td2; +cada1td1 = zeros(225,1); +cada1td1dw = zeros(5200,1); +% Deriv 1 Line: cada1td1 = zeros(225,1); +cada2f1dw = cada1td2dw(Gator2Data.Index8); +cada2f1 = cada1td2(Gator1Data.Index27); +cada1td1dw(logical(Gator2Data.Index20)) = cada2f1dw(nonzeros(Gator2Data.Index20)); +cada1td1(Gator1Data.Index28) = cada2f1; +% Deriv 1 Line: cada1td1(Gator1Data.Index28) = cada1td2(Gator1Data.Index27); +cada1td2 = zeros(5,40); +cada1td2dw = zeros(1280,1); +% Deriv 1 Line: cada1td2 = zeros(5,40); +cada1td2dw = g.dwdw(Gator2Data.Index21); +cada1td2(Gator1Data.Index29) = g.dw; +% Deriv 1 Line: cada1td2(Gator1Data.Index29) = g.dw; +cada2td2 = zeros(5,25); +cada2td2(Gator2Data.Index46) = cada1f2dw; +cada2td2 = cada1td2.'*cada2td2; +cada2td1 = zeros(4800,1); +cada2td1(Gator2Data.Index48) = cada2td2(Gator2Data.Index47); +cada2td2 = sparse(Gator2Data.Index49,Gator2Data.Index50,cada1td2dw,5,880); +cada2td2 = cada1f2*cada2td2; +cada2td2 = cada2td2(:); +cada2td1(Gator2Data.Index52) = cada2td1(Gator2Data.Index52) + cada2td2(Gator2Data.Index51); +cada1td2dw = cada2td1; +cada1td2 = cada1f2*cada1td2; +% Deriv 1 Line: cada1td2 = cada1f2*cada1td2; +cada1td2dw = cada1td2dw(Gator2Data.Index9); +cada1td2 = cada1td2(:); +% Deriv 1 Line: cada1td2 = cada1td2(:); +cada2f1 = cada1td1(Gator1Data.Index31); +cada2f2dw = cada1td2dw(Gator2Data.Index10); +cada2f2 = cada1td2(Gator1Data.Index30); +cada2f3dw = cada2f2dw; +cada2f3 = cada2f1 + cada2f2; +cada1td1dw(logical(Gator2Data.Index22)) = cada2f3dw(nonzeros(Gator2Data.Index22)); +cada1td1(Gator1Data.Index31) = cada2f3; +% Deriv 1 Line: cada1td1(Gator1Data.Index31) = cada1td1(Gator1Data.Index31) + cada1td2(Gator1Data.Index30); +cada1f4dwdw = cada1td1dw; cada1f4dw = cada1td1; +% Deriv 1 Line: cada1f4dw = cada1td1; +cada1f4 = cada1f2*g.f; +% Deriv 1 Line: cada1f4 = cada1f2*g.f; +cada1f5dw = w.dw(Gator1Data.Index6); +% Deriv 1 Line: cada1f5dw = w.dw(Gator1Data.Index6); +cada1f5 = w.f(Gator1Data.Index32); +% Deriv 1 Line: cada1f5 = w.f(Gator1Data.Index32); +cada1td1 = zeros(230,1); +cada1td1dw = zeros(5200,1); +% Deriv 1 Line: cada1td1 = zeros(230,1); +cada1td1dw = cada1f4dwdw(Gator2Data.Index23); +cada1td1(Gator1Data.Index33) = cada1f4dw; +% Deriv 1 Line: cada1td1(Gator1Data.Index33) = cada1f4dw; +cada2f1 = cada1td1(Gator1Data.Index34); +cada2f2 = cada2f1 + cada1f5dw; +cada1td1(Gator1Data.Index34) = cada2f2; +% Deriv 1 Line: cada1td1(Gator1Data.Index34) = cada1td1(Gator1Data.Index34) + cada1f5dw; +cada1f6dwdw = cada1td1dw; cada1f6dw = cada1td1; +% Deriv 1 Line: cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +% Deriv 1 Line: cada1f6 = cada1f4 + cada1f5; +cada1tf1dw = cada1f6dw(Gator2Data.Index11); +cada1tf1 = cada1f6(Gator1Data.Index35); +% Deriv 1 Line: cada1tf1 = cada1f6(Gator1Data.Index35); +cada2f1dw = cada1tf1dw(Gator2Data.Index12); +cada2f1 = cada1tf1(:); +cada2tf1 = cada2f1(Gator2Data.Index53); +cada2f2dw = -sech(cada2tf1(:)).*tanh(cada2tf1(:)).*cada2f1dw; +cada2f2 = sech(cada2f1); +cada2tf2 = cada2f2(Gator2Data.Index54); +cada2f3dw = 2.*cada2tf2(:).^(2-1).*cada2f2dw; +cada2f3 = cada2f2.^2; +cada2tf1 = cada1f6dw(Gator2Data.Index55); +cada2td1 = cada2tf1(:).*cada2f3dw; +cada2tf1 = cada2f3(Gator2Data.Index56); +cada2td1(Gator2Data.Index57) = cada2td1(Gator2Data.Index57) + cada2tf1(:).*cada1f6dwdw; +g.dwdw = cada2td1; +g.dw = cada2f3.*cada1f6dw; +% Deriv 1 Line: g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +% Deriv 1 Line: g.f = tanh(cada1f6); +%User Line: g = tanh( reshape( w( 41 : 65 ) , [ 5 5 ] ) * g + w( 66 : 70 ) ); +cada1f1dw = w.dw(Gator1Data.Index7); +% Deriv 1 Line: cada1f1dw = w.dw(Gator1Data.Index7); +cada1f1 = w.f(Gator1Data.Index36); +% Deriv 1 Line: cada1f1 = w.f(Gator1Data.Index36); +cada1f2dwdw = g.dwdw; cada1f2dw = g.dw; +% Deriv 1 Line: cada1f2dw = g.dw; +cada1f2 = g.f.'; +% Deriv 1 Line: cada1f2 = g.f.'; +cada1f3 = 5; +% Deriv 1 Line: cada1f3 = 5; +cada2td1 = zeros(10580,1); +cada2td1 = cada1f2dwdw(Gator2Data.Index27); +cada1td2dw = cada2td1; +cada1td2 = sparse(Gator1Data.Index37,Gator1Data.Index38,cada1f2dw,5,70); +% Deriv 1 Line: cada1td2 = sparse(Gator1Data.Index37,Gator1Data.Index38,cada1f2dw,5,70); +cada2f1dw = cada1f1dw; +cada2f1 = cada1f1.'; +cada2td2 = zeros(5,5); +cada2td2(Gator2Data.Index58) = cada2f1dw; +cada2td2 = cada1td2.'*cada2td2; +cada2td1 = zeros(4410,1); +cada2td1(Gator2Data.Index60) = cada2td2(Gator2Data.Index59); +cada2td2 = sparse(Gator2Data.Index61,Gator2Data.Index62,cada1td2dw,5,4180); +cada2td2 = cada2f1*cada2td2; +cada2td2 = cada2td2(:); +cada2td1(Gator2Data.Index64) = cada2td1(Gator2Data.Index64) + cada2td2(Gator2Data.Index63); +cada1td2dw = cada2td1; +cada1td2 = cada2f1*cada1td2; +% Deriv 1 Line: cada1td2 = cada1f1.'*cada1td2; +cada1td1 = zeros(75,1); +cada1td1dw = zeros(4640,1); +% Deriv 1 Line: cada1td1 = zeros(75,1); +cada2f1dw = cada1td2dw(Gator2Data.Index13); +cada2f1 = cada1td2(Gator1Data.Index39); +cada1td1dw(logical(Gator2Data.Index24)) = cada2f1dw(nonzeros(Gator2Data.Index24)); +cada1td1(Gator1Data.Index40) = cada2f1; +% Deriv 1 Line: cada1td1(Gator1Data.Index40) = cada1td2(Gator1Data.Index39); +cada1td2 = zeros(5,5); +% Deriv 1 Line: cada1td2 = zeros(5,5); +cada1td2(Gator1Data.Index41) = cada1f1dw; +% Deriv 1 Line: cada1td2(Gator1Data.Index41) = cada1f1dw; +cada2td1 = sparse(Gator2Data.Index65,Gator2Data.Index66,cada1f2dw,5,70); +cada2td1 = cada1td2.'*cada2td1; +cada2td1 = cada2td1(:); +cada1td2dw = full(cada2td1(Gator2Data.Index67)); +cada1td2 = cada1f2*cada1td2; +% Deriv 1 Line: cada1td2 = cada1f2*cada1td2; +cada1td2dw = cada1td2dw(Gator2Data.Index14); +cada1td2 = cada1td2(:); +% Deriv 1 Line: cada1td2 = cada1td2(:); +cada2f1 = cada1td1(Gator1Data.Index43); +cada2f2dw = cada1td2dw(Gator2Data.Index15); +cada2f2 = cada1td2(Gator1Data.Index42); +cada2f3dw = cada2f2dw; +cada2f3 = cada2f1 + cada2f2; +cada1td1dw(logical(Gator2Data.Index25)) = cada2f3dw(nonzeros(Gator2Data.Index25)); +cada1td1(Gator1Data.Index43) = cada2f3; +% Deriv 1 Line: cada1td1(Gator1Data.Index43) = cada1td1(Gator1Data.Index43) + cada1td2(Gator1Data.Index42); +cada1f4dwdw = cada1td1dw; cada1f4dw = cada1td1; +% Deriv 1 Line: cada1f4dw = cada1td1; +cada1f4 = cada1f2*cada1f1; +% Deriv 1 Line: cada1f4 = cada1f2*cada1f1; +cada1f5dw = w.dw(Gator1Data.Index8); +% Deriv 1 Line: cada1f5dw = w.dw(Gator1Data.Index8); +cada1f5 = w.f(76); +% Deriv 1 Line: cada1f5 = w.f(76); +cada1td1 = zeros(76,1); +cada1td1dw = zeros(4640,1); +% Deriv 1 Line: cada1td1 = zeros(76,1); +cada1td1dw = cada1f4dwdw(Gator2Data.Index26); +cada1td1(Gator1Data.Index44) = cada1f4dw; +% Deriv 1 Line: cada1td1(Gator1Data.Index44) = cada1f4dw; +cada2f1 = cada1td1(76); +cada2f2 = cada2f1 + cada1f5dw; +cada1td1(76) = cada2f2; +% Deriv 1 Line: cada1td1(76) = cada1td1(76) + cada1f5dw; +v.dwdw = cada1td1dw; v.dw = cada1td1; +% Deriv 1 Line: v.dw = cada1td1; +v.f = cada1f4 + cada1f5; +% Deriv 1 Line: v.f = cada1f4 + cada1f5; +%User Line: v = g' * w( 71 : 75 ) + w( 76 ); +end + + +function ADiGator_LoadData() +global ADiGator_testNN_ADiGatorHes +ADiGator_testNN_ADiGatorHes = load('testNN_ADiGatorHes.mat'); +return +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN_ADiGatorHes.mat b/11-09/TestFunctions Matlab/testNN_ADiGatorHes.mat new file mode 100644 index 0000000..49646ff Binary files /dev/null and b/11-09/TestFunctions Matlab/testNN_ADiGatorHes.mat differ diff --git a/11-09/TestFunctions Matlab/testNN_ADiGatorJac.m b/11-09/TestFunctions Matlab/testNN_ADiGatorJac.m new file mode 100644 index 0000000..7ad591b --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN_ADiGatorJac.m @@ -0,0 +1,227 @@ +% This code was generated using ADiGator version 1.4 +% ©2010-2014 Matthew J. Weinstein and Anil V. Rao +% ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +% Contact: mweinstein@ufl.edu +% Bugs/suggestions may be reported to the sourceforge forums +% DISCLAIMER +% ADiGator is a general-purpose software distributed under the GNU General +% Public License version 3.0. While the software is distributed with the +% hope that it will be useful, both the software and generated code are +% provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +% or fitness for any purpose or application. + +function v = testNN_ADiGatorJac(w) +global ADiGator_testNN_ADiGatorJac +if isempty(ADiGator_testNN_ADiGatorJac); ADiGator_LoadData(); end +Gator1Data = ADiGator_testNN_ADiGatorJac.testNN_ADiGatorJac.Gator1Data; +% ADiGator Start Derivative Computations +%User Line: % +%User Line: % v = testNN( w ) +%User Line: % +%User Line: % returns the falue of the empirical error of the NN (or, in fact, +%User Line: % whatever function is encoded in 'roughNN()') with the weights contained +%User Line: % in w. +%User Line: % +%User Line: % The empirical error is estimated over a 288-strong input/output pair +%User Line: % ( X , y ), with X containing only one feature, that is hard-coded into +%User Line: % the function so that its gradient can be easily computed by ADiGator. +%User Line: % +%User Line: % Input: +%User Line: % +%User Line: % - w is the real vector containing the weights of the NN, see roughNN +%User Line: % for details +%User Line: % +%User Line: % Output: +%User Line: % +%User Line: % - the MSE of the error done by roughNN() on the given test set +%User Line: % +%User Line: %{ +%User Line: % ======================================= +%User Line: % Author: Antonio Frangioni +%User Line: % Date: 28-08-22 +%User Line: % Version 1.00 +%User Line: % Copyright Antonio Frangioni +%User Line: % ======================================= +%User Line: %} +N.f = 288; +%User Line: N = 288; +%User Line: % inputs +X.f = [;0.0000000000000000;0.0034843205574913;0.0069686411149826;0.0104529616724739;0.0139372822299652;0.0174216027874564;0.0209059233449477;0.0243902439024390;0.0278745644599303;0.0313588850174216;0.0348432055749129;0.0383275261324042;0.0418118466898955;0.0452961672473868;0.0487804878048781;0.0522648083623693;0.0557491289198606;0.0592334494773519;0.0627177700348432;0.0662020905923345;0.0696864111498258;0.0731707317073171;0.0766550522648084;0.0801393728222996;0.0836236933797909;0.0871080139372822;0.0905923344947735;0.0940766550522648;0.0975609756097561;0.1010452961672474;0.1045296167247387;0.1080139372822300;0.1114982578397213;0.1149825783972125;0.1184668989547038;0.1219512195121951;0.1254355400696864;0.1289198606271777;0.1324041811846690;0.1358885017421603;0.1393728222996516;0.1428571428571428;0.1463414634146341;0.1498257839721254;0.1533101045296167;0.1567944250871080;0.1602787456445993;0.1637630662020906;0.1672473867595819;0.1707317073170732;0.1742160278745645;0.1777003484320558;0.1811846689895470;0.1846689895470383;0.1881533101045296;0.1916376306620209;0.1951219512195122;0.1986062717770035;0.2020905923344948;0.2055749128919861;0.2090592334494774;0.2125435540069686;0.2160278745644599;0.2195121951219512;0.2229965156794425;0.2264808362369338;0.2299651567944251;0.2334494773519164;0.2369337979094077;0.2404181184668990;0.2439024390243902;0.2473867595818815;0.2508710801393728;0.2543554006968641;0.2578397212543554;0.2613240418118467;0.2648083623693380;0.2682926829268293;0.2717770034843205;0.2752613240418119;0.2787456445993031;0.2822299651567944;0.2857142857142857;0.2891986062717770;0.2926829268292683;0.2961672473867596;0.2996515679442509;0.3031358885017422;0.3066202090592334;0.3101045296167247;0.3135888501742160;0.3170731707317073;0.3205574912891986;0.3240418118466899;0.3275261324041812;0.3310104529616725;0.3344947735191638;0.3379790940766551;0.3414634146341464;0.3449477351916376;0.3484320557491289;0.3519163763066202;0.3554006968641115;0.3588850174216028;0.3623693379790941;0.3658536585365854;0.3693379790940767;0.3728222996515679;0.3763066202090593;0.3797909407665505;0.3832752613240418;0.3867595818815331;0.3902439024390244;0.3937282229965157;0.3972125435540070;0.4006968641114982;0.4041811846689896;0.4076655052264808;0.4111498257839721;0.4146341463414634;0.4181184668989547;0.4216027874564460;0.4250871080139373;0.4285714285714285;0.4320557491289199;0.4355400696864111;0.4390243902439024;0.4425087108013937;0.4459930313588850;0.4494773519163763;0.4529616724738676;0.4564459930313589;0.4599303135888502;0.4634146341463415;0.4668989547038327;0.4703832752613241;0.4738675958188153;0.4773519163763066;0.4808362369337979;0.4843205574912892;0.4878048780487805;0.4912891986062718;0.4947735191637631;0.4982578397212544;0.5017421602787456;0.5052264808362370;0.5087108013937283;0.5121951219512195;0.5156794425087108;0.5191637630662020;0.5226480836236933;0.5261324041811847;0.5296167247386759;0.5331010452961673;0.5365853658536586;0.5400696864111498;0.5435540069686411;0.5470383275261324;0.5505226480836236;0.5540069686411150;0.5574912891986064;0.5609756097560976;0.5644599303135889;0.5679442508710801;0.5714285714285714;0.5749128919860627;0.5783972125435540;0.5818815331010453;0.5853658536585367;0.5888501742160279;0.5923344947735192;0.5958188153310104;0.5993031358885017;0.6027874564459930;0.6062717770034843;0.6097560975609756;0.6132404181184670;0.6167247386759582;0.6202090592334495;0.6236933797909407;0.6271777003484320;0.6306620209059233;0.6341463414634146;0.6376306620209059;0.6411149825783973;0.6445993031358885;0.6480836236933798;0.6515679442508711;0.6550522648083623;0.6585365853658536;0.6620209059233449;0.6655052264808362;0.6689895470383276;0.6724738675958188;0.6759581881533101;0.6794425087108014;0.6829268292682926;0.6864111498257840;0.6898954703832753;0.6933797909407666;0.6968641114982579;0.7003484320557491;0.7038327526132404;0.7073170731707317;0.7108013937282229;0.7142857142857143;0.7177700348432056;0.7212543554006969;0.7247386759581882;0.7282229965156795;0.7317073170731707;0.7351916376306620;0.7386759581881532;0.7421602787456446;0.7456445993031359;0.7491289198606272;0.7526132404181185;0.7560975609756098;0.7595818815331010;0.7630662020905923;0.7665505226480837;0.7700348432055749;0.7735191637630662;0.7770034843205575;0.7804878048780488;0.7839721254355401;0.7874564459930313;0.7909407665505226;0.7944250871080140;0.7979094076655052;0.8013937282229965;0.8048780487804879;0.8083623693379791;0.8118466898954704;0.8153310104529616;0.8188153310104529;0.8222996515679443;0.8257839721254355;0.8292682926829268;0.8327526132404182;0.8362369337979094;0.8397212543554007;0.8432055749128919;0.8466898954703833;0.8501742160278746;0.8536585365853658;0.8571428571428572;0.8606271777003485;0.8641114982578397;0.8675958188153310;0.8710801393728222;0.8745644599303136;0.8780487804878049;0.8815331010452961;0.8850174216027875;0.8885017421602788;0.8919860627177700;0.8954703832752613;0.8989547038327526;0.9024390243902439;0.9059233449477352;0.9094076655052264;0.9128919860627178;0.9163763066202091;0.9198606271777003;0.9233449477351916;0.9268292682926830;0.9303135888501742;0.9337979094076655;0.9372822299651568;0.9407665505226481;0.9442508710801394;0.9477351916376306;0.9512195121951219;0.9547038327526133;0.9581881533101045;0.9616724738675958;0.9651567944250871;0.9686411149825784;0.9721254355400697;0.9756097560975610;0.9790940766550522;0.9825783972125436;0.9860627177700348;0.9895470383275261;0.9930313588850174;0.9965156794425087;1.0000000000000000 ]; +%User Line: X = [;0.0000000000000000;0.0034843205574913;0.0069686411149826;0.0104529616724739;0.0139372822299652;0.0174216027874564;0.0209059233449477;0.0243902439024390;0.0278745644599303;0.0313588850174216;0.0348432055749129;0.0383275261324042;0.0418118466898955;0.0452961672473868;0.0487804878048781;0.0522648083623693;0.0557491289198606;0.0592334494773519;0.0627177700348432;0.0662020905923345;0.0696864111498258;0.0731707317073171;0.0766550522648084;0.0801393728222996;0.0836236933797909;0.0871080139372822;0.0905923344947735;0.0940766550522648;0.0975609756097561;0.1010452961672474;0.1045296167247387;0.1080139372822300;0.1114982578397213;0.1149825783972125;0.1184668989547038;0.1219512195121951;0.1254355400696864;0.1289198606271777;0.1324041811846690;0.1358885017421603;0.1393728222996516;0.1428571428571428;0.1463414634146341;0.1498257839721254;0.1533101045296167;0.1567944250871080;0.1602787456445993;0.1637630662020906;0.1672473867595819;0.1707317073170732;0.1742160278745645;0.1777003484320558;0.1811846689895470;0.1846689895470383;0.1881533101045296;0.1916376306620209;0.1951219512195122;0.1986062717770035;0.2020905923344948;0.2055749128919861;0.2090592334494774;0.2125435540069686;0.2160278745644599;0.2195121951219512;0.2229965156794425;0.2264808362369338;0.2299651567944251;0.2334494773519164;0.2369337979094077;0.2404181184668990;0.2439024390243902;0.2473867595818815;0.2508710801393728;0.2543554006968641;0.2578397212543554;0.2613240418118467;0.2648083623693380;0.2682926829268293;0.2717770034843205;0.2752613240418119;0.2787456445993031;0.2822299651567944;0.2857142857142857;0.2891986062717770;0.2926829268292683;0.2961672473867596;0.2996515679442509;0.3031358885017422;0.3066202090592334;0.3101045296167247;0.3135888501742160;0.3170731707317073;0.3205574912891986;0.3240418118466899;0.3275261324041812;0.3310104529616725;0.3344947735191638;0.3379790940766551;0.3414634146341464;0.3449477351916376;0.3484320557491289;0.3519163763066202;0.3554006968641115;0.3588850174216028;0.3623693379790941;0.3658536585365854;0.3693379790940767;0.3728222996515679;0.3763066202090593;0.3797909407665505;0.3832752613240418;0.3867595818815331;0.3902439024390244;0.3937282229965157;0.3972125435540070;0.4006968641114982;0.4041811846689896;0.4076655052264808;0.4111498257839721;0.4146341463414634;0.4181184668989547;0.4216027874564460;0.4250871080139373;0.4285714285714285;0.4320557491289199;0.4355400696864111;0.4390243902439024;0.4425087108013937;0.4459930313588850;0.4494773519163763;0.4529616724738676;0.4564459930313589;0.4599303135888502;0.4634146341463415;0.4668989547038327;0.4703832752613241;0.4738675958188153;0.4773519163763066;0.4808362369337979;0.4843205574912892;0.4878048780487805;0.4912891986062718;0.4947735191637631;0.4982578397212544;0.5017421602787456;0.5052264808362370;0.5087108013937283;0.5121951219512195;0.5156794425087108;0.5191637630662020;0.5226480836236933;0.5261324041811847;0.5296167247386759;0.5331010452961673;0.5365853658536586;0.5400696864111498;0.5435540069686411;0.5470383275261324;0.5505226480836236;0.5540069686411150;0.5574912891986064;0.5609756097560976;0.5644599303135889;0.5679442508710801;0.5714285714285714;0.5749128919860627;0.5783972125435540;0.5818815331010453;0.5853658536585367;0.5888501742160279;0.5923344947735192;0.5958188153310104;0.5993031358885017;0.6027874564459930;0.6062717770034843;0.6097560975609756;0.6132404181184670;0.6167247386759582;0.6202090592334495;0.6236933797909407;0.6271777003484320;0.6306620209059233;0.6341463414634146;0.6376306620209059;0.6411149825783973;0.6445993031358885;0.6480836236933798;0.6515679442508711;0.6550522648083623;0.6585365853658536;0.6620209059233449;0.6655052264808362;0.6689895470383276;0.6724738675958188;0.6759581881533101;0.6794425087108014;0.6829268292682926;0.6864111498257840;0.6898954703832753;0.6933797909407666;0.6968641114982579;0.7003484320557491;0.7038327526132404;0.7073170731707317;0.7108013937282229;0.7142857142857143;0.7177700348432056;0.7212543554006969;0.7247386759581882;0.7282229965156795;0.7317073170731707;0.7351916376306620;0.7386759581881532;0.7421602787456446;0.7456445993031359;0.7491289198606272;0.7526132404181185;0.7560975609756098;0.7595818815331010;0.7630662020905923;0.7665505226480837;0.7700348432055749;0.7735191637630662;0.7770034843205575;0.7804878048780488;0.7839721254355401;0.7874564459930313;0.7909407665505226;0.7944250871080140;0.7979094076655052;0.8013937282229965;0.8048780487804879;0.8083623693379791;0.8118466898954704;0.8153310104529616;0.8188153310104529;0.8222996515679443;0.8257839721254355;0.8292682926829268;0.8327526132404182;0.8362369337979094;0.8397212543554007;0.8432055749128919;0.8466898954703833;0.8501742160278746;0.8536585365853658;0.8571428571428572;0.8606271777003485;0.8641114982578397;0.8675958188153310;0.8710801393728222;0.8745644599303136;0.8780487804878049;0.8815331010452961;0.8850174216027875;0.8885017421602788;0.8919860627177700;0.8954703832752613;0.8989547038327526;0.9024390243902439;0.9059233449477352;0.9094076655052264;0.9128919860627178;0.9163763066202091;0.9198606271777003;0.9233449477351916;0.9268292682926830;0.9303135888501742;0.9337979094076655;0.9372822299651568;0.9407665505226481;0.9442508710801394;0.9477351916376306;0.9512195121951219;0.9547038327526133;0.9581881533101045;0.9616724738675958;0.9651567944250871;0.9686411149825784;0.9721254355400697;0.9756097560975610;0.9790940766550522;0.9825783972125436;0.9860627177700348;0.9895470383275261;0.9930313588850174;0.9965156794425087;1.0000000000000000 ]; +%User Line: % outputs +y.f = [;0.096798166000;0.143459740000;0.208317990000;-0.038018393000;0.148793230000;0.512799550000;-0.120798510000;0.177158750000;0.083816932000;0.000756494710;0.006887211700;0.213572840000;0.493783350000;0.035274935000;0.243769090000;0.087417919000;0.476797600000;0.271438160000;0.178877000000;0.302770820000;0.219586200000;0.397548740000;0.215089090000;0.086588415000;0.304056660000;0.513946170000;0.113409000000;0.270068060000;0.471061630000;0.046628439000;0.443157150000;0.477349380000;0.411852220000;0.280063680000;0.410626170000;0.442082230000;0.585090200000;0.561297160000;0.426446760000;0.739395540000;0.506414480000;0.409925250000;0.483992110000;0.696575460000;0.615166110000;0.737349800000;0.632542540000;1.013287300000;0.408451860000;0.613835270000;0.681370910000;0.724988310000;0.947395900000;0.779004190000;0.745667780000;0.789666080000;0.908202240000;0.707755840000;0.894037990000;0.606428220000;0.843615470000;0.727874550000;0.784348430000;0.937189250000;0.737952220000;0.769620390000;0.701166820000;0.604155740000;0.924881630000;1.130475900000;0.936493470000;0.935667120000;0.819976810000;1.219958800000;0.949769640000;1.185254200000;1.048672000000;0.957402250000;1.160938800000;1.147023700000;0.983283410000;1.194051400000;1.265849000000;0.987167510000;0.956395550000;1.052589900000;1.041239900000;1.105649800000;0.941725790000;1.082398200000;1.127045200000;0.990602660000;0.980803460000;0.763155870000;0.768571290000;0.718186990000;0.743430540000;0.899271220000;0.672586160000;1.243876900000;1.009891400000;0.580803050000;0.709665650000;0.858643730000;0.609667610000;0.789520360000;1.014111700000;0.817911210000;0.824534040000;0.676622590000;0.735885580000;0.609022520000;0.859070820000;0.729465540000;0.907844320000;0.969161960000;0.938595000000;0.765435590000;0.688922170000;0.574990840000;0.770659830000;0.891310740000;0.690971710000;0.711048000000;0.824634750000;0.857126400000;0.510549630000;0.748820900000;0.744129450000;0.688191070000;0.841053850000;0.648943870000;0.576231820000;0.738291460000;0.762720980000;0.658108930000;0.807248650000;0.457323660000;0.521077750000;0.218860160000;0.755337450000;0.525976310000;0.634217410000;0.821176590000;0.675074910000;0.599022390000;0.535501720000;0.624415250000;0.748616920000;0.428448630000;0.643341520000;0.768654000000;0.435878620000;0.747073780000;0.746823840000;0.509674810000;0.413964070000;0.702246380000;0.756141550000;0.719368010000;0.744580020000;0.450466060000;0.713008860000;0.536099090000;0.536595750000;0.385158420000;0.781369420000;0.640457830000;0.762680940000;0.836824400000;0.437730550000;0.703038130000;0.603083350000;0.740709380000;0.768477480000;0.724346000000;0.477804350000;0.580883120000;0.639146320000;1.073252500000;0.783713950000;0.948384040000;0.663369380000;0.634232460000;0.696070360000;0.526957260000;0.794798220000;0.587766610000;0.408654360000;0.749043110000;0.387306230000;0.350567280000;0.675537030000;0.495158740000;0.507149810000;0.625867220000;0.583647850000;0.630796900000;0.712643020000;0.504536230000;0.504499780000;0.381836730000;0.647114640000;0.814415180000;0.618741310000;0.808727320000;0.824111580000;0.901249190000;0.910594790000;0.668334220000;0.652467030000;0.797380800000;0.699257390000;1.025428600000;1.022629700000;0.837597600000;0.766407010000;0.913657810000;0.744506570000;0.829397600000;0.773018020000;0.872046570000;1.028215500000;0.972177970000;1.033239200000;0.724398150000;0.887466840000;0.710846670000;0.912868530000;0.899725750000;1.039970600000;1.003988400000;0.929601600000;0.747319110000;0.742110530000;0.495198080000;0.724133980000;0.546209190000;0.904975290000;0.886555800000;0.756973180000;0.663691170000;0.725449860000;0.927661000000;0.871628610000;0.583857660000;0.657822350000;0.445564610000;0.654537190000;0.685853290000;0.690412010000;0.306045040000;0.591718740000;0.366728870000;0.420310670000;0.575582700000;0.482907520000;0.394669790000;0.491601190000;0.627475460000;0.270874460000;0.144405290000;0.155561360000;0.171715630000;0.196642150000;0.368318080000;-0.046015957000;0.287831380000;0.121822920000;0.390236930000;0.084253654000;0.201575720000;0.048222309000;0.075602342000;0.128340910000;0.123106810000;0.069294711000;0.308367180000;0.213239800000;0.401070710000;0.073746174000;0.268322470000;-0.213145400000;0.191332180000;0.145485930000;0.028213679000;0.183566020000;0.206160990000 ]; +%User Line: y = [;0.096798166000;0.143459740000;0.208317990000;-0.038018393000;0.148793230000;0.512799550000;-0.120798510000;0.177158750000;0.083816932000;0.000756494710;0.006887211700;0.213572840000;0.493783350000;0.035274935000;0.243769090000;0.087417919000;0.476797600000;0.271438160000;0.178877000000;0.302770820000;0.219586200000;0.397548740000;0.215089090000;0.086588415000;0.304056660000;0.513946170000;0.113409000000;0.270068060000;0.471061630000;0.046628439000;0.443157150000;0.477349380000;0.411852220000;0.280063680000;0.410626170000;0.442082230000;0.585090200000;0.561297160000;0.426446760000;0.739395540000;0.506414480000;0.409925250000;0.483992110000;0.696575460000;0.615166110000;0.737349800000;0.632542540000;1.013287300000;0.408451860000;0.613835270000;0.681370910000;0.724988310000;0.947395900000;0.779004190000;0.745667780000;0.789666080000;0.908202240000;0.707755840000;0.894037990000;0.606428220000;0.843615470000;0.727874550000;0.784348430000;0.937189250000;0.737952220000;0.769620390000;0.701166820000;0.604155740000;0.924881630000;1.130475900000;0.936493470000;0.935667120000;0.819976810000;1.219958800000;0.949769640000;1.185254200000;1.048672000000;0.957402250000;1.160938800000;1.147023700000;0.983283410000;1.194051400000;1.265849000000;0.987167510000;0.956395550000;1.052589900000;1.041239900000;1.105649800000;0.941725790000;1.082398200000;1.127045200000;0.990602660000;0.980803460000;0.763155870000;0.768571290000;0.718186990000;0.743430540000;0.899271220000;0.672586160000;1.243876900000;1.009891400000;0.580803050000;0.709665650000;0.858643730000;0.609667610000;0.789520360000;1.014111700000;0.817911210000;0.824534040000;0.676622590000;0.735885580000;0.609022520000;0.859070820000;0.729465540000;0.907844320000;0.969161960000;0.938595000000;0.765435590000;0.688922170000;0.574990840000;0.770659830000;0.891310740000;0.690971710000;0.711048000000;0.824634750000;0.857126400000;0.510549630000;0.748820900000;0.744129450000;0.688191070000;0.841053850000;0.648943870000;0.576231820000;0.738291460000;0.762720980000;0.658108930000;0.807248650000;0.457323660000;0.521077750000;0.218860160000;0.755337450000;0.525976310000;0.634217410000;0.821176590000;0.675074910000;0.599022390000;0.535501720000;0.624415250000;0.748616920000;0.428448630000;0.643341520000;0.768654000000;0.435878620000;0.747073780000;0.746823840000;0.509674810000;0.413964070000;0.702246380000;0.756141550000;0.719368010000;0.744580020000;0.450466060000;0.713008860000;0.536099090000;0.536595750000;0.385158420000;0.781369420000;0.640457830000;0.762680940000;0.836824400000;0.437730550000;0.703038130000;0.603083350000;0.740709380000;0.768477480000;0.724346000000;0.477804350000;0.580883120000;0.639146320000;1.073252500000;0.783713950000;0.948384040000;0.663369380000;0.634232460000;0.696070360000;0.526957260000;0.794798220000;0.587766610000;0.408654360000;0.749043110000;0.387306230000;0.350567280000;0.675537030000;0.495158740000;0.507149810000;0.625867220000;0.583647850000;0.630796900000;0.712643020000;0.504536230000;0.504499780000;0.381836730000;0.647114640000;0.814415180000;0.618741310000;0.808727320000;0.824111580000;0.901249190000;0.910594790000;0.668334220000;0.652467030000;0.797380800000;0.699257390000;1.025428600000;1.022629700000;0.837597600000;0.766407010000;0.913657810000;0.744506570000;0.829397600000;0.773018020000;0.872046570000;1.028215500000;0.972177970000;1.033239200000;0.724398150000;0.887466840000;0.710846670000;0.912868530000;0.899725750000;1.039970600000;1.003988400000;0.929601600000;0.747319110000;0.742110530000;0.495198080000;0.724133980000;0.546209190000;0.904975290000;0.886555800000;0.756973180000;0.663691170000;0.725449860000;0.927661000000;0.871628610000;0.583857660000;0.657822350000;0.445564610000;0.654537190000;0.685853290000;0.690412010000;0.306045040000;0.591718740000;0.366728870000;0.420310670000;0.575582700000;0.482907520000;0.394669790000;0.491601190000;0.627475460000;0.270874460000;0.144405290000;0.155561360000;0.171715630000;0.196642150000;0.368318080000;-0.046015957000;0.287831380000;0.121822920000;0.390236930000;0.084253654000;0.201575720000;0.048222309000;0.075602342000;0.128340910000;0.123106810000;0.069294711000;0.308367180000;0.213239800000;0.401070710000;0.073746174000;0.268322470000;-0.213145400000;0.191332180000;0.145485930000;0.028213679000;0.183566020000;0.206160990000 ]; +%User Line: % compute MSE of prediction on all ( X( i ) , y( i ) ) +v.f = 0; +%User Line: v = 0; +cadaforvar1.f = 1:N.f; +%User Line: cadaforvar1 = 1 : N; +v.dw = zeros(76,1); +for cadaforcount1 = 1:288 + i.f = cadaforvar1.f(:,cadaforcount1); + %User Line: i = cadaforvar1(:,cadaforcount1); + cadainput2_1.dw = w.dw; cadainput2_1.f = w.f; + %User Line: cadainput2_1 = w; + cadainput2_2.f = X.f(i.f); + %User Line: cadainput2_2 = X( i ); + cadaoutput2_1 = ADiGator_roughNN(cadainput2_1,cadainput2_2); + % Call to function: roughNN + cada1f1 = y.f(i.f); + cada1f2dw = -cadaoutput2_1.dw; + cada1f2 = cada1f1 - cadaoutput2_1.f; + cada1f3dw = 2.*cada1f2.^(2-1).*cada1f2dw; + cada1f3 = cada1f2^2; + cada1td1 = v.dw; + cada1td1 = cada1td1 + cada1f3dw; + v.dw = cada1td1; + v.f = v.f + cada1f3; + %User Line: v = v + ( y( i ) - cadaoutput2_1 )^2; +end +v.dw = v.dw./2; +v.f = v.f/2; +%User Line: v = v / 2; +v.dw_size = 76; +v.dw_location = Gator1Data.Index1; +end +function v = ADiGator_roughNN(w,x) +global ADiGator_testNN_ADiGatorJac +Gator1Data = ADiGator_testNN_ADiGatorJac.ADiGator_roughNN.Gator1Data; +% ADiGator Start Derivative Computations +%User Line: % +%User Line: % v = roughNN( w , x ) +%User Line: % +%User Line: % returns the falue of the function v = f( x ) as currently estimated by +%User Line: % a small NN with 1 input, 1 output, 3 hidden layers of 5 nodes each, and +%User Line: % tanh activation function. +%User Line: % +%User Line: % Input: +%User Line: % +%User Line: % - w is the [ 76 x 1 ] real vector containing the weights of the NN, +%User Line: % i.e., w is made as follows: +%User Line: % [ 1 .. 5 ] are the [ 5 x 1 ] weigths of the first layer +%User Line: % [ 6 .. 10 ] are the [ 5 x 1 ] biases of the first layer +%User Line: % [ 11 .. 35 ] are the [ 5 x 5 ] weigths of the second layer +%User Line: % [ 36 .. 40 ] are the [ 5 x 1 ] biases of the second layer +%User Line: % [ 41 .. 65 ] are the [ 5 x 5 ] weigths of the third layer +%User Line: % [ 66 .. 70 ] are the [ 5 x 1 ] biases of the third layer +%User Line: % [ 71 .. 75 ] are the [ 5 x 1 ] weigths of the fourth (output) layer +%User Line: % [ 76 ] is the [ 1 x 1 ] bias of the fourth (output) layer +%User Line: % +%User Line: % - x is the real scalar containing the input of f() +%User Line: % +%User Line: % Output: +%User Line: % +%User Line: % - v (real, scalar): v = f( x ) as estimated by the NN with weights w +%User Line: % +%User Line: %{ +%User Line: % ======================================= +%User Line: % Author: Antonio Frangioni +%User Line: % Date: 28-08-22 +%User Line: % Version 1.00 +%User Line: % Copyright Antonio Frangioni +%User Line: % ======================================= +%User Line: %} +cada1f2 = Gator1Data.Data1*x.f; +cada1f3dw = w.dw(Gator1Data.Index1); +cada1f3 = w.f(Gator1Data.Index9); +cada1f4dw = cada1f2(:).*cada1f3dw; +cada1f4 = cada1f2.*cada1f3; +cada1f5dw = w.dw(Gator1Data.Index2); +cada1f5 = w.f(Gator1Data.Index10); +cada1td1 = zeros(10,1); +cada1td1(Gator1Data.Index11) = cada1f4dw; +cada1td1(Gator1Data.Index12) = cada1td1(Gator1Data.Index12) + cada1f5dw; +cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +cada1tf1 = cada1f6(Gator1Data.Index13); +g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +%User Line: g = tanh( ( ones( 5 , 1 ) * x ) .* w( 1 : 5 ) + w( 6 : 10 ) ); +cada1f1dw = w.dw(Gator1Data.Index3); +cada1f1 = w.f(Gator1Data.Index14); +cada1f2dw = cada1f1dw; +cada1f2 = reshape(cada1f1,5,5); +cada1f3 = 5; +cada1td2 = zeros(5,25); +cada1td2(Gator1Data.Index15) = cada1f2dw; +cada1td2 = g.f.'*cada1td2; +cada1td1 = zeros(75,1); +cada1td1(Gator1Data.Index17) = cada1td2(Gator1Data.Index16); +cada1td2 = zeros(5,10); +cada1td2(Gator1Data.Index18) = g.dw; +cada1td2 = cada1f2*cada1td2; +cada1td2 = cada1td2(:); +cada1td1(Gator1Data.Index20) = cada1td1(Gator1Data.Index20) + cada1td2(Gator1Data.Index19); +cada1f4dw = cada1td1; +cada1f4 = cada1f2*g.f; +cada1f5dw = w.dw(Gator1Data.Index4); +cada1f5 = w.f(Gator1Data.Index21); +cada1td1 = zeros(80,1); +cada1td1(Gator1Data.Index22) = cada1f4dw; +cada1td1(Gator1Data.Index23) = cada1td1(Gator1Data.Index23) + cada1f5dw; +cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +cada1tf1 = cada1f6(Gator1Data.Index24); +g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +%User Line: g = tanh( reshape( w( 11 : 35 ) , [ 5 5 ] ) * g + w( 36 : 40 ) ); +cada1f1dw = w.dw(Gator1Data.Index5); +cada1f1 = w.f(Gator1Data.Index25); +cada1f2dw = cada1f1dw; +cada1f2 = reshape(cada1f1,5,5); +cada1f3 = 5; +cada1td2 = zeros(5,25); +cada1td2(Gator1Data.Index26) = cada1f2dw; +cada1td2 = g.f.'*cada1td2; +cada1td1 = zeros(225,1); +cada1td1(Gator1Data.Index28) = cada1td2(Gator1Data.Index27); +cada1td2 = zeros(5,40); +cada1td2(Gator1Data.Index29) = g.dw; +cada1td2 = cada1f2*cada1td2; +cada1td2 = cada1td2(:); +cada1td1(Gator1Data.Index31) = cada1td1(Gator1Data.Index31) + cada1td2(Gator1Data.Index30); +cada1f4dw = cada1td1; +cada1f4 = cada1f2*g.f; +cada1f5dw = w.dw(Gator1Data.Index6); +cada1f5 = w.f(Gator1Data.Index32); +cada1td1 = zeros(230,1); +cada1td1(Gator1Data.Index33) = cada1f4dw; +cada1td1(Gator1Data.Index34) = cada1td1(Gator1Data.Index34) + cada1f5dw; +cada1f6dw = cada1td1; +cada1f6 = cada1f4 + cada1f5; +cada1tf1 = cada1f6(Gator1Data.Index35); +g.dw = sech(cada1tf1(:)).^2.*cada1f6dw; +g.f = tanh(cada1f6); +%User Line: g = tanh( reshape( w( 41 : 65 ) , [ 5 5 ] ) * g + w( 66 : 70 ) ); +cada1f1dw = w.dw(Gator1Data.Index7); +cada1f1 = w.f(Gator1Data.Index36); +cada1f2dw = g.dw; +cada1f2 = g.f.'; +cada1f3 = 5; +cada1td2 = sparse(Gator1Data.Index37,Gator1Data.Index38,cada1f2dw,5,70); +cada1td2 = cada1f1.'*cada1td2; +cada1td1 = zeros(75,1); +cada1td1(Gator1Data.Index40) = cada1td2(Gator1Data.Index39); +cada1td2 = zeros(5,5); +cada1td2(Gator1Data.Index41) = cada1f1dw; +cada1td2 = cada1f2*cada1td2; +cada1td2 = cada1td2(:); +cada1td1(Gator1Data.Index43) = cada1td1(Gator1Data.Index43) + cada1td2(Gator1Data.Index42); +cada1f4dw = cada1td1; +cada1f4 = cada1f2*cada1f1; +cada1f5dw = w.dw(Gator1Data.Index8); +cada1f5 = w.f(76); +cada1td1 = zeros(76,1); +cada1td1(Gator1Data.Index44) = cada1f4dw; +cada1td1(76) = cada1td1(76) + cada1f5dw; +v.dw = cada1td1; +v.f = cada1f4 + cada1f5; +%User Line: v = g' * w( 71 : 75 ) + w( 76 ); +end + + +function ADiGator_LoadData() +global ADiGator_testNN_ADiGatorJac +ADiGator_testNN_ADiGatorJac = load('testNN_ADiGatorJac.mat'); +return +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN_ADiGatorJac.mat b/11-09/TestFunctions Matlab/testNN_ADiGatorJac.mat new file mode 100644 index 0000000..05b389f Binary files /dev/null and b/11-09/TestFunctions Matlab/testNN_ADiGatorJac.mat differ diff --git a/11-09/TestFunctions Matlab/testNN_Grd.m b/11-09/TestFunctions Matlab/testNN_Grd.m new file mode 100644 index 0000000..9518ff5 --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN_Grd.m @@ -0,0 +1,21 @@ +% function [Grd,Fun] = testNN_Grd(w) +% +% Gradient wrapper file generated by ADiGator +% ©2010-2014 Matthew J. Weinstein and Anil V. Rao +% ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +% Contact: mweinstein@ufl.edu +% Bugs/suggestions may be reported to the sourceforge forums +% DISCLAIMER +% ADiGator is a general-purpose software distributed under the GNU General +% Public License version 3.0. While the software is distributed with the +% hope that it will be useful, both the software and generated code are +% provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +% or fitness for any purpose or application. + +function [Grd,Fun] = testNN_Grd(w) +gator_w.f = w; +gator_w.dw = ones(76,1); +v = testNN_ADiGatorGrd(gator_w); +Grd = reshape(v.dw,[1 76]); +Fun = v.f; +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN_Hes.m b/11-09/TestFunctions Matlab/testNN_Hes.m new file mode 100644 index 0000000..280e29a --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN_Hes.m @@ -0,0 +1,25 @@ +% function [Grd,Fun] = testNN_Grd(w) +% +% Gradient wrapper file generated by ADiGator +% ©2010-2014 Matthew J. Weinstein and Anil V. Rao +% ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +% Contact: mweinstein@ufl.edu +% Bugs/suggestions may be reported to the sourceforge forums +% DISCLAIMER +% ADiGator is a general-purpose software distributed under the GNU General +% Public License version 3.0. While the software is distributed with the +% hope that it will be useful, both the software and generated code are +% provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +% or fitness for any purpose or application. + +function [Hes,Grd,Fun] = testNN_Hes(w) +gator_w.f = w; +gator_w.dw = ones(76,1); +v = testNN_ADiGatorHes(gator_w); +xind1 = v.dwdw_location(:,1); +xind2 = v.dwdw_location(:,2); +Hes = zeros(76,76); +Hes((xind2-1)*76 + xind1) = v.dwdw; +Grd = reshape(v.dw,[1 76]); +Fun = v.f; +end \ No newline at end of file diff --git a/11-09/TestFunctions Matlab/testNN_Jac.m b/11-09/TestFunctions Matlab/testNN_Jac.m new file mode 100644 index 0000000..14ef2c7 --- /dev/null +++ b/11-09/TestFunctions Matlab/testNN_Jac.m @@ -0,0 +1,21 @@ +% function [Jac,Fun] = testNN_Jac(w) +% +% Jacobian wrapper file generated by ADiGator +% ©2010-2014 Matthew J. Weinstein and Anil V. Rao +% ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +% Contact: mweinstein@ufl.edu +% Bugs/suggestions may be reported to the sourceforge forums +% DISCLAIMER +% ADiGator is a general-purpose software distributed under the GNU General +% Public License version 3.0. While the software is distributed with the +% hope that it will be useful, both the software and generated code are +% provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +% or fitness for any purpose or application. + +function [Jac,Fun] = testNN_Jac(w) +gator_w.f = w; +gator_w.dw = ones(76,1); +v = testNN_ADiGatorJac(gator_w); +Jac = reshape(v.dw,[1 76]); +Fun = v.f; +end \ No newline at end of file diff --git a/11-09/TestFunctions/TestFunctions.jl b/11-09/TestFunctions/TestFunctions.jl new file mode 100644 index 0000000..4bdd006 --- /dev/null +++ b/11-09/TestFunctions/TestFunctions.jl @@ -0,0 +1,372 @@ +using LinearAlgebra: I, eigvals + +function TestFunctions() + + # function TF = TestFunctions() + # + # Produces a cell array of function handlers, useful to test unconstrained + # optimization algorithms. + # + # Each function in the array has the following interface: + # + # [ v , varargout ] = f( x ) + # + # Input: + # + # - x is either a [ n x 1 ] real (column) vector denoting the input of + # f(), or [] (empty). + # + # Output: + # + # - v (real, scalar): if x == [] this is the best known lower bound on + # the unconstrained global optimum of f(); it can be -Inf if either f() + # is not bounded below, or no such information is available. If x ~= [] + # then v = f(x). + # + # - g (real, [ n x 1 ] real vector) is the first optional argument. This + # also depends on x. if x == [] this is the standard starting point of an + # optimization algorithm, otherwise it is the gradient of f() at x, or a + # subgradient if f() is not differentiable at x. + # + # - H (real, [ n x n ] real matrix) is the first optional argument. This + # must only be specified if x ~= [], and it is the Hessian of f() at x. + # If no such information is available, the function throws error. + # + # The current list of functions is the following: + # + # 1 Standard 2x2 PSD quadratic function with nicely conditioned Hessian. + # + # 2 Standard 2x2 PSD quadratic function with less nicely conditioned + # Hessian. + # + # 3 Standard 2x2 PSD quadratic function with Hessian having one zero + # eigenvalue. + # + # 4 Standard 2x2 quadratic function with indefinite Hessian (one positive + # and one negative eigenvalue) + # + # 5 Standard 2x2 quadratic function with "very elongated" Hessian (a + # very small positive minimum eigenvalue, the other much larger) + # + # 6 the 2-dim Rosenbrock function + # + # 7 the "six-hump camel" function + # + # 8 the Ackley function + # + # 9 a 2-dim nondifferentiable function coming from Lasso regularization + # + # 10 a 76-dim (nonconvex, differentiable) function coming from a fitting + # problem with ( X , y ) both [ 288 , 1 ] (i.e., a fitting with only + # one feature) using a "rough" NN with 1 input, 1 output, 3 hidden + # layers of 5 nodes each, and tanh activation function + # + # 11 same as 10 plus a 1e-4 || x ||^2 / 2 ridge stabilising term + # + #{ + # ======================================= + # Author: Antonio Frangioni + # Date: 08-11-18 + # Version 1.01 + # Copyright Antonio Frangioni + # ======================================= + #} + + TF = [] + push!(TF, x -> genericquad([6 -2; -2 6], [10; 5], x)) + # eigenvalues: 4, 8 + push!(TF, x -> genericquad([5 -3; -3 5], [10; 5], x)) + # eigenvalues: 2, 8 + push!(TF, x -> genericquad([4 -4; -4 4], [10; 5], x)) + # eigenvalues: 0, 8 + push!(TF, x -> genericquad([3 -5; -5 3], [10; 5], x)) + # eigenvalues: -2, 8 + push!(TF, x -> genericquad([101 -99; -99 101], [10; 5], x)) + # eigenvalues: 2, 200 + # HBG: alpha = 0.0165 , beta = 0.678 + push!(TF, rosenbrock) + push!(TF, sixhumpcamel) + push!(TF, ackley) + push!(TF, lasso) + push!(TF, myNN) + push!(TF, myNN2) + return TF +end + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function genericquad(Q, q, x::Union{Nothing, Real}) + # generic quadratic function f(x) = x' * Q * x / 2 + q' * x + + if x === nothing # informative call + if minimum(eigvals(Q)) > 1e-14 + xStar = Q \ -q + v = 0.5 * xStar' * Q * xStar + q' * xStar + else + v = -Inf + end + return (v, zeros(size(q)), zeros(size(Q))) + else + if size(x) ≠ (2, 1) + throw(ArgumentError("genericquad: x is of wrong size")) + end + v = 0.5 * x' * Q * x + q' * x # f(x) + return (v, Q * x + q, Q) + end +end # genericquad + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function rosenbrock(x::Union{Nothing, AbstractVecOrMat}) + # rosenbrock's valley-shaped function + # syms x y + # f = @(x, y) 100 * ( y - x^2 )^2 + ( x - 1 )^2 + # + # diff( f , x ) + # 2 * x - 400 * x * ( - x^2 + y ) - 2 + # + # diff( f , y ) + # - 200 * x^2 + 200 * y + # + # diff( f , x , 2 ) + # 1200 * x^2 - 400 * y + 2 + # + # diff( f , y , 2 ) + # 200 + # + # diff( f , x , y ) + # -400 * x + + if isnothing(x) # informative call + v = 0 + return (v, [-1, 1], [0 0; 0 0]) + else + v = 100 * (x[2] - x[1]^2 )^2 + ( x[1] - 1 )^2 # f(x) + + g = zeros(2) + g[1] = 2 * x[1] - 400* x[1] * (x[2] - x[1]^2) - 2 + g[2] = -200 * x[1]^2 + 200 * x[2] + + H = zeros(2, 2) + H[1, 1] = 1200 * x[1]^2 -400 * x[2] + 2 + H[2, 2] = 200 + H[2, 1] = -400 * x[1] + H[1, 2] = H[2, 1] + + return (v, g, H) + end +end # rosenbrock + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function sixhumpcamel(x::Union{Nothing, AbstractVecOrMat}) + # six-hump-camel valley-shaped function + # syms x y + # f = @(x, y) ( 4 - 2.1 * x^2 + x^4 / 3 ) * x^2 + x * y + 4 * ( y^2 - 1 ) * + # y^2 + # + # diff( f , x ) + # 2 * x^5 - ( 42 * x^3 ) / 5 + 8 * x + y + # + # diff( f , y ) + # 16 * y^3 - 8 * y + x + # + # diff( f , x , 2 ) + # 10 * x^4 - ( 126 * x^2 ) / 5 + 8 + # + # diff( f , y , 2 ) + # 48 * y^2 - 8 + # + # diff( f , x , y ) + # 1 + + if isnothing(x) # informative call + v = -1.03162845349 + return (v, [1, 1], [0 0; 0 0]) + else + v = ( 4 - 2.1 * x[1]^2 + x[1]^4 / 3 ) * x[1]^2 + x[1] * x[2] + + 4 * ( x[2]^2 - 1 ) * x[2]^2 # f(x) + + g = zeros(2) + g[1] = 2 * x[1]^5 - (42 * x[1]^3) / 5 + 8 * x[1] + x[2] + g[2] = 16 * x[2]^3 - 8 * x[2] + x[1] + + H = zeros(2, 2) + H[1, 1] = 10 * x[1]^4 - ( 126 * x[1]^2 ) / 5 + 8 + H[2, 2] = 48 * x[2]^2 - 8 + H[2, 1] = 1 + H[1, 2] = H[2, 1] + + return (v, g, H) + end +end # sixhumpcamel + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function ackley(xx::Union{Nothing, AbstractVecOrMat}) + + # syms x y + # f = @(x, y) - 20 * exp( - 0.2 * sqrt( ( x^2 + y^2 ) / 2 ) ) ... + # - exp( ( cos( 2 * pi * x ) + cos( 2 * pi * y ) ) / 2 ) ... + # + 20 + exp(1) + # + + ManuallyComputedfGH = true + + if isnothing(xx) # informative call + v = 0 + return (v, [2, 2], [0 0; 0 0]) + else + if size(xx, 1) ≠ 2 || size(xx, 2) ≠ 1 + error("ackley: x is of wrong size") + end + + if ManuallyComputedfGH + + # diff( f , x ) + # pi*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*x) + + # (2*x*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) + # + # diff( f , y ) + # pi*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*y) + + # (2*y*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) + # + # diff( f , x , 2 ) + # + # (2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) + + # 2*pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*cos(2*pi*x) - + # (x^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(5*(x^2/2 + y^2/2)) - + # (x^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(3/2) - + # pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*x)^2 + # + # diff( f , y , 2 ) + # (2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(1/2) + + # 2*pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*cos(2*pi*y) - + # (y^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(5*(x^2/2 + y^2/2)) - + # (y^2*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(3/2) - + # pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*y)^2 + # + # diff( f , x , y) + # - (x*y*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(5*(x^2/2 + y^2/2)) - + # (x*y*exp(-(x^2/2 + y^2/2)^(1/2)/5))/(x^2/2 + y^2/2)^(3/2) - + # pi^2*exp(cos(2*pi*x)/2 + cos(2*pi*y)/2)*sin(2*pi*x)*sin(2*pi*y) + + x = xx[1] + y = xx[2] + sqn2 = (x^2 + y^2) / 2 + cosx = cos(2 * π * x) + cosy = cos(2 * π * y) + comp1 = exp(-(sqn2)^(1/2) / 5) + comp2 = exp((cosx + cosy) / 2) + + v = -20 * comp1 - comp2 + 20 + ℯ + + sinx = sin(2 * π * x) + siny = sin(2 * π * y) + + g = zeros(2) # \nabla f(x) + g[1] = π * comp2 * sinx + 2 * x * comp1 / (sqn2)^(1/2) + g[2] = π * comp2 * siny + 2 * y * comp1 / (sqn2)^(1/2) + + H = zeros(2, 2) + + H[1, 1] = (2*comp1)/(sqn2)^(1/2) + 2*π^2*comp2*cosx + + - (x^2*comp1)/(5*sqn2) - (x^2*comp1)/(sqn2)^(3/2) + + - π^2*comp2*sinx^2 + + H[2, 2] = (2*comp1)/(sqn2)^(1/2) + 2*π^2*comp2*cosy + + - (y^2*comp1)/(5*sqn2) - (y^2*comp1)/(sqn2)^(3/2) + + - π^2*comp2*siny^2 + + H[1, 2] = -(x*y*comp1)/(5*(sqn2)) + + - (x*y*comp1)/(sqn2)^(3/2) + + - π^2*comp2*sinx*siny + + H[2, 1] = H[1, 2] + else + error("first you need to find the ackley_Hes and ackley_Grd files :/") + (H, g, v) = ackley_Hes(xx) + g = g' + + (g, v) = ackley_Grd(xx) + + v = - 20 * exp( - ( ( xx[1]^2 + xx[2]^2 ) / 2 )^(1/2) / 5 ) + + -exp( cos( 2 * π * xx[1] ) / 2 + + cos( 2 * π * xx[2] ) / 2 ) + 20 + ℯ + end + return (v, g, H) + end +end # ackley + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function lasso(x::Union{Nothing, AbstractVecOrMat}) + # nondifferentiable lasso example: + # + # f( x , y ) = || 3 * x + 2 * y - 2 ||_2^2 + 10 ( | x | + | y | ) + + if isnothing(x) # informative call + v = ( 2 - 1/3 )^2 + 10/9 # optimal solution [ 1/9 , 0 ] + return (v, [0, 0]) + else + v = ( 3 * x( 1 ) + 2 * x( 2 ) - 2 )^2 + + 10 * ( abs( x( 1 ) ) + abs( x( 2 ) ) ) # f(x) + + g = zeros(2) + g[1] = 18 * x[1] + 12 * x[2] - 12 + 10 * sign( x[1] ) + g[2] = 12 * x[1] + 8 * x[2] - 8 + 10 * sign( x[2] ) + + return (v, g) + end +end # lasso + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +include("./testNN_Jac.jl") +include("./testNN_Hes.jl") +include("testNN.jl") + +function myNN(x::Union{Nothing, AbstractVecOrMat}) + # 1 x 5 x 5 x 5 x 1 = 76 w NN for solving a 1D fitting problem + + if isnothing(x) # informative call + v = -Inf; # optimal value unknown (although 0 may perhaps be good) + # Xavier initialization: uniform random in [ - A , A ] with + # A = \sqrt{6} / \sqrt{n + m}, with n and m the input and output + # layers. in our case n + m is either 6 or 10, so we take A = 1 + # + # note that starting point is random, so each run will be different + # (unless an explicit starting point is provided); if stability is + # neeed, the seed of the generator has to be set externally + return (v, 2 * rand(76, 1) - 1) + else + v = testNN(x) # f(x) + return (v, testNN_Jac(x)', testNN_Hes(x)') + end +end # myNN + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function myNN2(x::Union{Nothing, AbstractVecOrMat}) + # 1 x 5 x 5 x 5 x 1 = 76 w NN for solving a 1D fitting problem + # plus ridge stabilization \lambda || x ||^2 / 2 + + lambda = 1e+2 + + if isnothing(x) # informative call + v = -Inf # optimal value unknown (although 0 may perhaps be good) + # Xavier initialization: uniform random in [ - A , A ] with + # A = \sqrt{6} / \sqrt{n + m}, with n and m the input and output + # layers. in our case n + m is either 6 or 10, so we take A = 1 + # + # note that starting point is random, so each run will be different + # (unless an explicit starting point is provided); if stability is + # neeed, the seed of the generator has to be set externally + return (v, 2 * rand(76, 1) - 1) + else + v = testNN(x) + lambda * x' * x / 2 # f(x) + return (v, testNN_Jac(x)' + lambda * x, testNN_Hes(x)' + lambda * I) + end +end # myNN2 + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/11-09/TestFunctions/roughNN.jl b/11-09/TestFunctions/roughNN.jl new file mode 100644 index 0000000..69719c4 --- /dev/null +++ b/11-09/TestFunctions/roughNN.jl @@ -0,0 +1,43 @@ +function roughNN(w, x) +# +# v = roughNN( w , x ) +# +# returns the falue of the function v = f( x ) as currently estimated by +# a small NN with 1 input, 1 output, 3 hidden layers of 5 nodes each, and +# tanh activation function. +# +# Input: +# +# - w is the [ 76 x 1 ] real vector containing the weights of the NN, +# i.e., w is made as follows: +# [ 1 .. 5 ] are the [ 5 x 1 ] weigths of the first layer +# [ 6 .. 10 ] are the [ 5 x 1 ] biases of the first layer +# [ 11 .. 35 ] are the [ 5 x 5 ] weigths of the second layer +# [ 36 .. 40 ] are the [ 5 x 1 ] biases of the second layer +# [ 41 .. 65 ] are the [ 5 x 5 ] weigths of the third layer +# [ 66 .. 70 ] are the [ 5 x 1 ] biases of the third layer +# [ 71 .. 75 ] are the [ 5 x 1 ] weigths of the fourth (output) layer +# [ 76 ] is the [ 1 x 1 ] bias of the fourth (output) layer +# +# - x is the real scalar containing the input of f() +# +# Output: +# +# - v (real, scalar): v = f( x ) as estimated by the NN with weights w +# +#{ +# ======================================= +# Author: Antonio Frangioni +# Date: 28-08-22 +# Version 1.00 +# Copyright Antonio Frangioni +# ======================================= +#} + + g = tanh( (ones(5, 1) * x ) .* w( 1 : 5 ) + w( 6:10 ) ) + g = tanh( reshape( w( 11:35 ) , (5, 5) ) * g + w( 36:40 ) ) + g = tanh( reshape( w( 41:65 ) , (5, 5) ) * g + w( 66:70 ) ) + v = g' * w( 71:75 ) + w( 76 ) + + return v +end diff --git a/11-09/TestFunctions/testNN.jl b/11-09/TestFunctions/testNN.jl new file mode 100644 index 0000000..15e90de --- /dev/null +++ b/11-09/TestFunctions/testNN.jl @@ -0,0 +1,628 @@ +include("./roughNN.jl") + +function testNN(w) +# +# v = testNN( w ) +# +# returns the falue of the empirical error of the NN (or, in fact, +# whatever function is encoded in 'roughNN()') with the weights contained +# in w. +# +# The empirical error is estimated over a 288-strong input/output pair +# ( X , y ), with X containing only one feature, that is hard-coded into +# the function so that its gradient can be easily computed by ADiGator. +# +# Input: +# +# - w is the real vector containing the weights of the NN, see roughNN +# for details +# +# Output: +# +# - the MSE of the error done by roughNN() on the given test set +# +#{ +# ======================================= +# Author: Antonio Frangioni +# Date: 28-08-22 +# Version 1.00 +# Copyright Antonio Frangioni +# ======================================= +#} + +N = 288 # size + +# inputs +X = [ +0.0000000000000000 +0.0034843205574913 +0.0069686411149826 +0.0104529616724739 +0.0139372822299652 +0.0174216027874564 +0.0209059233449477 +0.0243902439024390 +0.0278745644599303 +0.0313588850174216 +0.0348432055749129 +0.0383275261324042 +0.0418118466898955 +0.0452961672473868 +0.0487804878048781 +0.0522648083623693 +0.0557491289198606 +0.0592334494773519 +0.0627177700348432 +0.0662020905923345 +0.0696864111498258 +0.0731707317073171 +0.0766550522648084 +0.0801393728222996 +0.0836236933797909 +0.0871080139372822 +0.0905923344947735 +0.0940766550522648 +0.0975609756097561 +0.1010452961672474 +0.1045296167247387 +0.1080139372822300 +0.1114982578397213 +0.1149825783972125 +0.1184668989547038 +0.1219512195121951 +0.1254355400696864 +0.1289198606271777 +0.1324041811846690 +0.1358885017421603 +0.1393728222996516 +0.1428571428571428 +0.1463414634146341 +0.1498257839721254 +0.1533101045296167 +0.1567944250871080 +0.1602787456445993 +0.1637630662020906 +0.1672473867595819 +0.1707317073170732 +0.1742160278745645 +0.1777003484320558 +0.1811846689895470 +0.1846689895470383 +0.1881533101045296 +0.1916376306620209 +0.1951219512195122 +0.1986062717770035 +0.2020905923344948 +0.2055749128919861 +0.2090592334494774 +0.2125435540069686 +0.2160278745644599 +0.2195121951219512 +0.2229965156794425 +0.2264808362369338 +0.2299651567944251 +0.2334494773519164 +0.2369337979094077 +0.2404181184668990 +0.2439024390243902 +0.2473867595818815 +0.2508710801393728 +0.2543554006968641 +0.2578397212543554 +0.2613240418118467 +0.2648083623693380 +0.2682926829268293 +0.2717770034843205 +0.2752613240418119 +0.2787456445993031 +0.2822299651567944 +0.2857142857142857 +0.2891986062717770 +0.2926829268292683 +0.2961672473867596 +0.2996515679442509 +0.3031358885017422 +0.3066202090592334 +0.3101045296167247 +0.3135888501742160 +0.3170731707317073 +0.3205574912891986 +0.3240418118466899 +0.3275261324041812 +0.3310104529616725 +0.3344947735191638 +0.3379790940766551 +0.3414634146341464 +0.3449477351916376 +0.3484320557491289 +0.3519163763066202 +0.3554006968641115 +0.3588850174216028 +0.3623693379790941 +0.3658536585365854 +0.3693379790940767 +0.3728222996515679 +0.3763066202090593 +0.3797909407665505 +0.3832752613240418 +0.3867595818815331 +0.3902439024390244 +0.3937282229965157 +0.3972125435540070 +0.4006968641114982 +0.4041811846689896 +0.4076655052264808 +0.4111498257839721 +0.4146341463414634 +0.4181184668989547 +0.4216027874564460 +0.4250871080139373 +0.4285714285714285 +0.4320557491289199 +0.4355400696864111 +0.4390243902439024 +0.4425087108013937 +0.4459930313588850 +0.4494773519163763 +0.4529616724738676 +0.4564459930313589 +0.4599303135888502 +0.4634146341463415 +0.4668989547038327 +0.4703832752613241 +0.4738675958188153 +0.4773519163763066 +0.4808362369337979 +0.4843205574912892 +0.4878048780487805 +0.4912891986062718 +0.4947735191637631 +0.4982578397212544 +0.5017421602787456 +0.5052264808362370 +0.5087108013937283 +0.5121951219512195 +0.5156794425087108 +0.5191637630662020 +0.5226480836236933 +0.5261324041811847 +0.5296167247386759 +0.5331010452961673 +0.5365853658536586 +0.5400696864111498 +0.5435540069686411 +0.5470383275261324 +0.5505226480836236 +0.5540069686411150 +0.5574912891986064 +0.5609756097560976 +0.5644599303135889 +0.5679442508710801 +0.5714285714285714 +0.5749128919860627 +0.5783972125435540 +0.5818815331010453 +0.5853658536585367 +0.5888501742160279 +0.5923344947735192 +0.5958188153310104 +0.5993031358885017 +0.6027874564459930 +0.6062717770034843 +0.6097560975609756 +0.6132404181184670 +0.6167247386759582 +0.6202090592334495 +0.6236933797909407 +0.6271777003484320 +0.6306620209059233 +0.6341463414634146 +0.6376306620209059 +0.6411149825783973 +0.6445993031358885 +0.6480836236933798 +0.6515679442508711 +0.6550522648083623 +0.6585365853658536 +0.6620209059233449 +0.6655052264808362 +0.6689895470383276 +0.6724738675958188 +0.6759581881533101 +0.6794425087108014 +0.6829268292682926 +0.6864111498257840 +0.6898954703832753 +0.6933797909407666 +0.6968641114982579 +0.7003484320557491 +0.7038327526132404 +0.7073170731707317 +0.7108013937282229 +0.7142857142857143 +0.7177700348432056 +0.7212543554006969 +0.7247386759581882 +0.7282229965156795 +0.7317073170731707 +0.7351916376306620 +0.7386759581881532 +0.7421602787456446 +0.7456445993031359 +0.7491289198606272 +0.7526132404181185 +0.7560975609756098 +0.7595818815331010 +0.7630662020905923 +0.7665505226480837 +0.7700348432055749 +0.7735191637630662 +0.7770034843205575 +0.7804878048780488 +0.7839721254355401 +0.7874564459930313 +0.7909407665505226 +0.7944250871080140 +0.7979094076655052 +0.8013937282229965 +0.8048780487804879 +0.8083623693379791 +0.8118466898954704 +0.8153310104529616 +0.8188153310104529 +0.8222996515679443 +0.8257839721254355 +0.8292682926829268 +0.8327526132404182 +0.8362369337979094 +0.8397212543554007 +0.8432055749128919 +0.8466898954703833 +0.8501742160278746 +0.8536585365853658 +0.8571428571428572 +0.8606271777003485 +0.8641114982578397 +0.8675958188153310 +0.8710801393728222 +0.8745644599303136 +0.8780487804878049 +0.8815331010452961 +0.8850174216027875 +0.8885017421602788 +0.8919860627177700 +0.8954703832752613 +0.8989547038327526 +0.9024390243902439 +0.9059233449477352 +0.9094076655052264 +0.9128919860627178 +0.9163763066202091 +0.9198606271777003 +0.9233449477351916 +0.9268292682926830 +0.9303135888501742 +0.9337979094076655 +0.9372822299651568 +0.9407665505226481 +0.9442508710801394 +0.9477351916376306 +0.9512195121951219 +0.9547038327526133 +0.9581881533101045 +0.9616724738675958 +0.9651567944250871 +0.9686411149825784 +0.9721254355400697 +0.9756097560975610 +0.9790940766550522 +0.9825783972125436 +0.9860627177700348 +0.9895470383275261 +0.9930313588850174 +0.9965156794425087 +1.0000000000000000] + +# outputs +y = [ +0.096798166000 +0.143459740000 +0.208317990000 +-0.038018393000 +0.148793230000 +0.512799550000 +-0.120798510000 +0.177158750000 +0.083816932000 +0.000756494710 +0.006887211700 +0.213572840000 +0.493783350000 +0.035274935000 +0.243769090000 +0.087417919000 +0.476797600000 +0.271438160000 +0.178877000000 +0.302770820000 +0.219586200000 +0.397548740000 +0.215089090000 +0.086588415000 +0.304056660000 +0.513946170000 +0.113409000000 +0.270068060000 +0.471061630000 +0.046628439000 +0.443157150000 +0.477349380000 +0.411852220000 +0.280063680000 +0.410626170000 +0.442082230000 +0.585090200000 +0.561297160000 +0.426446760000 +0.739395540000 +0.506414480000 +0.409925250000 +0.483992110000 +0.696575460000 +0.615166110000 +0.737349800000 +0.632542540000 +1.013287300000 +0.408451860000 +0.613835270000 +0.681370910000 +0.724988310000 +0.947395900000 +0.779004190000 +0.745667780000 +0.789666080000 +0.908202240000 +0.707755840000 +0.894037990000 +0.606428220000 +0.843615470000 +0.727874550000 +0.784348430000 +0.937189250000 +0.737952220000 +0.769620390000 +0.701166820000 +0.604155740000 +0.924881630000 +1.130475900000 +0.936493470000 +0.935667120000 +0.819976810000 +1.219958800000 +0.949769640000 +1.185254200000 +1.048672000000 +0.957402250000 +1.160938800000 +1.147023700000 +0.983283410000 +1.194051400000 +1.265849000000 +0.987167510000 +0.956395550000 +1.052589900000 +1.041239900000 +1.105649800000 +0.941725790000 +1.082398200000 +1.127045200000 +0.990602660000 +0.980803460000 +0.763155870000 +0.768571290000 +0.718186990000 +0.743430540000 +0.899271220000 +0.672586160000 +1.243876900000 +1.009891400000 +0.580803050000 +0.709665650000 +0.858643730000 +0.609667610000 +0.789520360000 +1.014111700000 +0.817911210000 +0.824534040000 +0.676622590000 +0.735885580000 +0.609022520000 +0.859070820000 +0.729465540000 +0.907844320000 +0.969161960000 +0.938595000000 +0.765435590000 +0.688922170000 +0.574990840000 +0.770659830000 +0.891310740000 +0.690971710000 +0.711048000000 +0.824634750000 +0.857126400000 +0.510549630000 +0.748820900000 +0.744129450000 +0.688191070000 +0.841053850000 +0.648943870000 +0.576231820000 +0.738291460000 +0.762720980000 +0.658108930000 +0.807248650000 +0.457323660000 +0.521077750000 +0.218860160000 +0.755337450000 +0.525976310000 +0.634217410000 +0.821176590000 +0.675074910000 +0.599022390000 +0.535501720000 +0.624415250000 +0.748616920000 +0.428448630000 +0.643341520000 +0.768654000000 +0.435878620000 +0.747073780000 +0.746823840000 +0.509674810000 +0.413964070000 +0.702246380000 +0.756141550000 +0.719368010000 +0.744580020000 +0.450466060000 +0.713008860000 +0.536099090000 +0.536595750000 +0.385158420000 +0.781369420000 +0.640457830000 +0.762680940000 +0.836824400000 +0.437730550000 +0.703038130000 +0.603083350000 +0.740709380000 +0.768477480000 +0.724346000000 +0.477804350000 +0.580883120000 +0.639146320000 +1.073252500000 +0.783713950000 +0.948384040000 +0.663369380000 +0.634232460000 +0.696070360000 +0.526957260000 +0.794798220000 +0.587766610000 +0.408654360000 +0.749043110000 +0.387306230000 +0.350567280000 +0.675537030000 +0.495158740000 +0.507149810000 +0.625867220000 +0.583647850000 +0.630796900000 +0.712643020000 +0.504536230000 +0.504499780000 +0.381836730000 +0.647114640000 +0.814415180000 +0.618741310000 +0.808727320000 +0.824111580000 +0.901249190000 +0.910594790000 +0.668334220000 +0.652467030000 +0.797380800000 +0.699257390000 +1.025428600000 +1.022629700000 +0.837597600000 +0.766407010000 +0.913657810000 +0.744506570000 +0.829397600000 +0.773018020000 +0.872046570000 +1.028215500000 +0.972177970000 +1.033239200000 +0.724398150000 +0.887466840000 +0.710846670000 +0.912868530000 +0.899725750000 +1.039970600000 +1.003988400000 +0.929601600000 +0.747319110000 +0.742110530000 +0.495198080000 +0.724133980000 +0.546209190000 +0.904975290000 +0.886555800000 +0.756973180000 +0.663691170000 +0.725449860000 +0.927661000000 +0.871628610000 +0.583857660000 +0.657822350000 +0.445564610000 +0.654537190000 +0.685853290000 +0.690412010000 +0.306045040000 +0.591718740000 +0.366728870000 +0.420310670000 +0.575582700000 +0.482907520000 +0.394669790000 +0.491601190000 +0.627475460000 +0.270874460000 +0.144405290000 +0.155561360000 +0.171715630000 +0.196642150000 +0.368318080000 +-0.046015957000 +0.287831380000 +0.121822920000 +0.390236930000 +0.084253654000 +0.201575720000 +0.048222309000 +0.075602342000 +0.128340910000 +0.123106810000 +0.069294711000 +0.308367180000 +0.213239800000 +0.401070710000 +0.073746174000 +0.268322470000 +-0.213145400000 +0.191332180000 +0.145485930000 +0.028213679000 +0.183566020000 +0.206160990000] + + # compute MSE of prediction on all ( X( i ) , y( i ) ) + + v = 0 # return value + + for i = 1:N # for all input / output pairs + v = v + ( y[i] - roughNN( w , X[i] ) )^2 + end + + v = v / 2 + + return v +end diff --git a/11-09/TestFunctions/testNN_Hes.jl b/11-09/TestFunctions/testNN_Hes.jl new file mode 100644 index 0000000..649f1be --- /dev/null +++ b/11-09/TestFunctions/testNN_Hes.jl @@ -0,0 +1,26 @@ +# function [Grd,Fun] = testNN_Grd(w) +# +# Gradient wrapper file generated by ADiGator +# ©2010-2014 Matthew J. Weinstein and Anil V. Rao +# ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +# Contact: mweinstein@ufl.edu +# Bugs/suggestions may be reported to the sourceforge forums +# DISCLAIMER +# ADiGator is a general-purpose software distributed under the GNU General +# Public License version 3.0. While the software is distributed with the +# hope that it will be useful, both the software and generated code are +# provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +# or fitness for any purpose or application. + +function testNN_Hes(w) + gator_w.f = w + gator_w.dw = ones(76,1) + v = testNN_ADiGatorHes(gator_w) + xind1 = v.dwdw_location(:,1) + xind2 = v.dwdw_location(:,2) + Hes = zeros(76,76) + Hes[(xind2-1)*76 + xind1] = v.dwdw + Grd = reshape(v.dw,[1 76]) + Fun = v.f + return (Hes, Grd, Fun) +end diff --git a/11-09/TestFunctions/testNN_Jac.jl b/11-09/TestFunctions/testNN_Jac.jl new file mode 100644 index 0000000..4cab98e --- /dev/null +++ b/11-09/TestFunctions/testNN_Jac.jl @@ -0,0 +1,23 @@ +# function [Jac,Fun] = testNN_Jac(w) +# +# Jacobian wrapper file generated by ADiGator +# ©2010-2014 Matthew J. Weinstein and Anil V. Rao +# ADiGator may be obtained at https://sourceforge.net/projects/adigator/ +# Contact: mweinstein@ufl.edu +# Bugs/suggestions may be reported to the sourceforge forums +# DISCLAIMER +# ADiGator is a general-purpose software distributed under the GNU General +# Public License version 3.0. While the software is distributed with the +# hope that it will be useful, both the software and generated code are +# provided 'AS IS' with NO WARRANTIES OF ANY KIND and no merchantability +# or fitness for any purpose or application. + +function testNN_Jac(w) + gator_w.f = w + gator_w.dw = ones(76,1) + v = testNN_ADiGatorJac(gator_w) + Jac = reshape(v.dw, (1, 76)) + Fun = v.f + + return (Jac, Fun) +end diff --git a/11-09/Untitled.ipynb b/11-09/Untitled.ipynb new file mode 100644 index 0000000..c58f437 --- /dev/null +++ b/11-09/Untitled.ipynb @@ -0,0 +1,570 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 27, + "id": "cb5170b7-6a4c-415f-8675-8382c5ce837c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "NWTN (generic function with 1 method)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "using LinearAlgebra, Printf, Plots\n", + "\n", + "function NWTN(f;\n", + " x::Union{Nothing, Vector}=nothing,\n", + " eps::Real=1e-6,\n", + " MaxFeval::Integer=1000,\n", + " m1::Real=1e-4,\n", + " m2::Real=0.9,\n", + " delta::Real=1e-6,\n", + " tau::Real=0.9,\n", + " sfgrd::Real=0.2,\n", + " MInf::Real=-Inf,\n", + " mina::Real=1e-16,\n", + " plt::Union{Plots.Plot, Nothing}=nothing,\n", + " plotatend::Bool=true,\n", + " Plotf::Integer=0,\n", + " printing::Bool=true)::Tuple{AbstractArray, String}\n", + "\n", + " \n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # inner functions - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " function f2phi(alpha, derivate=false)\n", + " # computes and returns the value of the tomography at alpha\n", + " #\n", + " # phi( alpha ) = f( x + alpha * d )\n", + " #\n", + " # if Plotf > 2 saves the data in gap() for plotting\n", + " #\n", + " # if the second output parameter is required, put there the derivative\n", + " # of the tomography in alpha\n", + " #\n", + " # phi'( alpha ) = < \\nabla f( x + alpha * d ) , d >\n", + " #\n", + " # saves the point in lastx, the gradient in lastg, the Hessian in lasth,\n", + " # and increases feval\n", + " \n", + " lastx = x + alpha * d\n", + " phi, lastg, lastH = f(lastx)\n", + " \n", + " if Plotf > 2\n", + " if fStar > - Inf\n", + " push!(gap, (phi - fStar) / max(abs(fStar), 1))\n", + " else\n", + " push!(gap, phi)\n", + " end\n", + " end\n", + "\n", + " feval += 1\n", + "\n", + " if derivate\n", + " return (phi, dot(d, lastg))\n", + " end\n", + " return (phi, nothing)\n", + " end\n", + "\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " \n", + " function ArmijoWolfeLS(phi0, phip0, as, m1, m2, tau)\n", + " # performs an Armijo-Wolfe Line Search.\n", + " #\n", + " # phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0\n", + " #\n", + " # as > 0 is the first value to be tested: if phi'( as ) < 0 then as is\n", + " # divided by tau < 1 (hence it is increased) until this does not happen\n", + " # any longer\n", + " #\n", + " # m1 and m2 are the standard Armijo-Wolfe parameters; note that the strong\n", + " # Wolfe condition is used\n", + " #\n", + " # returns the optimal step and the optimal f-value\n", + " \n", + " lsiter = 1 # count iterations of first phase\n", + " local phips, phia\n", + " while feval ≤ MaxFeval \n", + " phia, phips = f2phi(as, true)\n", + " \n", + " if (phia ≤ phi0 + m1 * as * phip0) && (abs(phips) ≤ - m2 * phip0)\n", + " if printing\n", + " @printf(\" %2d\", lsiter)\n", + " end\n", + " a = as;\n", + " return (a, phia) # Armijo + strong Wolfe satisfied, we are done\n", + " \n", + " end\n", + " if phips ≥ 0\n", + " break\n", + " end\n", + " as = as / tau\n", + " lsiter += 1\n", + " end \n", + "\n", + " if printing\n", + " @printf(\" %2d \", lsiter)\n", + " end\n", + " lsiter = 1 # count iterations of second phase\n", + " \n", + " am = 0\n", + " a = as\n", + " phipm = phip0\n", + " while (feval ≤ MaxFeval ) && ((as - am)) > mina && (phips > 1e-12)\n", + " \n", + " # compute the new value by safeguarded quadratic interpolation\n", + " a = (am * phips - as * phipm) / (phips - phipm)\n", + " a = max(am + ( as - am ) * sfgrd, min(as - ( as - am ) * sfgrd, a))\n", + " \n", + " # compute phi(a)\n", + " phia, phip = f2phi(a, true)\n", + " \n", + " if (phia ≤ phi0 + m1 * a * phip0) && (abs(phip) ≤ -m2 * phip0)\n", + " break # Armijo + strong Wolfe satisfied, we are done\n", + " end\n", + " \n", + " # restrict the interval based on sign of the derivative in a\n", + " if phip < 0\n", + " am = a\n", + " phipm = phip\n", + " else\n", + " as = a\n", + " if as ≤ mina\n", + " break\n", + " end\n", + " phips = phip\n", + " end\n", + " lsiter += 1\n", + " end\n", + "\n", + " if printing\n", + " @printf(\"%2d\", lsiter)\n", + " end\n", + " return (a, phia)\n", + " end\n", + "\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " function BacktrackingLS(phi0, phip0, as, m1, tau)\n", + " # performs a Backtracking Line Search.\n", + " #\n", + " # phi0 = phi( 0 ), phip0 = phi'( 0 ) < 0\n", + " #\n", + " # as > 0 is the first value to be tested, which is decreased by\n", + " # multiplying it by tau < 1 until the Armijo condition with parameter\n", + " # m1 is satisfied\n", + " #\n", + " # returns the optimal step and the optimal f-value\n", + " \n", + " lsiter = 1 # count ls iterations\n", + " while feval ≤ MaxFeval && as > mina\n", + " phia, _ = f2phi(as)\n", + " if phia ≤ phi0 + m1 * as * phip0 # Armijo satisfied\n", + " break # we are done\n", + " end\n", + " as *= tau\n", + " lsiter += 1\n", + " end\n", + "\n", + " if printing\n", + " @printf(\" %2d\", lsiter)\n", + " end\n", + "\n", + " return (as, phia)\n", + " end\n", + " \n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " #Plotf = 2\n", + " # 0 = nothing is plotted\n", + " # 1 = the level sets of f and the trajectory are plotted (when n = 2)\n", + " # 2 = the function value / gap are plotted, iteration-wise\n", + " # 3 = the function value / gap are plotted, function-evaluation-wise\n", + "\n", + " Interactive = false\n", + "\n", + " PXY = Matrix{Real}(undef, 2, 0)\n", + "\n", + " local gap\n", + " if Plotf > 1\n", + " if Plotf == 2\n", + " MaxIter = 50 # expected number of iterations for the gap plot\n", + " else\n", + " MaxIter = 70 # expected number of iterations for the gap plot\n", + " end\n", + " gap = []\n", + " end\n", + "\n", + " if Plotf == 2 && plt == nothing\n", + " plt = plot(xlims=(0, MaxIter), ylims=(1e-15, 1e+1))\n", + " end\n", + " if Plotf > 1 && plt == nothing\n", + " plt = plot(xlims=(0, MaxIter))\n", + " end\n", + " if plt == nothing\n", + " plt = plot()\n", + " end\n", + "\n", + " local fStar\n", + " if isnothing(x)\n", + " (fStar, x, _) = f(nothing)\n", + " else\n", + " (fStar, _, _) = f(nothing)\n", + " end\n", + "\n", + " n = size(x, 1)\n", + "\n", + " if m1 ≤ 0 || m1 ≥ 1\n", + " throw(ArgumentError(\"m1 is not in (0 ,1)\"))\n", + " end\n", + "\n", + " AWLS = (m2 > 0 && m2 < 1)\n", + "\n", + " if delta < 0\n", + " throw(ArgumentError(\"delta must be ≥ 0\"))\n", + " end\n", + "\n", + " if tau ≤ 0 || tau ≥ 1\n", + " throw(ArgumentError(\"tau is not in (0 ,1)\"))\n", + " end\n", + "\n", + " if sfgrd ≤ 0 || sfgrd ≥ 1\n", + " throw(ArgumentError(\"sfgrd is not in (0, 1)\"))\n", + " end\n", + "\n", + " if mina < 0\n", + " throw(ArgumentError(\"mina must be ≥ 0\"))\n", + " end\n", + "\n", + " # \"global\" variables- - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " \n", + " lastx = zeros(n) # last point visited in the line search\n", + " lastg = zeros(n) # gradient of lastx\n", + " lastH = zeros(n, n) # Hessian of lastx\n", + " d = zeros(n) # Newton's direction\n", + " feval = 0 # f() evaluations count (\"common\" with LSs)\n", + "\n", + " status = \"error\"\n", + " \n", + " # initializations - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " if fStar > -Inf\n", + " prevv = Inf\n", + " end\n", + "\n", + " if printing\n", + " @printf(\"Newton's method\\n\")\n", + " if fStar > -Inf\n", + " @printf(\"feval\\trel gap\\t\\t|| g(x) ||\\trate\\t\\tdelta\")\n", + " else\n", + " @printf(\"feval\\tf(x)\\t\\t\\t|| g(x) ||\\tdelta\")\n", + " end\n", + " @printf(\"\\t\\tls it\\ta*\")\n", + " @printf(\"\\n\\n\")\n", + " end\n", + "\n", + " \n", + " v, _ = f2phi(0)\n", + " ng = norm(lastg)\n", + " if eps < 0\n", + " ng0 = -ng # norm of first subgradient: why is there a \"-\"? ;-)\n", + " else\n", + " ng0 = 1 # un-scaled stopping criterion\n", + " end\n", + "\n", + " # main loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " while true\n", + "\n", + " # output statistics - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " \n", + " if fStar > -Inf\n", + " gapk = ( v - fStar ) / max(abs( fStar ), 1)\n", + "\n", + " if printing\n", + " @printf(\"%4d\\t%1.4e\\t%1.4e\", feval, gapk, ng)\n", + " if prevv < Inf\n", + " @printf(\"\\t%1.4e\", ( v - fStar ) / ( prevv - fStar ))\n", + " else\n", + " @printf(\"\\t\\t\")\n", + " end\n", + " end\n", + " prevv = v\n", + " \n", + " if Plotf > 1\n", + " if Plotf ≥ 2\n", + " push!(gap, gapk)\n", + " end\n", + " end\n", + " else\n", + " if printing\n", + " @printf(\"%4d\\t%1.8e\\t\\t%1.4e\", feval, v, ng)\n", + " end\n", + " \n", + " if Plotf > 1\n", + " if Plotf ≥ 2\n", + " push!(gap, v)\n", + " end\n", + " end\n", + " end\n", + "\n", + " # stopping criteria - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " if ng ≤ eps * ng0\n", + " status = \"optimal\"\n", + " break\n", + " end\n", + " \n", + " if feval > MaxFeval\n", + " status = \"stopped\"\n", + " break\n", + " end\n", + " \n", + " # compute Newton's direction- - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " lambdan = eigmin(lastH) # smallest eigenvalue\n", + " if lambdan < delta\n", + " if printing\n", + " @printf(\"\\t%1.4e\", delta - lambdan)\n", + " end\n", + " lastH = lastH + (delta - lambdan) * I\n", + " else\n", + " if printing\n", + " @printf(\"\\t0.00e+00\")\n", + " end\n", + " end\n", + " d = -lastH \\ lastg\n", + " phip0 = lastg' * d\n", + " \n", + " # compute step size - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # in Newton's method, the default initial stepsize is 1\n", + " \n", + " if AWLS\n", + " a, v = ArmijoWolfeLS(v, phip0, 1, m1, m2, tau)\n", + " else\n", + " a, v = BacktrackingLS(v, phip0, 1, m1, tau)\n", + " end\n", + " \n", + " # output statistics - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + "\n", + " if printing\n", + " @printf(\"\\t%1.2e\", a)\n", + " @printf(\"\\n\")\n", + " end\n", + " \n", + " if a ≤ mina\n", + " status = \"error\"\n", + " break\n", + " end\n", + " \n", + " if v ≤ MInf\n", + " status = \"unbounded\"\n", + " break\n", + " end\n", + " \n", + " # compute new point - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " \n", + " # possibly plot the trajectory\n", + " if n == 2 && Plotf == 1\n", + " PXY = hcat(PXY, hcat(x, lastx))\n", + " end\n", + " \n", + " x = lastx\n", + " ng = norm(lastg)\n", + "\n", + " # iterate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " \n", + " if Interactive\n", + " readline()\n", + " end\n", + " end\n", + "\n", + " if plotatend\n", + " if Plotf ≥ 2\n", + " plot!(plt, gap)\n", + " elseif Plotf == 1 && n == 2\n", + " plot!(plt, PXY[1, :], PXY[2, :])\n", + " end\n", + " display(plt)\n", + " end\n", + "\n", + " # end of main loop- - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n", + " return (x, status)\n", + "end" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9fa92a74-19bc-46b3-92de-d39aa74f0075", + "metadata": {}, + "outputs": [], + "source": [ + "include(\"./TestFunctions/TestFunctions.jl\")\n", + "TF = TestFunctions();" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "14e530e5-1b32-4a3e-ac62-b67fd8723f06", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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x4wZ880331T9xbhDkWWZc/7ZZ5917dr1jhusWrWqfv36ps3Wr18fHh5uegwW0b59+y+++ML0uFu3bh9//PEtG3z33Xc9evSweV3aJMtyeHj4unXrTI8bNGjw448/3rLNCy+8MHbsWNPjiRMnjhw50tZVald+fr67u3tqairnvLi42MvLKykp6ZZtnnnmmWnTpqlRnfaZDt0ffvhh796977jB8uXLmzRpoigK53z16tX16tUzPa4CB+sI73sR5a5du7p162barHv37ufPn09PT7dJadpXUVGxb9++uLg405dxcXE7d+68fbPMzMzZs2cvXLgwJyfHtgVqTXp6+rlz57p3705EjLFu3brdvsN37dp1398IVE1CQoKPj0+DBg2IyM3NrX379rt27brjZrNmzVqxYoX564GAOe57tN+5c2dcXJwgCEQUFxd34sSJKt8Sx8GC8L6ysrIqlz5ydnb29vbOyspStyTNyMnJURTF39/f9GVAQMDt+9bT07NZs2b5+fnr1q1r0KBBYmKizcvUjqysLC8vr8pxqYCAgMzMzNu3qfzA+/v7Z2dncyyRYSHZ2dk3r6N2x/0fGhoaGBiYn5//wQcftGjR4tq1a7atUddu/vB7eHi4ublV+Whvd0E4a9Ysw218fHzM/HaDwSDLcuWXFRUVTk5O1qlUm/71r3/dvv9jYmKIyLSmVOUw1R33bZ8+fZYuXTpt2rQ1a9aMHDly8uTJNq5fS4xG482DghUVFbcvq2YwGCq3kSTJYDCY/kCGh3f7weT2/f/6669//vnn77///r59+1xdXb/66ivb1qhrt/wDkSSpykd7uwvCiRMnSre5evWqmd9umsdhelxQUFBUVHT7zEa4hy+//PL2/f/nn38SUY0aNYxGY+XuzcjIuPeM0Hbt2mH6wMMIDg4uLi6unJF0xx0eEhJS2aZkZGSEhITYtERNCw4OzszMrOyw7/2BF0WxTZs2+MDb0s0f/tzc3PLy8iof7e0uCKtm+/btBQUFRBQfH//LL78UFRUR0apVq2JiYjB931IYY3369Fm5ciURSZK0Zs2afv36EdH169e3bdtWXl5ORJXTRDnn69evx2z+hxEcHBwTE7Nq1SoiKioq2rRpk2mHFxQUbN++3bRNfHy86TdCRCtXroyPj1erWu1p1aqVKIqmXZ2RkbF///5HH32UiLKzs//44w/TNqWlpaYHJSUlW7duxQfe2jjn27ZtKywsJKL4+PgNGzaUlJQQ0apVq9q3b+/r61v1n+tAtm7d2rJly7CwME9Pz5YtW77++uum5xlju3fvNj0eOHBg06ZNR44cWb169c2bN6tXrAYlJSVVr1592LBhbdu2jY2NLSsr45yfO3eOiEx/O/fv379Lly4jRoxo3rx5RETEqVOn1C7Zsf32229+fn4jR45s2rTpwIEDTU/u3r2bMWZ6fOnSpaioqJ49e/bv379WrVoXL15Ur1gNWrhwob+//5gxYyIiIiZMmGB6cvHixZGRkabHQUFBffv2HT58eGhoaFxcnOlfBFjEpk2bvHv3jgAAAWZJREFUWrZsGRoa6u3t3bJlyylTpnDOKyoqiOjAgQOcc0VR+vbt27x585EjR/r5+e3YsaPKr+Vgd5+4evXqzScffH19w8PDiejgwYMNGjTw8PAgIs75zp07s7OzY2NjQ0NDVatVoy5durR9+/Zq1ap16dLFNGpYXl6enJwcHR1tNBqvXr164MCBvLy84ODgtm3bYoD24V28eHHPnj2BgYGdOnUyjf8VFRUdO3bskUceMW1QUlKyZcsWWZa7d++OO3Ra3IkTJxITE+vUqdOqVSvTM5cvX87KymrSpAkRpaenJyUllZWVRUZGtmjRQtVKtSYvL+/s2bOVX/r5+dWuXZuIDhw40KhRI9P9CBVF2bFjR25ubseOHR9mFMzBghAAAMCyNDJGCAAAUDUIQgAA0DUEIQAA6BqCEAAAdA1BCAAAuoYgBAAAXUMQAgCAriEIAQBA1xCEAACgawhCAADQNQQhAADo2v8DJhMMqV8JuGEAAAAASUVORK5CYII=", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.9999999959286234, 0.9999999907475938], \"optimal\")" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NWTN(TF[6], printing=false, plotatend=true, Plotf=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ae61290b-22fa-493a-9b56-3a7458e3b3ed", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.9.4", + "language": "julia", + "name": "julia-1.9" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/11-09/lesson.ipynb b/11-09/lesson.ipynb new file mode 100644 index 0000000..ec68311 --- /dev/null +++ b/11-09/lesson.ipynb @@ -0,0 +1,1864 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "3a7ffee3-334e-481b-82fa-5a0dd957eed3", + "metadata": {}, + "outputs": [], + "source": [ + "include(\"./SDG.jl\")\n", + "include(\"./TestFunctions/TestFunctions.jl\")\n", + "TF = TestFunctions();" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "372ca0fc-d0fc-4731-8c1d-bbb24b5d7772", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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YYmJidYuFSz1aRd5UD1Wx439mKz8dRFzpKAZgmhKHH88XMYiulCdLA3CDz74wMPD49SpU6dPnz558uTKlSsrbNC9e/fMzMyjR4+mpKQMHjz4ueees3apYKlO/mxqU2lWCynAjQLd0KGAZnxyTLlcQi+1wsQ+VCtLd7jvv//+kUcekSTJ1dV10qRJq1atqrCBl5eXi4sLETHGIiIiiouLrVwpVN3FItqfLaLTxck8YcIdhmDfknLFvAS+spdsRA5C9bLoHKEQ4vz5840bNy7/slGjRikpKf/eLC8v7/PPP09NTd29e/eiRYtu9t3KysqysrLi4+Ovv9OqVSuDASfGrW96mLQ7S2y9qJzMo1512fKeOHELdsqk0PgY/t92cqgn5jCgulkUPyaTqaSkpHzAR0Rubm75+fk321iW5ZycnHPnzkVGRla6wblz57Zs2XLixInyL41G42effdakSZObfcOrV68yhr+NOzGhHk2oR0T0UZKcWswKCysZpqN5bQrNa6H/Hpa9jNKYoJLCwir8LzSvTTlG87q5uUnSbSYZLApCJycnb2/vK1eulH+Zk5NTp06df2/m6en54osvEtGgQYNGjhw5evToSj++SZMmDz300C2GjBUIIdzd3S3cGCqVVsab+jB3d5d//xOa16bQvJbYlSWWnTUnDDN6uDpX6T+ieW1KP81r6YRkmzZtdu3a1aFDByLatWtXmzZtbrGxn59fSUkJ5/y2OQzVgwuavY//74TSuCYL9aTQmqxxTdahFsNjTkF1hSaaEMM/7SLXwSIyoBJLO8KZM2dOnz49LCwsLy/vm2++iY6OJiKTydSsWbP169dHRER88cUXLi4ujRo1ysjIePPNNx966CGjEfcB2YvPusgLO8in8sXpfHEqj7Znihf28rmt5Wea40gFVPbcHt69DosKwa4IqrE0CIcOHVpYWPjBBx84OzuvXr26devWRCRJUs+ePcvHzg0bNly+fPnSpUu9vb2nTZs2depUG1YNVedupNa+rLUvI6LcMtqQojzUCF0PqOyPVPFXmkgcjqkJUFMV9r+xY8eOHTv2xndkWV6yZEn56759+/bt29eapYHNfJWkDKonYSYK1HWphKbG8ZW95JqYPAJVYUygR1+dUFr6MCw5A+qato1PDGU9AjR/XSJoHYJQj97rKC07pbT/2bwhRUEcgir+d0I5Xyhe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hMOGDZszZ87rr7/+559/VrrB0aNHIyMjXVxcjEZjp06dTpw4Uc0VatqPP/744IMPhoSEnDlzplOnTlevXq2wwfbt2997773k/4eFuW9tz549PXv29PHxKS0tbd++/YULFypsUFJSEhkZefz48QYNGowfP37FihWq1KlRZ86c6dixo6IoHh4eXbt2PXDgQIUNsrKynnrqqeu7a15enip1atSAAQNeffXVV155JSYmptIN4uPju3XrVrNmTUVROnTocPbs2eot0PaEveKcCyEGDRq0cOHCSjeYOnXqU089Vf56xowZjz32WPUVp32tW7f+7rvvyl937tz5q6++qrDBkiVLhg0bVu11adWIESNee+218tdjx4596aWXKmzw3XfftW7dWlEUIcQPP/wQERFRzRVq2tNPPz1lypTy17Nnzx43blyFDU6dOuXj41PtdTmI8s723nvv/eSTTyrd4KGHHpozZ07568mTJz/33HPVV1y1sN8R4W1Xi4iNje3Xr1/56759+944jwe3lp+fn5iYeH127matd/78+YULF37zzTd4+sdtxcXF3bg3/vvIOjY2tm/fvuWLdPTt2/fo0aOXLl2q5iK1y5I/9rKyskWLFn366adJSUnVW53mWdLZ9u3bt/y1Q3a29huEt5Wenn79rJW/v396erq69WhIeno6Y+x669WuXfvixYsVtvH09IyIiMjLy1uzZk3Tpk2PHj1a7WVqhslkys7OvvXeeOPu6uXl5eTkhD3WchX+2DMyMsQ/VwIxGAw9e/a8dOnS/v3727dvv3z5cjXKdEyKomRlZTl2Z6vmxTL33ntvXFxchTdHjRq1cuVKS/670Wi8/kxOs9ns5ORk5fo0bvz48d9//32FNyMjI+Pi4oxGoxCCc16+0J3JZPr3QkojR44cOXJk+etHHnlk3rx5q1evroaytUiWZVmWb7033ri7CiEURcEeazmDwXBj8xoMhgoLYNavX/+XX34pf33vvffOmjVr3Lhx1V2lg2KM3Xb31jo1R4Rbt241/4uFKUhEgYGBaWlp5a/T0tLq1q1rs0o1qfwSuwrKjzwCAgIYYze2XkBAwC2+VWRkZHJycnUUrU2SJNWuXfvWe2NgYOD1YXd6ejrn/NZtDje6sfXS0tICAwNvsXGXLl0yMzP/ff0X3BnGWEBAgGN3thqbGs3Jybk+iBw8ePCPP/5Y/vrHH38cPHiwenVpjKura9++fdesWUNEpaWlGzZsGDJkCBEVFRVt3bqVc05ExcXF5RsLIX799dfmzZurWLD9u743CiHWrFlTvjcqirJ169byZ3wPHjx448aN5a26Zs2a7t27e3p6qluzhtzsj3379u3lJ7Cv765E9MsvvzRo0KBGjRrVX6cjyc7O3rFjR/nrIUOGlHcXRHR993Yoql6qcyvz5s1r27atp6dnUFBQ27Ztf/31VyHEH3/84eHhUb7BxYsX69evP2jQoAEDBjRu3DgzM1PVejVm9+7dvr6+48aNa9++fZ8+fUwmkxCi/ERgbm6uEKJv3769e/ceN25cJWl/fgAAAeVJREFU8+bNmzRpcv78ebVLtmvJycl169YdMWJE7969W7RoUd6G5b1zQkKCEIJz3r9//zZt2owfP97X13fbtm1ql6wlly9fbtq0ab9+/aKiooKDgy9cuFD+vp+f3/r164UQr732Wrt27caNG1d+E8umTZtUrVdj5syZ07ZtWw8Pj3r16rVt23bLli1CiHXr1tWuXbt8g5SUlKCgoGHDhvXr169Zs2Y5OTmq1mt99vv0iZSUlBsvVqxfv76vr29+fv6pU6fatm1b/mZhYeFff/3FGOvTpw8OAKsqIyMjNjbW19e3V69e5c8jLCkpOXToUNu2bWVZvnz58t69e3Nzc4OCgjp16mQ0GtWu197l5eX99ddfLi4uvXv3dnFxISIhxL59+5o3b+7m5kZEnPOYmJjs7Ozu3btjXrSqioqKtmzZYjab+/Tp4+HhUf5mYmJigwYNvLy8iouL9+3bl5aW5uPj07FjRy8vL3Wr1ZazZ8/m5ORc/7Jhw4be3t5XrlxJSUm55557yt/Mz8//66+/jEZjnz59bvtUI82x3yAEAACoBho7RwgAAGBdCEIAANA1BCEAAOgaghAAAHQNQQgAALqGIAQAAF1DEAIAgK4hCAEAQNcQhAAAoGsIQgAA0DUEIQAA6Nr/AalN3gQXwiGfAAAAAElFTkSuQmCC", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([1.1252762016860305, 1.274849677259977], \"stopped\")" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "158cbc5a-a8e4-404d-a841-b57c377e10d4", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.9167976902294144, 0.8399415839141149], \"stopped\")" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], x=[-1, 1], astart=0.1, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ac55b2fe-9ae5-4fbc-bc83-624c237eb32d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.9983373844793831, 0.9963864758803652], \"stopped\")" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], x=[-1, 1], astart=0.1, MaxFeval=6000, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3204b230-6984-4d37-a328-03051840de41", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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4/ooKRQKufwhM481ChIXF5eysjJRFFWjBEVFRa6urnXaODs7FxcXq24XFRW5uLiwLOvs7FxSUqJuU1RUpBpcrVezZs00HxqVyWQIwoaY2KiFFmHL3M/Yh0YbxY7IlShIs8baGho1SSb2UdLof+zl5aVQKNS9wLNnz6qHSdUCAwPPnj2rup2amqoKvICAgMzMTHUWnj179gFBCAAAoHsaBaGVldWYMWPefffdwsLCHTt2JCUljR07loguXbo0bNgwVZspU6YsXrz44sWLN27cWLBgweTJk4nI19e3a9eu7777bmlp6XfffVddXf3EE0803coAAAA0lqZDi59++umMGTMCAwPd3NzWr1/v5uZGREqlMj8/X9XgySefnDVr1qBBg3ieT0hIGDdunGr5mjVrpk2b1rZtWz8/v61btz50rBYAAECXNDp8QjcadfjEr7/+2qZNm06dOjV1VUZn/vz5L7/8snqmLqiUl5f/73//mzNnjr4LMTinTp3KzMxs6KAmc/bDDz9069bNz89P34UYnPfee++tt94ypSkaxrofeOfOnceOHdN3FYZoyZIlubm5+q7C4OTm5i5dulTfVRiiY8eO/f777/quwhBt3br1zJkz+q7CEC1cuLC0tFTfVWiTsQYhAACAViAIAQDArCEIAQDArBnQZBkrKys3NzcND1+9e/eupaWliR3UqRVZWVnu7u6mtB9bK3iez83Nbdmypb4LMTilpaXV1dUuLi76LsTg5Ofn29raYt7Z/W7cuOHl5WUspxoYPXr0Bx988OA2BvR1eeXKlepqTU85pFQqOY4zlv+ELlVXV+P6HvXClqmXKIqCIOC4pvvV1NTI5XIGFz66j3F9lNzd3R/axoB6hAAAALqHHhUAAJg1BCEAAJg1BCEAAJg1BCEAAJg1A5o12hBBEC5dunTmzJmqqqrnnnuu3jY8z//www/nz58PCgqaOHGi+uCBjIyM1atXK5XK0aNHd+zYUYdV68iVK1dWr15dU1MzatSokJCQOn89d+5ccnJy7SWjRo2ys7M7fPjw+fPn1QunTJlielPjNm/efOjQIS8vrylTpqgvGa128uTJU6dOqe+OHz9eoVAQkSAIP/zww7lz5wIDAxMSEkzvKBRBEFavXp2WlhYQEJCQkHD/ZNG0tLRdu3bl5ub6+vqOHTtWtenKysrWrVunbhMREWECp/mt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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.3628062254502194, 0.12859141767257834], \"stopped\")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], astart=-0.001, MaxFeval=1000, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "82de30b9-6006-4ee3-ac11-88268d3204ab", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([-0.8717232114247211, 0.9328471204154523], \"stopped\")" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], astart=0.1, MaxFeval=1000, m2=0, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bfa9f82f-5751-4d8c-aabb-970c7ac01d8d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([1.1172381629977606, 1.248370836883731], \"stopped\")" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], astart=0.2, MaxFeval=1000, m2=0, tau=0.5, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a6d2a63b-4a2b-44e0-8403-99d35c1ee6bb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.2903670577433367, 0.08652037379852633], \"stopped\")" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[6], astart=0.1, MaxFeval=1000, m2=0, tau=0.5, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "52ccb0a3-70f3-43ee-ac91-722c87f92e80", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Tk7Tpk3z8/Or818vXbq0bds2/d0hQ4boj9m8efPOnTu9vb2TkpJcXFxMV7HCFBYWLl++/NatW6NGjYqPj6/zX3NycrZv3177kREjRnh5eaWlpR09elT/4KRJkxwdHU1RrsJUVVWdOnUqIyPD09Nz6NChDR5z48aNZcuWFRcXDxgwYNCgQfrH9Z/96dOne3p6Nul10SNUkFmzZi1dujQsLGzFihUzZsyof8D69etHjx7t7+9/+fLluLi40tJS+fFBgwbt3LkzNDT0jTfeeO+990xbtYKsW7duzJgxAQEBly5deuSRR8rKyuockJSUtGvXLh8fn8LCwujoaP0K5m+//fbevXuzs7Ozs7MLCwtNXrhS7NixY8iQId7e3iUlJd26dbt+/XqdA1JTU999993suyorK+XHP//88+effz44OPjEiROPPfaYTqczee2KcOvWre7duxcUFPj5+Y0cObL+wrbl5eX61tuzZ8+LL74oCAIh5Ndff/3888/1/0m1DbhgwYIpU6YsWrRo8eLFDR6g1Wp79eqVlpYWHBw8c+ZM/RLwa9euHTt2rPzZj4uLq//ZfwAOypCXl2dnZ1dUVMQ5v3btWosWLS5fvlznmO7duy9btky+/dhjj3322Wec8z179nh6elZXV3PODx8+7ObmVllZadralaJbt25ff/21fLtXr16ff/55nQNqt8xTTz31wgsvyLejoqL27t1rmiKVrF+/fosWLZJvDx06dMGCBXUOWLt2be/eves8qNPpAgMDU1JSOOeSJIWFha1fv974xSrRxx9/3LdvX/n2F198ER8ff5+D586dO2rUKPn2vHnzZs2aZfT6FE+SJM75kiVL+vfv3+ABP//8c4cOHeTDNm7cGBoayhjjnHft2nX58uXyMfHx8fU/+/eHHqFSHDhwICIiQj6b5+7uHh0dvX///toHVFVVHT16NDExUb7bv3//vXv3EkL27t2bkJBga2tLCOnevbtOp8vIyDB5+eZXUVFx7Nix/v37y3f17VNbixYt9Lerq6trn31av379woUL65y2UhXO+b59++7fgISQK1eufPjhh8uWLdN3nS9fvpyXl9evXz9CCKW0X79+Df6hGuzbt2/AgAHy7f79+x88eFCr1TZ4pE6n+/bbb6dNm6Z/5Ny5cwsWLPj222+b3JuxIpQ+IJL27t2bmJgoH5aYmJiVlZWf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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([-0.0898420454946345, 0.7126564254067507], \"optimal\")" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[7], Plotf=1, printing=false) # does job very good" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "49f77dcb-d5c0-4698-8ede-2e56d7337e53", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.12760835307443302, -0.18378703927430506], \"stopped\")" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[7], astart=-2e-1, Plotf=1, printing=false) # hmmm" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "2f088446-dc0c-42a2-870d-df9d1dca4754", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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nWbW3wlCQhACgPYYecpK4PMnGd7q99/m0kY0lzrBhCC8DrvdvmDBgrFjxz7wwAOHDx++6prz588/++yzY8aMmTJlyvbt211XJADATeOIRrXn1o8x5IwU9law+BW2+fvESqvSZalYk51O6my4mszZIPyf//mfFStWPP/88927dx8xYkR9ff1lC2pqau64447q6uqnnnoqMzOzqanJ1aUCANyK9Ehu+TBhZ4ahykrdc2xz8sRT9Th7eBWHqlm3EH0NV5MZnFlks9kWLVq0atWqIUOGDBs2bOPGjV988cWjjz566Zq///3vXbt2/eijj9xTJwBAq8QHc9kDhT/3FhYdEfuutd8Zwz+byt8eqbu9n+vQZ6cMOblHePr06QsXLgwcOFC+O3DgwL179162ZufOnaNHj37llVceeuihpUuXShJOTwOA6kT70/w04fgU4x3R3MTvLzaXKl2UWuizU4ac3CM8d+5ccHCwwXBxcURERGFh4WVrTp06tWDBgnnz5t17770vvvji0aNH33zzzas+2rFjx1auXPnjjz/Kd41G46JFixITE2/1W3C7hoYGjtPjL4fHiKJotVrxjye3slqtHMf5+PgoXYgqcEQPd6IH4mjVSf6ZXYYXf6VZCfapnSShdX/ojY2NoijyvLceW9x3wTiqrVhfr+q/xJt9Qw4ICLjhT8SpIAwMDLz0nF9jY2NwcPCVTzZ06NC5c+cSUXh4+Pjx4994442rltupU6eRI0c+/fTTji0pKSmOlFUhxlhgYKDSVWiZKIpGozEgIEDpQrTMaDQiCK80sxc9kkxfn5beMPELjtDsnvzM7rz/rb4bcRzn7+/vvUF4pMbWv71voLrHyrjjDdmpH3iHDh3sdntpaWmHDh2IqKioqFOnTpet6dixY0xMjHy7Xbt29fX1LS0tvr6+Vz6aj49PVFRUenp6qwoHAHAFeZB3Rhy/8yx70yy+bhIf78HPSRLCrvLupWWnG5iPoLvhajKn/uUSFhY2duxYuRHmzJkz33zzzdSpU4movLw8OztbXnP//fdv3LixubmZiFavXp2WlnbVFAQAUCd5kPfm/2cob6TEHNucPLG0QUfNpaZK0menDDn/8Ym33nrr008/TUtL69279x/+8IdevXoRUXFxsXwslIgmT56clJSUmJjYr1+/f/3rX4sXL3ZXyQAAbpMcxn04WMifZAzz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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([-0.08984190881815034, 0.712656391028696], \"optimal\")" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[7], astart=5e-2, tau=0.5, Plotf=1, printing=false)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2fc40883-f252-4aea-b042-9f2993dc1444", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([-1.7036067118830425, 0.7960835713103661], \"optimal\")" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[7], x=[-2, 1], Plotf=1, printing=false) # local minima" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "13d22e9a-671a-4a17-b7ec-e2de65990993", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([-0.08984200737903672, 0.7126564527726588], \"optimal\")" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[7], x=[-2, 1], astart=-0.1, Plotf=1, printing=false)\n", + "# better local minimum but my chance" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d212617b-1a64-4a32-8cc1-5fbe0c0dd9d0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gradient method\n", + "feval\trel gap\t\t|| g(x) ||\trate\t\tls feval\ta*\n", + "\n", + " 2\t4.5319e-02\t3.5796e+00 \t 1 7\t4.6146e-03\n", + " 10\t6.8718e-03\t2.9550e+00\t1.5163e-01 1 7\t1.5235e-03\n", + " 18\t6.1322e-03\t2.9416e+00\t8.9236e-01 1 8\t8.5011e-04\n", + " 27\t1.0649e-03\t2.8484e+00\t1.7367e-01 1 11\t1.9989e-04\n", + " 39\t5.5025e-04\t2.8388e+00\t5.1670e-01 1 10\t1.1872e-04\n", + " 50\t4.0450e-04\t2.8360e+00\t7.3512e-01 1 11\t5.6036e-05\n", + " 62\t4.5539e-05\t2.8293e+00\t1.1258e-01 1 14\t7.3297e-06\n", + " 77\t1.3124e-05\t2.8287e+00\t2.8819e-01 1 16\t1.8619e-06\n", + " 94\t1.7730e-06\t2.8285e+00\t1.3510e-01 1 19\t2.3411e-07\n", + " 114\t9.9925e-08\t2.8284e+00\t5.6359e-02 1 23\t1.4645e-08\n", + " 138\t1.7233e-08\t2.8284e+00\t1.7246e-01 1 25\t3.6613e-09\n", + " 164\t1.2058e-08\t2.8284e+00\t6.9970e-01 1 26\t1.8307e-09\n", + " 191\t2.5875e-09\t2.8284e+00\t2.1459e-01 1 28\t4.5767e-10\n", + " 220\t1.0739e-09\t2.8284e+00\t4.1502e-01 1 29\t2.2883e-10\n", + " 250\t7.5682e-10\t2.8284e+00\t7.0477e-01 1 30\t1.1442e-10\n", + " 281\t1.5852e-10\t2.8284e+00\t2.0945e-01 1 32\t2.8604e-11\n", + " 314\t7.0319e-11\t2.8284e+00\t4.4361e-01 1 33\t1.4302e-11\n", + " 348\t4.4097e-11\t2.8284e+00\t6.2709e-01 1 34\t7.1511e-12\n", + " 383\t1.3110e-11\t2.8284e+00\t2.9730e-01 1 36\t1.7878e-12\n", + " 420\t1.1942e-12\t2.8284e+00\t9.1088e-02 1 39\t2.2347e-13\n", + " 460\t5.9730e-13\t2.8284e+00\t5.0019e-01 1 40\t1.1174e-13\n", + " 501\t2.9887e-13\t2.8284e+00\t5.0037e-01 1 41\t5.5868e-14\n", + " 543\t1.4966e-13\t2.8284e+00\t5.0074e-01 1 42\t2.7934e-14\n", + " 586\t7.5051e-14\t2.8284e+00\t5.0148e-01 1 43\t1.3967e-14\n", + " 630\t3.9524e-14\t2.8284e+00\t5.2663e-01 1 44\t6.9835e-15\n", + " 675\t1.8208e-14\t2.8284e+00\t4.6067e-01 1 45\t3.4917e-15\n", + " 721\t7.5495e-15\t2.8284e+00\t4.1463e-01 1 46\t1.7459e-15\n", + " 768\t3.9968e-15\t2.8284e+00\t5.2941e-01 1 52\t5.4558e-17\n", + "\n" + ] + }, + { + "data": { + "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([-1.195842165283366e-15, -1.195842165283366e-15], \"error\")" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "SDG(TF[8], x=[0.01, 0.01], Plotf=1, printing=true) ## not working :(" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "35c3c1c4-57f5-472f-958d-9f082f66b6ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "NWTN (generic function with 1 method)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "include(\"NWTN.jl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "aebfe53d-f6a6-4f88-a141-a95be699fa4e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Newton's method\n", + "feval\trel gap\t\t|| g(x) ||\trate\t\tdelta\t\tls it\ta*\n", + "\n", + " 1\t4.0000e+00\t4.0000e+00\t\t\t0.00e+00 1 3\t7.20e-02\n", + " 5\t3.4877e+00\t1.1580e+01\t8.7193e-01\t0.00e+00 1 1\t2.17e-01\n", + " 7\t3.2106e+00\t1.1422e+01\t9.2053e-01\t0.00e+00 1 1\t2.92e-01\n", + " 9\t2.8939e+00\t1.1298e+01\t9.0137e-01\t0.00e+00 1 1\t4.43e-01\n", + " 11\t2.5138e+00\t1.1340e+01\t8.6866e-01\t0.00e+00 1\t1.00e+00\n", + " 12\t2.0350e+00\t1.3918e+01\t8.0951e-01\t0.00e+00 1\t1.00e+00\n", + " 13\t1.4916e+00\t4.5931e+00\t7.3297e-01\t0.00e+00 1 1\t2.01e-01\n", + " 15\t1.3444e+00\t4.4425e+00\t9.0135e-01\t0.00e+00 1 1\t2.77e-01\n", + " 17\t1.1767e+00\t4.3336e+00\t8.7522e-01\t0.00e+00 1 1\t4.34e-01\n", + " 19\t9.7661e-01\t4.4575e+00\t8.2998e-01\t0.00e+00 1\t1.00e+00\n", + " 20\t7.3072e-01\t7.2446e+00\t7.4823e-01\t0.00e+00 1\t1.00e+00\n", + " 21\t4.7358e-01\t1.8687e+00\t6.4810e-01\t0.00e+00 1 1\t2.60e-01\n", + " 23\t3.9577e-01\t2.1797e+00\t8.3570e-01\t0.00e+00 1 1\t4.30e-01\n", + " 25\t3.0401e-01\t3.0081e+00\t7.6815e-01\t0.00e+00 1\t1.00e+00\n", + " 26\t1.9691e-01\t6.1663e+00\t6.4770e-01\t0.00e+00 1\t1.00e+00\n", + " 27\t1.0228e-01\t1.3863e+00\t5.1945e-01\t0.00e+00 1 1\t4.31e-01\n", + " 29\t6.7912e-02\t2.2435e+00\t6.6396e-01\t0.00e+00 1\t1.00e+00\n", + " 30\t3.2680e-02\t3.8085e+00\t4.8121e-01\t0.00e+00 1\t1.00e+00\n", + " 31\t1.0566e-02\t8.0488e-01\t3.2332e-01\t0.00e+00 1\t1.00e+00\n", + " 32\t3.1590e-03\t1.9530e+00\t2.9898e-01\t0.00e+00 1\t1.00e+00\n", + " 33\t2.4534e-04\t9.6840e-02\t7.7664e-02\t0.00e+00 1\t1.00e+00\n", + " 34\t5.2049e-06\t9.3779e-02\t2.1215e-02\t0.00e+00 1\t1.00e+00\n", + " 35\t1.1473e-09\t2.1576e-04\t2.2042e-04\t0.00e+00 1\t1.00e+00\n", + " 36\t1.3971e-16\t4.8898e-07\t1.2178e-07" + ] + }, + { + "data": { + "image/png": "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x4wZ880331T9xbhDkWWZc/7ZZ5917dr1jhusWrWqfv36ps3Wr18fHh5uegwW0b59+y+++ML0uFu3bh9//PEtG3z33Xc9evSweV3aJMtyeHj4unXrTI8bNGjw448/3rLNCy+8MHbsWNPjiRMnjhw50tZVald+fr67u3tqairnvLi42MvLKykp6ZZtnnnmmWnTpqlRnfaZDt0ffvhh796977jB8uXLmzRpoigK53z16tX16tUzPa4CB+sI73sR5a5du7p162barHv37ufPn09PT7dJadpXUVGxb9++uLg405dxcXE7d+68fbPMzMzZs2cvXLgwJyfHtgVqTXp6+rlz57p3705EjLFu3brdvsN37dp1398IVE1CQoKPj0+DBg2IyM3NrX379rt27brjZrNmzVqxYoX564GAOe57tN+5c2dcXJwgCEQUFxd34sSJKt8Sx8GC8L6ysrIqlz5ydnb29vbOyspStyTNyMnJURTF39/f9GVAQMDt+9bT07NZs2b5+fnr1q1r0KBBYmKizcvUjqysLC8vr8pxqYCAgMzMzNu3qfzA+/v7Z2dncyyRYSHZ2dk3r6N2x/0fGhoaGBiYn5//wQcftGjR4tq1a7atUddu/vB7eHi4ublV+Whvd0E4a9Ysw218fHzM/HaDwSDLcuWXFRUVTk5O1qlUm/71r3/dvv9jYmKIyLSmVOUw1R33bZ8+fZYuXTpt2rQ1a9aMHDly8uTJNq5fS4xG482DghUVFbcvq2YwGCq3kSTJYDCY/kCGh3f7weT2/f/6669//vnn77///r59+1xdXb/66ivb1qhrt/wDkSSpykd7uwvCiRMnSre5evWqmd9umsdhelxQUFBUVHT7zEa4hy+//PL2/f/nn38SUY0aNYxGY+XuzcjIuPeM0Hbt2mH6wMMIDg4uLi6unJF0xx0eEhJS2aZkZGSEhITYtERNCw4OzszMrOyw7/2BF0WxTZs2+MDb0s0f/tzc3PLy8iof7e0uCKtm+/btBQUFRBQfH//LL78UFRUR0apVq2JiYjB931IYY3369Fm5ciURSZK0Zs2afv36EdH169e3bdtWXl5ORJXTRDnn69evx2z+hxEcHBwTE7Nq1SoiKioq2rRpk2mHFxQUbN++3bRNfHy86TdCRCtXroyPj1erWu1p1aqVKIqmXZ2RkbF///5HH32UiLKzs//44w/TNqWlpaYHJSUlW7duxQfe2jjn27ZtKywsJKL4+PgNGzaUlJQQ0apVq9q3b+/r61v1n+tAtm7d2rJly7CwME9Pz5YtW77++uum5xlju3fvNj0eOHBg06ZNR44cWb169c2bN6tXrAYlJSVVr1592LBhbdu2jY2NLSsr45yfO3eOiEx/O/fv379Lly4jRoxo3rx5RETEqVOn1C7Zsf32229+fn4jR45s2rTpwIEDTU/u3r2bMWZ6fOnSpaioqJ49e/bv379WrVoXL15Ur1gNWrhwob+//5gxYyIiIiZMmGB6cvHixZGRkabHQUFBffv2HT58eGhoaFxcnOlfBFjEpk2bvHv3jgAAAWZJREFUWrZsGRoa6u3t3bJlyylTpnDOKyoqiOjAgQOcc0VR+vbt27x585EjR/r5+e3YsaPKr+Vgd5+4evXqzScffH19w8PDiejgwYMNGjTw8PAgIs75zp07s7OzY2NjQ0NDVatVoy5durR9+/Zq1ap16dLFNGpYXl6enJwcHR1tNBqvXr164MCBvLy84ODgtm3bYoD24V28eHHPnj2BgYGdOnUyjf8VFRUdO3bskUceMW1QUlKyZcsWWZa7d++OO3Ra3IkTJxITE+vUqdOqVSvTM5cvX87KymrSpAkRpaenJyUllZWVRUZGtmjRQtVKtSYvL+/s2bOVX/r5+dWuXZuIDhw40KhRI9P9CBVF2bFjR25ubseOHR9mFMzBghAAAMCyNDJGCAAAUDUIQgAA0DUEIQAA6BqCEAAAdA1BCAAAuoYgBAAAXUMQAgCAriEIAQBA1xCEAACgawhCAADQNQQhAADo2v8DJhMMqV8JuGEAAAAASUVORK5CYII=", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/html": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "([0.9999999959286234, 0.9999999907475938], \"optimal\")" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NWTN(TF[6], printing=true, Plotf=1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.9.4", + "language": "julia", + "name": "julia-1.9" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.9.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}