Skip to content

Commit

Permalink
Interface redesign to include schemes. Minor bugs and enhancements
Browse files Browse the repository at this point in the history
Bug Fixing:
#47 Incorrect computation for dL and dU when K > 0

Enhancements:
#12 Vectorize invsatlin function in @hopfieldnetwork class
#36 Separate CHN schemes from Simulation functions
- HopfieldNetworkGQKP supports 'classic' Scheme only
- HopfieldNetworkTSP supports 'classic', 'classic&2opt',
'divide-conquer', 'divide-conquer&2opt' and '2opt
#37 Add CheckpointPath support for HopfieldNetworkGQKP
#38 Add Runge-Kutta simulation to HopfieldNetworkTSP
#39 Add GPU support for all SimFcn methods
#40 Allow to provide only V as input to simulation in HopfieldNetworks
#41 Compute saddle point in HopfieldNetworkGQKP
#42 Compute weights and biases from parameters in HopfieldNetworkGQKP
networks
#43 Add support for SimulationPlot in HopfieldNetworkGQKP
#44 Share CheckpointPath utilities between HopfieldNetworkGQKP and
HopfieldNetworkTSP
#45 Vectorize simEuler method in HopfieldNetworkTSP
#46 SimFcn support in HopfieldNetworkTSP
#48 2-opt simulation using 'lin-kernighan' and 'hopfield'

Updating release notes.
  • Loading branch information
mathinking committed Jun 30, 2017
1 parent 18c081b commit 5b4dcb6
Show file tree
Hide file tree
Showing 25 changed files with 967 additions and 550 deletions.
3 changes: 3 additions & 0 deletions chn/+network/@HopfieldNetwork/getScheme.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function scheme = getScheme(net)
scheme = net.Scheme;
end
11 changes: 5 additions & 6 deletions chn/+network/@HopfieldNetwork/hopfieldnetwork.m
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@
net = sim(net);
disp(net);
plot(net, varargin);
saddle(net, method);
viewConvergence(iter,V,net);

% --- Set methods --- %
setTrainFcn(net,trainFcn);
Expand All @@ -72,29 +74,26 @@
end

methods (Hidden = true, Access = private)
%net = addDefaultOptionValues(net, options);
net = setOptions(net, options);
end

methods (Hidden = false, Access = protected)
net = init(net);
end

% methods (Static = true, Access = public)
% options = createOptions(varargin);
% end

methods (Static = true, Access = protected)
y = satlin(x,u0);
y = invsatlin(x,u0);
end

methods(Access = public) % --- Get-Set methods --- %
% --- Get-Set methods --- %
methods(Access = public)
trainFcn = getTrainFcn(net);
trainParam = getTrainParam(net,field);
setting = getSetting(net,field);
simFcn = getSimFcn(net);
results = getResults(net,field);
scheme = getScheme(net);
setSetting(net,property,value);
setResults(net,property,value);
end
Expand Down
16 changes: 5 additions & 11 deletions chn/+network/@HopfieldNetwork/invsatlin.m
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
function y = invsatlin(x,u0)
y = zeros(size(x));
for j = 1:size(x,2)
for i = 1:size(x,1);
if x(i,j) < 0
y(i,j) = u0;
elseif x(i,j) > 1
y(i,j) = -u0;
else
y(i,j) = u0 * (2*x(i,j) - 1);
end
end
end

y(x <= 0) = -u0;
y(x >= 1) = u0;
y(0 < x & x < 1) = u0 .* (2.*x(0 < x & x < 1) - 1);

end
12 changes: 3 additions & 9 deletions chn/+network/@HopfieldNetworkGQKP/HopfieldNetworkGQKP.m
Original file line number Diff line number Diff line change
Expand Up @@ -120,18 +120,12 @@

% --- Methods definitions --- %
methods (Hidden = true, Access = private)
%net = addDefaultOptionValues(net, options);
net = setOptions(net,options);
end

% methods (Static = true, Hidden = true, Access = protected)
% % isValidSetting(property,value);
% end
%
% methods (Static = true, Hidden = false, Access = public)
% % options = createOptions(varargin);
% end

methods (Static = true, Hidden = true, Access = private)

end
methods (Hidden = false, Access = protected)
net = init(net);
end
Expand Down
10 changes: 10 additions & 0 deletions chn/+network/@HopfieldNetworkGQKP/saddle.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
function S = saddle(net, method)

method = 'analytic'; % No other method currently supported for HopfieldNetworkGQKP

if ~isfield(net.TrainParam, 'T')
net = train(net);
end
S = -net.TrainParam.T\net.TrainParam.ib;

end
174 changes: 135 additions & 39 deletions chn/+network/@HopfieldNetworkGQKP/sim.m
Original file line number Diff line number Diff line change
@@ -1,19 +1,45 @@
function V = sim(net,V,U)
function V = sim(net,V,U,isSaddle)

if nargin == 1 % Start in the center of the Hypercube. Replace for saddle?
U = rand(net.TrainParam.N,1)-.5;
V = 0.5 + 1e-7*U;
elseif nargin == 2
U = net.Setting.InvTransferFcn(V);
end

% Send data to GPU
if strcmp(net.Setting.ExecutionEnvironment,'gpu')
U = gpuArray(U);
V = gpuArray(V);
end

if nargin < 4
isSaddle = false;
end

if ~isSaddle % Logging time and Checkpoint
timeID = tic;

timeID = tic;
if ~isempty(net.Setting.CheckpointPath)
net.Results.CheckpointFilename = ...
utils.checkpoint.createFilename(net.Setting.CheckpointPath,net.SimFcn);
else
net.Results.CheckpointFilename = '';
end
end

net = reinit(net);

if ~isfield(net.TrainParam,'T')
error('HopfieldNetworkGQKP:NotTrained', 'Training has not taken place yet. Use train(net).');
end

% Classic Scheme support only
if strcmp(net.SimFcn,'euler')
if nargin < 2
[net,V,~,iter] = simEuler(net);
else
[net,V,~,iter] = simEuler(net,V,U);
end
[net,V,~,iter] = simEuler(net,V,U,isSaddle);

elseif strcmp(net.SimFcn,'talavan-yanez')
if nargin < 2
[net,V,~,iter] = simTalavanYanez(net);
else
[net,V,~,iter] = simTalavanYanez(net,V,U);
end
[net,V,~,iter] = simTalavanYanez(net,V,U,isSaddle);
end
net = computeSolution(net,V,iter);

Expand All @@ -22,8 +48,7 @@


% Euler Algorithm

function [net,V,U,iter] = simEuler(net,V)
function [net,V,U,iter] = simEuler(net,V,U,isSaddle)

% Stopping criteria
stopC1 = power(10, -1 * net.Setting.E);
Expand All @@ -38,17 +63,25 @@
% Memory allocation
dU = zeros(N,1);

if nargin == 1
U = rand(N,1)-.5; % TODO Different from Pedro's algorithm
V = 0.5 + 1e-7*U; % TODO Different from Pedro's algorithm
end

iter = 1;
% Showing Network parameters in the command window
% if net.Setting.Verbose
% hopfield.tsp.display.printWhenStarting(net);
% end

if ~isSaddle % Logging Checkpoint and plotting Simulation process
if ~isempty(net.Setting.CheckpointPath) || net.Setting.SimulationPlot
if ~isempty(net.Setting.CheckpointPath)
utils.checkpoint.loggingData(fullfile(net.Setting.CheckpointPath, ...
net.Results.CheckpointFilename),...
net.Setting.MaxIter,iter,V,zeros(size(V)));
end
if net.Setting.SimulationPlot
fV = viewConvergence(iter,V,net);
end
end
end

dt = net.Setting.Dt;
net.Results.Time(iter) = dt;
maxDiffV = 1;
Expand All @@ -66,34 +99,60 @@
V = net.Setting.TransferFcn(U);

maxDiffV = max(abs(Vprev-V));
iter = iter + 1;
iter = iter + 1;

if ~isSaddle % Logging Checkpoint and plotting Simulation process
if ~isempty(net.Setting.CheckpointPath) || net.Setting.SimulationPlot
if ~isempty(net.Setting.CheckpointPath)
utils.checkpoint.loggingData(fullfile(net.Setting.CheckpointPath,...
net.Results.CheckpointFilename),...
net.Setting.MaxIter,iter,V,dU);
end
if net.Setting.SimulationPlot
fV = viewConvergence(iter,V,net,fV);
end
end
end
end

if strcmp(net.Setting.ExecutionEnvironment,'gpu') && nargout > 1
V = gather(V);
U = gather(U);
end

if ~isSaddle % Logging Checkpoint
if ~isempty(net.Setting.CheckpointPath)
utils.checkpoint.trimToSimulatedData(net.Setting.CheckpointPath, ...
net.Results.CheckpointFilename, iter)
end
end

net.Results.x = V;
end

% Talaván-Yáñez Algorithm

function [net,V,U,iter] = simTalavanYanez(net,V,U)

function [net,V,U,iter] = simTalavanYanez(net,V,U,isSaddle)

N = net.ProblemParameters.networkSize(1);
T = net.TrainParam.T;
ib = net.TrainParam.ib;

if nargin == 1
U = rand(N,1)-.5; % TODO Different from Pedro's algorithm
V = 0.5 + 1e-7*U; % TODO Different from Pedro's algorithm
end
if strcmp(net.Setting.ExecutionEnvironment,'GPU')
U = gpuArray(U);
V = gpuArray(V);
end

% Stopping criteria
stopC1 = power(10, -1 * net.Setting.E);
stopC2 = power(10, -1.5 * net.Setting.E);
maxDiffV = 1;
unstable = false;


trasferFcn2Str = func2str(net.Setting.TransferFcn);
if strcmp(trasferFcn2Str,'@(u)0.5*(1+tanh(u./net.Setting.U0))')
trasferFcn2Str = 'tanh';
elseif strcmp(trasferFcn2Str,'@(u)net.satlin(u,net.Setting.U0)')
trasferFcn2Str = 'satlin';
else
error('HopfieldNetworkTSP:sim:notDefinedTransferFcn', ...
['TransferFcn derivative not defined for ',net.Setting.TransferFcn]);
end

u_e = net.Setting.InvTransferFcn(stopC1);

iter = 1;
Expand All @@ -102,6 +161,19 @@
% hopfield.tsp.display.printWhenStarting(net);
% end

if ~isSaddle % Logging Checkpoint and plotting Simulation process
if ~isempty(net.Setting.CheckpointPath) || net.Setting.SimulationPlot
if ~isempty(net.Setting.CheckpointPath)
utils.checkpoint.loggingData(fullfile(net.Setting.CheckpointPath, ...
net.Results.CheckpointFilename),...
net.Setting.MaxIter,iter,V,zeros(size(V)));
end
if net.Setting.SimulationPlot
fV = viewConvergence(iter,V,net);
end
end
end

while iter < net.Setting.MaxIter && (maxDiffV > stopC1 || ...
(maxDiffV > stopC2 && unstable))

Expand All @@ -113,8 +185,12 @@

dU = T*V + ib;

dV = 2./net.Setting.U0 .* V .* (1-V) .*dU;

if strcmp(trasferFcn2Str,'tanh')
dV = 2./net.Setting.U0 .* V .* (1-V) .*dU;
elseif strcmp(trasferFcn2Str,'satlin')
dV = 2./net.Setting.U0 .* dU;
end

interiorV = U > u_e & U < -u_e;

% Computation of dt
Expand Down Expand Up @@ -209,7 +285,7 @@

%%%
% $E(t + \Delta t) = E(t) - S_{1}\Delta t + \frac{1}{2}S_{2}\Delta t^{2}$
if strcmp(net.Setting.ExecutionEnvironment,'GPU')
if strcmp(net.Setting.ExecutionEnvironment,'gpu')
S1 = gather(S1);
S2 = gather(S2);
dt = gather(dt);
Expand All @@ -218,18 +294,38 @@
S1.*dt + 0.5.*S2.*dt.^2;
net.Results.Time(iter+1) = net.Results.Time(iter) + dt;
iter = iter + 1;

if ~isSaddle % Logging Checkpoint and plotting Simulation process
if ~isempty(net.Setting.CheckpointPath) || net.Setting.SimulationPlot
if ~isempty(net.Setting.CheckpointPath)
utils.checkpoint.loggingData(fullfile(net.Setting.CheckpointPath,...
net.Results.CheckpointFilename),...
net.Setting.MaxIter,iter,V,dU);
end
if net.Setting.SimulationPlot
fV = viewConvergence(iter,V,net,fV);
end
end
end
end

if strcmp(net.Setting.ExecutionEnvironment,'GPU') && nargout > 1
if strcmp(net.Setting.ExecutionEnvironment,'gpu') && nargout > 1
V = gather(V);
U = gather(U);
iter = gather(iter);
end

if ~isSaddle % Logging Checkpoint
if ~isempty(net.Setting.CheckpointPath)
utils.checkpoint.trimToSimulatedData(net.Setting.CheckpointPath, ...
net.Results.CheckpointFilename, iter);
end
end

end

function net = computeSolution(net,V,iter)

V(V > 1 - power(10, -1 * net.Setting.E)) = 1; %FIXME to be removed?
V(V > 1 - power(10, -1 * net.Setting.E)) = 1;
V(V < power(10, -1 * net.Setting.E)) = 0;

if isequal(net.ProblemParameters.R*V,net.ProblemParameters.b)
Expand Down
Loading

0 comments on commit 5b4dcb6

Please sign in to comment.