source: LinearAlgebra/src/unittests/MatrixContentSymmetricUnitTest.cpp@ 2ba2ed

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 2ba2ed was 94d5ac6, checked in by Frederik Heber <heber@…>, 12 years ago

FIX: As we use GSL internally, we are as of now required to use GPL v2 license.

  • GNU Scientific Library is used at every place in the code, especially the sub-package LinearAlgebra is based on it which in turn is used really everywhere in the remainder of MoleCuilder. Hence, we have to use the GPL license for the whole of MoleCuilder. In effect, GPL's COPYING was present all along and stated the terms of the GPL v2 license.
  • Hence, I added the default GPL v2 disclaimer to every source file and removed the note about a (actually missing) LICENSE file.
  • also, I added a help-redistribute action which again gives the disclaimer of the GPL v2.
  • also, I changed in the disclaimer that is printed at every program start in builder_init.cpp.
  • TEST: Added check on GPL statement present in every module to test CodeChecks project-disclaimer.
  • Property mode set to 100644
File size: 7.4 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * MatrixContentSymmetricUnitTest.cpp
25 *
26 * Created on: Jan 8, 2010
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35using namespace std;
36
37#include <cppunit/CompilerOutputter.h>
38#include <cppunit/extensions/TestFactoryRegistry.h>
39#include <cppunit/ui/text/TestRunner.h>
40
41#include "MatrixContentSymmetricUnitTest.hpp"
42
43#include "MatrixContent.hpp"
44
45#ifdef HAVE_TESTRUNNER
46#include "UnitTestMain.hpp"
47#endif /*HAVE_TESTRUNNER*/
48
49/********************************************** Test classes **************************************/
50
51// Registers the fixture into the 'registry'
52CPPUNIT_TEST_SUITE_REGISTRATION( MatrixContentSymmetricTest );
53
54
55void MatrixContentSymmetricTest::setUp()
56{
57 m = new MatrixContent(3,3);
58};
59
60void MatrixContentSymmetricTest::tearDown()
61{
62 delete(m);
63};
64
65/** Unit Test for accessing matrix elements.
66 *
67 */
68void MatrixContentSymmetricTest::AccessTest()
69{
70 // check whether all elements are initially zero
71 for (int i=0;i<3;i++)
72 for (int j=0;j<3;j++)
73 CPPUNIT_ASSERT_EQUAL( 0., m->at(i,j) );
74
75 // set
76 for (int i=0;i<3;i++)
77 for (int j=0;j<3;j++)
78 m->set(i,j, i*3+j );
79
80 // and check
81 double *ptr = NULL;
82 for (int i=0;i<3;i++)
83 for (int j=0;j<3;j++) {
84 CPPUNIT_ASSERT_EQUAL( (double)(i*3+j), m->at(i,j) );
85 ptr = m->Pointer(i,j);
86 CPPUNIT_ASSERT_EQUAL( (double)(i*3+j), *ptr );
87 }
88
89 // assignment
90 for (int i=0;i<3;i++)
91 for (int j=0;j<3;j++)
92 m->set(i,j, i*3+j );
93 MatrixContent *dest = new MatrixContent(3,3);
94 *dest = *m;
95 for (int i=0;i<3;i++)
96 for (int j=0;j<3;j++)
97 CPPUNIT_ASSERT_EQUAL( dest->at(i,j), m->at(i,j) );
98 delete(dest);
99
100 // out of bounds
101 //CPPUNIT_ASSERT_EQUAL(0., v->at(4,2) );
102 //CPPUNIT_ASSERT_EQUAL(0., v->at(2,17) );
103 //CPPUNIT_ASSERT_EQUAL(0., v->at(1024,140040) );
104 //CPPUNIT_ASSERT_EQUAL(0., v->at(-1,0) );
105 //CPPUNIT_ASSERT_EQUAL(0., v->at(0,-1) );
106 //CPPUNIT_ASSERT_EQUAL(0., v->at(-1,-1) );
107};
108
109/** Unit Test for initializating matrices.
110 *
111 */
112void MatrixContentSymmetricTest::InitializationTest()
113{
114 // set zero
115 m->setZero();
116 for (int i=0;i<3;i++)
117 for (int j=0;j<3;j++)
118 CPPUNIT_ASSERT_EQUAL( 0., m->at(i,j) );
119
120 // set all
121 m->setValue(1.5);
122 for (int i=0;i<3;i++)
123 for (int j=0;j<3;j++)
124 CPPUNIT_ASSERT_EQUAL( 1.5, m->at(i,j) );
125
126 // set basis
127 m->setIdentity();
128 for (int i=0;i<3;i++)
129 for (int j=0;j<3;j++)
130 CPPUNIT_ASSERT_EQUAL( i == j ? 1. : 0. , m->at(i,j) );
131
132 // set from array
133 double array[] = { 1., 0., 0.,
134 0., 1., 0.,
135 0., 0., 1. };
136 m->setFromDoubleArray(array);
137 for (int i=0;i<3;i++)
138 for (int j=0;j<3;j++)
139 CPPUNIT_ASSERT_EQUAL( i == j ? 1. : 0. , m->at(i,j) );
140
141};
142
143/** Unit Test for copying matrices.
144 *
145 */
146void MatrixContentSymmetricTest::CopyTest()
147{
148 // set basis
149 MatrixContent *dest = NULL;
150 for (int i=0;i<3;i++) {
151 m->setValue(i);
152 dest = new MatrixContent(m);
153 for (int j=0;j<3;j++)
154 CPPUNIT_ASSERT_EQUAL( m->at(i,j) , dest->at(i,j) );
155
156 delete(dest);
157 }
158};
159
160/** Unit Test for exchanging rows and columns.
161 *
162 */
163void MatrixContentSymmetricTest::ExchangeTest()
164{
165 // set to 1,1,1,2, ...
166 for (int i=0;i<3;i++)
167 for (int j=0;j<3;j++)
168 m->set(i,j, i+1 );
169
170 // swap such that nothing happens
171 m->SwapColumns(1,2);
172 for (int i=0;i<3;i++)
173 for (int j=0;j<3;j++)
174 CPPUNIT_ASSERT_EQUAL( (double)i+1., m->at(i,j) );
175
176 // swap two rows
177 m->SwapRows(1,2);
178 for (int i=0;i<3;i++)
179 for (int j=0;j<3;j++)
180 switch (j) {
181 case 0:
182 CPPUNIT_ASSERT_EQUAL( 1., m->at(j,i) );
183 break;
184 case 1:
185 CPPUNIT_ASSERT_EQUAL( 3., m->at(j,i) );
186 break;
187 case 2:
188 CPPUNIT_ASSERT_EQUAL( 2., m->at(j,i) );
189 break;
190 default:
191 CPPUNIT_ASSERT_EQUAL( -1., m->at(i,j) );
192 }
193 // check that op is reversable
194 m->SwapRows(1,2);
195 for (int i=0;i<3;i++)
196 for (int j=0;j<3;j++)
197 CPPUNIT_ASSERT_EQUAL( (double)i+1., m->at(i,j) );
198
199 // set to 1,2,3,1, ...
200 for (int i=0;i<3;i++)
201 for (int j=0;j<3;j++)
202 m->set(i,j, j+1. );
203
204 // swap such that nothing happens
205 m->SwapRows(0,2);
206 for (int i=0;i<3;i++)
207 for (int j=0;j<3;j++)
208 CPPUNIT_ASSERT_EQUAL( (double)j+1., m->at(i,j) );
209
210 // swap two columns
211 m->SwapColumns(0,2);
212 for (int i=0;i<3;i++)
213 for (int j=0;j<3;j++)
214 switch (j) {
215 case 0:
216 CPPUNIT_ASSERT_EQUAL( 3., m->at(i,j) );
217 break;
218 case 1:
219 CPPUNIT_ASSERT_EQUAL( 2., m->at(i,j) );
220 break;
221 case 2:
222 CPPUNIT_ASSERT_EQUAL( 1., m->at(i,j) );
223 break;
224 default:
225 CPPUNIT_ASSERT_EQUAL( -1., m->at(i,j) );
226 }
227 // check that op is reversable
228 m->SwapColumns(0,2);
229 for (int i=0;i<3;i++)
230 for (int j=0;j<3;j++)
231 CPPUNIT_ASSERT_EQUAL( (double)j+1., m->at(i,j) );
232
233
234 // set to 1,2,3, ...
235 MatrixContent *n = new MatrixContent(3,3);
236 for (int i=0;i<3;i++)
237 for (int j=0;j<3;j++) {
238 m->set(i,j, 3*i+j+1 );
239 n->set(i,j, 3*j+i+1 );
240 }
241 // transpose
242 MatrixContent res = (*m).transposed();
243 CPPUNIT_ASSERT( *n == res );
244 // second transpose
245 res.transpose();
246 CPPUNIT_ASSERT( *m == res );
247 delete n;
248};
249
250/** Unit Test for matrix properties.
251 *
252 */
253void MatrixContentSymmetricTest::PropertiesTest()
254{
255 // is zero
256 m->setZero();
257 CPPUNIT_ASSERT_EQUAL( true, m->IsNull() );
258 CPPUNIT_ASSERT_EQUAL( false, m->IsPositive() );
259 CPPUNIT_ASSERT_EQUAL( false, m->IsNegative() );
260 CPPUNIT_ASSERT_EQUAL( true, m->IsNonNegative() );
261
262 // is positive
263 m->setValue(0.5);
264 CPPUNIT_ASSERT_EQUAL( false, m->IsNull() );
265 CPPUNIT_ASSERT_EQUAL( true, m->IsPositive() );
266 CPPUNIT_ASSERT_EQUAL( false, m->IsNegative() );
267 CPPUNIT_ASSERT_EQUAL( true, m->IsNonNegative() );
268
269 // is negative
270 m->setValue(-0.1);
271 CPPUNIT_ASSERT_EQUAL( false, m->IsNull() );
272 CPPUNIT_ASSERT_EQUAL( false, m->IsPositive() );
273 CPPUNIT_ASSERT_EQUAL( true, m->IsNegative() );
274 CPPUNIT_ASSERT_EQUAL( false, m->IsNonNegative() );
275
276 // is positive definite
277 double array[] = { 1., 0., 0.,
278 0., 1., 1.,
279 0., 0., 1. };
280 m->setFromDoubleArray(array);
281 CPPUNIT_ASSERT_EQUAL( true, m->IsPositiveDefinite() );
282
283 //determinant
284 m->setIdentity();
285 CPPUNIT_ASSERT_EQUAL( 1., m->Determinant() );
286
287 m->setZero();
288 CPPUNIT_ASSERT_EQUAL( 0., m->Determinant() );
289
290 m->set( 0, 0, 1.);
291 m->set( 1, 1, 1.);
292 m->set( 2, 1, 1.);
293 CPPUNIT_ASSERT_EQUAL( 0., m->Determinant() );
294
295 double array2[] = { 2., 0., 1.,
296 -3., 1., 1.,
297 1., 5.5, 1. };
298 m->setFromDoubleArray(array2);
299 CPPUNIT_ASSERT_EQUAL( -26.5, m->Determinant() );
300};
Note: See TracBrowser for help on using the repository browser.