Skip to content

Commit a63751f

Browse files
committed
Adding main files for the Hopfield Network Toolbox
This GitHub commit corresponds to commit no. 267 from legacy code (v7.1).
1 parent 44ee77b commit a63751f

File tree

295 files changed

+594052
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

295 files changed

+594052
-0
lines changed

+Test/test_hopfieldnetwork.m

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
classdef test_hopfieldnetwork < matlab.unittest.TestCase
2+
%TESTTSPHOPFIELDNET Summary of this class goes here
3+
% Detailed explanation goes here
4+
5+
methods (Test)
6+
% [the name of the tested method]_[expected input / tested state]_[expected behavior]
7+
8+
% Checking hopfieldnet method createOptions
9+
function createOptions_Unkwown_Errors(testCase)
10+
verifyError(testCase,@()hopfieldnetwork.createOptions('unknown',2),'hopfieldNetwork:unvalidSetting');
11+
end
12+
13+
function createOptions_u0WrongType_Errors(testCase)
14+
verifyError(testCase,@()hopfieldnetwork.createOptions('u0',uint8(2)),'hopfieldnetwork:invalid_datatype');
15+
end
16+
function createOptions_hwResourcesWrongType_Errors(testCase)
17+
verifyError(testCase,@()hopfieldnetwork.createOptions('hwResources',0),'hopfieldnetwork:invalid_datatype');
18+
end
19+
function createOptions_maxIterWrongType_Errors(testCase)
20+
verifyError(testCase,@()hopfieldnetwork.createOptions('maxIter',true),'hopfieldnetwork:invalid_datatype');
21+
end
22+
function createOptions_epsWrongType_Errors(testCase)
23+
verifyError(testCase,@()hopfieldnetwork.createOptions('e',{7}),'hopfieldnetwork:invalid_datatype');
24+
end
25+
function createOptions_qWrongType_Errors(testCase)
26+
verifyError(testCase,@()hopfieldnetwork.createOptions('q',single(0.05)),'hopfieldnetwork:invalid_datatype');
27+
end
28+
function createOptions_R_ITERWrongType_Errors(testCase)
29+
verifyError(testCase,@()hopfieldnetwork.createOptions('R_ITER',uint32(20)),'hopfieldnetwork:invalid_datatype');
30+
end
31+
function createOptions_dtWrongType_Errors(testCase)
32+
verifyError(testCase,@()hopfieldnetwork.createOptions('dt',single(0.01)),'hopfieldnetwork:invalid_datatype');
33+
end
34+
function createOptions_showCommandLineWrongType_Errors(testCase)
35+
verifyError(testCase,@()hopfieldnetwork.createOptions('showCommandLine',1),'hopfieldnetwork:invalid_datatype');
36+
end
37+
function createOptions_transferFcnWrongType_Errors(testCase)
38+
verifyError(testCase,@()hopfieldnetwork.createOptions('transferFcn',{'exponential'}),'hopfieldnetwork:invalid_datatype');
39+
end
40+
function createOptions_loggingVWrongType_Errors(testCase)
41+
verifyError(testCase,@()hopfieldnetwork.createOptions('loggingV',1),'hopfieldnetwork:invalid_datatype');
42+
end
43+
function createOptions_viewConvergenceWrongType_Errors(testCase)
44+
verifyError(testCase,@()hopfieldnetwork.createOptions('viewConvergence',1),'hopfieldnetwork:invalid_datatype');
45+
end
46+
function createOptions_viewConvergenceSpeedWrongType_Errors(testCase)
47+
verifyError(testCase,@()hopfieldnetwork.createOptions('viewConvergenceSpeed',single(0.2)),'hopfieldnetwork:invalid_datatype');
48+
end
49+
50+
function createOptions_u0WrongValue_Errors(testCase)
51+
verifyError(testCase,@()hopfieldnetwork.createOptions('u0',0),'hopfieldnetwork:invalid_value');
52+
end
53+
function createOptions_hwResourcesWrongValue_Errors(testCase)
54+
verifyError(testCase,@()hopfieldnetwork.createOptions('hwResources','FPGA'),'hopfieldnetwork:invalid_value');
55+
end
56+
function createOptions_maxIterWrongValue_Errors(testCase)
57+
verifyError(testCase,@()hopfieldnetwork.createOptions('maxIter',0),'hopfieldnetwork:invalid_value');
58+
end
59+
function createOptions_eWrongValue_Errors(testCase)
60+
verifyError(testCase,@()hopfieldnetwork.createOptions('e',50),'hopfieldnetwork:invalid_value');
61+
end
62+
function createOptions_qWrongValue_Errors(testCase)
63+
verifyError(testCase,@()hopfieldnetwork.createOptions('q',0),'hopfieldnetwork:invalid_value');
64+
end
65+
function createOptions_R_ITERWrongValue_Errors(testCase)
66+
verifyError(testCase,@()hopfieldnetwork.createOptions('R_ITER',-1),'hopfieldnetwork:invalid_value');
67+
end
68+
function createOptions_dtWrongValue_Errors(testCase)
69+
verifyError(testCase,@()hopfieldnetwork.createOptions('dt',0),'hopfieldnetwork:invalid_value');
70+
end
71+
function createOptions_transferFcnWrongValue_Errors(testCase)
72+
verifyError(testCase,@()hopfieldnetwork.createOptions('transferFcn','linear'),'hopfieldnetwork:invalid_value');
73+
end
74+
function createOptions_viewConvergenceSpeedWrongValue_Errors(testCase)
75+
verifyError(testCase,@()hopfieldnetwork.createOptions('viewConvergenceSpeed',1),'hopfieldnetwork:invalid_value');
76+
end
77+
78+
function createOptions_ValidProperty_Works(testCase)
79+
u0 = 0.35;
80+
options = hopfieldnetwork.createOptions('u0',u0);
81+
verifyEqual(testCase,options.setting.u0,u0);
82+
end
83+
end
84+
85+
end

+Test/test_tsphopfieldnet.m

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
classdef test_tsphopfieldnet < matlab.unittest.TestCase
2+
%TEST_TSPHOPFIELDNET Summary of this class goes here
3+
% Detailed explanation goes here
4+
5+
methods (Test)
6+
% [the name of the tested method]_[expected input / tested state]_[expected behavior]
7+
8+
% Verify inputs
9+
% Checking tsphopfieldnet input arguments
10+
function tsphopfieldnet_IncorrecNumberInputs_Errors(testCase)
11+
verifyError(testCase,@()tsphopfieldnet(),'tsphopfieldnet:IncorrectInputArguments');
12+
end
13+
function tsphopfieldnet_networkSizeNotDouble_Errors(testCase)
14+
verifyError(testCase,@()tsphopfieldnet(uint8(10),0.1),'hopfieldnetwork:invalid_datatype');
15+
end
16+
function tsphopfieldnet_networkSizeTooSmall_Errors(testCase)
17+
verifyError(testCase,@()tsphopfieldnet(1,0.1),'tsphopfieldnet:invalid_value');
18+
end
19+
function tsphopfieldnet_CNotDouble_Errors(testCase)
20+
verifyError(testCase,@()tsphopfieldnet(10,single(0.1)),'tsphopfieldnet:invalid_datatype');
21+
end
22+
function tsphopfieldnet_CNotPositive_Errors(testCase)
23+
verifyError(testCase,@()tsphopfieldnet(10,0),'tsphopfieldnet:invalid_value');
24+
end
25+
function tsphopfieldnet_optionsNotStruct_Errors(testCase)
26+
verifyError(testCase,@()tsphopfieldnet(10,0.1,'options'),'hopfieldnetwork:invalid_datatype');
27+
end
28+
29+
function createOptions_transferFcnIssatlin_invTransferFcnIsinvsatlin(testCase)
30+
options = tsphopfieldnet.createOptions('u0',0.5,'transferFcn','satlin');
31+
networkSize = 10;
32+
C = 0.1;
33+
net = tsphopfieldnet(networkSize, C, options);
34+
transferFcn = getSetting(net,'transferFcn');
35+
invTransferFcn = getSetting(net,'invTransferFcn');
36+
value = 0.1234;
37+
verifyEqual(testCase, invTransferFcn(transferFcn(value)), value, 'AbsTol', power(10, -1 * getSetting(net,'e')));
38+
end
39+
40+
function createOptions_invTransferFcnIsinvsatlin_transferFcnIssatlin(testCase)
41+
options = tsphopfieldnet.createOptions('u0',0.5,'invTransferFcn','invsatlin');
42+
networkSize = 10;
43+
C = 0.1;
44+
net = tsphopfieldnet(networkSize, C, options);
45+
invTransferFcn = getSetting(net,'invTransferFcn');
46+
transferFcn = getSetting(net,'transferFcn');
47+
value = 0.1234;
48+
verifyEqual(testCase, transferFcn(invTransferFcn(value)), value, 'AbsTol', power(10, -1 * getSetting(net,'e')));
49+
end
50+
51+
function createOptions_transferFcnIstanh_invTransferFcnIsatanh(testCase)
52+
options = tsphopfieldnet.createOptions('u0',0.5,'transferFcn','tanh');
53+
networkSize = 10;
54+
C = 0.1;
55+
net = tsphopfieldnet(networkSize, C, options);
56+
transferFcn = getSetting(net,'transferFcn');
57+
invTransferFcn = getSetting(net,'invTransferFcn');
58+
value = 0.1234;
59+
verifyEqual(testCase, invTransferFcn(transferFcn(value)), value, 'AbsTol', power(10, -1 * getSetting(net,'e')));
60+
end
61+
62+
function createOptions_invTransferFcnIsatanh_transferFcnIstanh(testCase)
63+
options = tsphopfieldnet.createOptions('u0',0.5,'invTransferFcn','atanh');
64+
networkSize = 10;
65+
C = 0.1;
66+
net = tsphopfieldnet(networkSize, C, options);
67+
invTransferFcn = getSetting(net,'invTransferFcn');
68+
transferFcn = getSetting(net,'transferFcn');
69+
value = 0.1234;
70+
verifyEqual(testCase, transferFcn(invTransferFcn(value)), value, 'AbsTol', power(10, -1 * getSetting(net,'e')));
71+
end
72+
73+
function createOptions_distanceMatrixNotDouble_Errors(testCase)
74+
verifyError(testCase, @()tsphopfieldnet.createOptions('d',rand(4,'single')),'tsphopfieldnet:invalid_datatype');
75+
end
76+
function createOptions_distanceMatrixNotSquare_Errors(testCase)
77+
verifyError(testCase, @()tsphopfieldnet.createOptions('d',rand(3,4)),'tsphopfieldnet:invalid_value');
78+
end
79+
function tsphopfieldnet_distanceMatrixNotSameSizeNetwork_Errors(testCase)
80+
options = tsphopfieldnet.createOptions('d',rand(4));
81+
networkSize = 10;
82+
C = 0.1;
83+
verifyError(testCase, @()tsphopfieldnet(networkSize, C, options),'tsphopfieldnet:invalid_value');
84+
end
85+
86+
function createOptions_coordsMatrixNotDouble_Errors(testCase)
87+
verifyError(testCase, @()tsphopfieldnet.createOptions('coords',rand(4,2,'single')),'tsphopfieldnet:invalid_datatype');
88+
end
89+
function createOptions_coordsMatrixNotTwoColumns_Errors(testCase)
90+
verifyError(testCase, @()tsphopfieldnet.createOptions('coords',rand(4,3)),'tsphopfieldnet:invalid_value');
91+
end
92+
function setOptions_coordsMatrixNotNetworkSize_Errors(testCase)
93+
options = tsphopfieldnet.createOptions('coords',rand(4,2));
94+
networkSize = 10;
95+
C = 0.1;
96+
verifyError(testCase, @()tsphopfieldnet(networkSize, C, options),'tsphopfieldnet:invalid_value');
97+
end
98+
function setOptions_cityNamesNotCell_Errors(testCase)
99+
verifyError(testCase, @()tsphopfieldnet.createOptions('names','Madrid'),'tsphopfieldnet:invalid_datatype');
100+
end
101+
function setOptions_cityNamesNotCellArrayOfChars_Errors(testCase)
102+
options = tsphopfieldnet.createOptions('names',{1,'Madrid','2'});
103+
networkSize = 3;
104+
C = 0.1;
105+
verifyError(testCase, @()tsphopfieldnet(networkSize, C, options),'tsphopfieldnet:invalid_value');
106+
end
107+
function setOptions_cityNamesNotNetworkSize_Errors(testCase)
108+
options = tsphopfieldnet.createOptions('names',{'London','Madrid','Berlin','Paris'});
109+
networkSize = 3;
110+
C = 0.1;
111+
verifyError(testCase, @()tsphopfieldnet(networkSize, C, options),'tsphopfieldnet:invalid_value');
112+
end
113+
114+
% TODO tests to ensure that fixedCities and startinPos have the same length
115+
116+
function createOptions_trainFcnNotChar_Errors(testCase)
117+
verifyError(testCase, @()tsphopfieldnet.createOptions('trainFcn',{'trainty'}),'tsphopfieldnet:invalid_datatype');
118+
end
119+
function createOptions_trainFcnNotValid_Errors(testCase)
120+
verifyError(testCase, @()tsphopfieldnet.createOptions('trainFcn','trainyt'),'tsphopfieldnet:invalid_value');
121+
end
122+
function createOptions_simFcnNotChar_Errors(testCase)
123+
verifyError(testCase, @()tsphopfieldnet.createOptions('simFcn',{'talavan-yanez'}),'tsphopfieldnet:invalid_datatype');
124+
end
125+
function createOptions_simFcnNotValid_Errors(testCase)
126+
verifyError(testCase, @()tsphopfieldnet.createOptions('simFcn','yanez-talavan'),'tsphopfieldnet:invalid_value');
127+
end
128+
129+
function train_trainFcnIsTrainty_WorksFine(testCase)
130+
import matlab.unittest.constraints.IsEqualTo;
131+
import matlab.unittest.constraints.AbsoluteTolerance;
132+
133+
networkSize = 6;
134+
C = 0.1;
135+
options = tsphopfieldnet.createOptions('trainFcn','trainty');
136+
net = tsphopfieldnet(networkSize, C, options);
137+
trainParamExpected = getTrainParam(net);
138+
trainParamExpected.A = 2.6;
139+
trainParamExpected.B = 3.1;
140+
trainParamExpected.D = 1;
141+
trainParamExpected.Np = 36;
142+
trainParamExpected.dL = 0.5;
143+
trainParamExpected.dU = 1;
144+
trainParamExpected.dUaux = 2;
145+
trainParamExpected.K = 0;
146+
trainParamExpected.rho = 0.5;
147+
trainParamExpected = orderfields(trainParamExpected);
148+
train(net);
149+
trainParam = getTrainParam(net);
150+
verifyThat(testCase, trainParam, IsEqualTo(trainParamExpected, 'Within', AbsoluteTolerance(power(10, -1 * getSetting(net,'e')))));
151+
end
152+
function train_trainFcnIsNotTrainty_Errors(testCase)
153+
networkSize = 6;
154+
C = 0.1;
155+
options = tsphopfieldnet.createOptions('trainFcn','trainty');
156+
options.trainFcn = 'nottrainty';
157+
net = tsphopfieldnet(networkSize, C, options);
158+
verifyError(testCase, @()train(net),'tsphopfieldnet:unvalidTrainFcn');
159+
end
160+
161+
function sim_simTalavanYanezOutputWithPolygon_hasOne1perRow(testCase)
162+
rng(2);
163+
options = tsphopfieldnet.createOptions('simFcn','talavan-yanez');
164+
networkSize = 6;
165+
C = 0.1;
166+
net = tsphopfieldnet(networkSize, C, options);
167+
train(net);
168+
V = sim(net);
169+
verifyTrue(testCase, all(sum(V,2) == 1));
170+
end
171+
function sim_simTalavanYanezOutputWithPolygon_hasOne1perCol(testCase)
172+
rng(2);
173+
options = tsphopfieldnet.createOptions('simFcn','talavan-yanez');
174+
networkSize = 6;
175+
C = 0.1;
176+
net = tsphopfieldnet(networkSize, C, options);
177+
train(net);
178+
V = sim(net);
179+
verifyTrue(testCase, all(sum(V,1) == 1));
180+
end
181+
function sim_simTalavanYanezOutputWithPolygon_sumsN(testCase)
182+
rng(2);
183+
options = tsphopfieldnet.createOptions('simFcn','talavan-yanez');
184+
networkSize = 6;
185+
C = 0.1;
186+
net = tsphopfieldnet(networkSize, C, options);
187+
train(net);
188+
V = sim(net);
189+
verifyEqual(testCase, sum(sum(V)), networkSize);
190+
end
191+
192+
function sim_simTalavanYanezOutputWithBerlin52_hasOne1perRow(testCase)
193+
rng(2);
194+
problem = tsplib({'berlin52'});
195+
options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','talavan-yanez');
196+
networkSize = problem.nCities;
197+
C = 0.1;
198+
net = tsphopfieldnet(networkSize, C, options);
199+
train(net);
200+
V = sim(net);
201+
verifyTrue(testCase, all(sum(V,2) == 1));
202+
end
203+
function sim_simTalavanYanezOutputWithBerlin52_hasOne1perCol(testCase)
204+
rng(2);
205+
problem = tsplib({'berlin52'});
206+
options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','talavan-yanez');
207+
networkSize = problem.nCities;
208+
C = 0.1;
209+
net = tsphopfieldnet(networkSize, C, options);
210+
train(net);
211+
V = sim(net);
212+
verifyTrue(testCase, all(sum(V,1) == 1));
213+
end
214+
function sim_simTalavanYanezOutputWithBerlin52_sumsN(testCase)
215+
rng(2);
216+
problem = tsplib({'berlin52'});
217+
options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','talavan-yanez');
218+
networkSize = problem.nCities;
219+
C = 0.1;
220+
net = tsphopfieldnet(networkSize, C, options);
221+
train(net);
222+
V = sim(net);
223+
verifyEqual(testCase, sum(sum(V)), networkSize);
224+
end
225+
226+
function reinit_netObjectAlreadySimulated_WorksFine(testCase)
227+
import matlab.unittest.constraints.IsEqualTo;
228+
229+
networkSize = 6;
230+
C = 0.1;
231+
net = tsphopfieldnet(networkSize, C);
232+
expectedResults = getResults(net);
233+
train(net);
234+
sim(net);
235+
reinit(net);
236+
results = getResults(net);
237+
verifyThat(testCase, results, IsEqualTo(expectedResults));
238+
end
239+
240+
function saddle_simFcnNotTalavanYanez_saddleGetsComputed(testCase)
241+
networkSize = 10;
242+
C = 0.0001;
243+
options = tsphopfieldnet.createOptions('simFcn', 'divide-conquer');
244+
net = tsphopfieldnet(networkSize, C, options);
245+
simFcnExpected = getSimFcn(net);
246+
saddle(net);
247+
verifyEqual(testCase, getSimFcn(net), simFcnExpected);
248+
end
249+
function saddle_computingSaddle_allColumnsEqual(testCase)
250+
import matlab.unittest.constraints.IsEqualTo;
251+
import matlab.unittest.constraints.AbsoluteTolerance;
252+
253+
problem = tsplib({'berlin52'});
254+
options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','talavan-yanez');
255+
networkSize = problem.nCities;
256+
C = 0.1;
257+
net = tsphopfieldnet(networkSize, C, options);
258+
train(net);
259+
V = saddle(net);
260+
for i = 2:networkSize
261+
verifyThat(testCase, V(:,1), IsEqualTo(V(:,i), 'Within', AbsoluteTolerance(power(10, -1 * getSetting(net,'e')))));
262+
end
263+
end
264+
265+
end
266+
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
function net = addDefaultOptionValues(net, options)
2+
3+
% if isempty(options.cities.names)
4+
% net.cities.names = tsphopfieldnet.cityTextGeneration(net.trainParam.N);
5+
% end
6+
%
7+
% if isempty(options.cities.type)
8+
% net.cities.type = 'EUC';
9+
% end
10+
%
11+
% if isempty(options.cities.coords) && isempty(options.cities.d)
12+
% net.cities.coords = tsphopfieldnet.polygonCoords(1, net.trainParam.N);
13+
% end
14+
%
15+
% if isempty(options.cities.d)
16+
% net.cities.d = [];
17+
% end
18+
%
19+
% if isempty(options.cities.fixedCities)
20+
% net.cities.fixedCities = {''};
21+
% net.cities.startFixedCitiesIn = NaN;
22+
% end
23+
24+
if isempty(options.trainFcn)
25+
net.trainFcn = 'traingty';
26+
end
27+
28+
if isempty(options.simFcn)
29+
net.simFcn = 'talavan-yanez';
30+
end
31+
32+
end

0 commit comments

Comments
 (0)