source: src/Parameters/ContinuousValue_impl.hpp@ 30ebdd

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 30ebdd was 7d1b6a, checked in by Michael Ankele <ankele@…>, 13 years ago

created some ContinuousValue<Vector> tests

  • Property mode set to 100644
File size: 5.0 KB
Line 
1/*
2 * ContinuousValue_impl.hpp
3 *
4 * Created on: Sep 29, 2011
5 * Author: heber
6 */
7
8#ifndef CONTINUOUSVALUE_IMPL_HPP_
9#define CONTINUOUSVALUE_IMPL_HPP_
10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16#include <string>
17
18#include <boost/any.hpp>
19
20#include "CodePatterns/Assert.hpp"
21#include "CodePatterns/Log.hpp"
22#include "Range.hpp"
23
24#include "ContinuousValue.hpp"
25
26/** Constructor of class DiscreteValue.
27 */
28template <class T>
29ContinuousValue<T>::ContinuousValue() :
30 ValueSet(false),
31 ValidRangeSet(range<bool>(false, false))
32{}
33
34/** Constructor of class DiscreteValue with set of valid values.
35 *
36 * @param _ValidValues vector with all valid values
37 */
38template <class T>
39ContinuousValue<T>::ContinuousValue(const range<T> &_ValidRange) :
40 ValueSet(false),
41 ValidRangeSet(range<bool>(true, true)),
42 ValidRange(_ValidRange)
43{
44// LOG(0, "STATUS: Valid range is now " << ValidRange << ".");
45}
46
47/** Destructor of class DiscreteValue.
48 */
49template <class T>
50ContinuousValue<T>::~ContinuousValue()
51{}
52
53/** Checks whether \a _value is a valid value.
54 * \param _value value to check for validity.
55 * \return true - \a _value is valid, false - is not
56 */
57template <class T>
58bool ContinuousValue<T>::isValid(const T & _value) const
59{
60 return isValidValue(_value);
61}
62
63/** Compares this continuous value against another \a _instance.
64 *
65 * @param _instance other value to compare to
66 * @return true - if value and valid ranges are the same, false - else
67 */
68template <class T>
69bool ContinuousValue<T>::operator==(const ContinuousValue<T> &_instance) const
70{
71 bool status = true;
72 status = status && (ValidRange == _instance.ValidRange);
73 status = status && (ValueSet == _instance.ValueSet);
74 if (ValueSet && _instance.ValueSet)
75 status = status && (value == _instance.value);
76 return status;
77}
78
79/** Getter of value, returning string.
80 *
81 * @return string value
82 */
83template <class T>
84const T & ContinuousValue<T>::get() const
85{
86 ASSERT(ValueSet,
87 "ContinuousValue<T>::get() - requesting unset value.");
88 return value;
89}
90
91/** Setter of value for string
92 *
93 * @param _value string containing new value
94 */
95template <class T>
96void ContinuousValue<T>::set(const T & _value)
97{
98 setValue(_value);
99// LOG(0, "STATUS: Value is now set to " << value << ".");
100}
101
102/** Setter for the valid range.
103 *
104 * If value is invalid in new range, we throw AssertFailure and set ValueSet to false.
105 *
106 * @param _range range (pair of values)
107 */
108template <class T>
109void ContinuousValue<T>::setValidRange(const range<T> &_range)
110{
111
112 ValidRangeSet = range<bool>(true, true);
113 ValidRange = _range;
114 if (ValueSet) {
115 //std::cout << "Checking whether " << value << " is in range " << ValidRange << "." << std::endl;
116 if (!((ValidRange.isInRange(value)) || (value == ValidRange.last))) {
117 //std::cout << "ValueSet to false." << std::endl;
118 ValueSet = false;
119 // have full check again in assert such that it appears in output, too
120 ASSERT(ValidRange.isInRange(value) || (value == ValidRange.last),
121 "ContinuousValue<T>::setValidRange() - new range "
122 +toString(_range)+" invalidates current value "+toString(value)+".");
123 }
124 }
125// LOG(0, "STATUS: Valid range is now " << ValidRange << ".");
126}
127
128/** Getter for the valid range.
129 *
130 * @return _range range (pair of values)
131 */
132template <class T>
133const range<T> & ContinuousValue<T>::getValidRange() const
134{
135 ASSERT(ValidRangeSet.first && ValidRangeSet.last,
136 "ContinuousValue<T>::getValidRange() called though no valid range set so far.");
137 return ValidRange;
138}
139
140/** Checks whether \a _value is a valid value.
141 * \param _value value to check for validity.
142 * \return true - \a _value is valid, false - is not
143 */
144template <class T>
145bool ContinuousValue<T>::isValidValue(const T &_value) const
146{
147 bool isBefore = true;
148 bool isBeyond = true;
149 // check left boundary
150 isBefore = !((!ValidRangeSet.first) || (!ValidRange.isBefore(_value)));
151// if (isBefore)
152// LOG(0, "INFO: " << _value << " is before " << ValidRange.first << ".");
153 // check right boundary
154 isBeyond = !((!ValidRangeSet.last) || (!ValidRange.isBeyond(_value)) || (_value == ValidRange.last));
155// if (isBeyond)
156// LOG(0, "INFO: " << _value << " is beyond " << ValidRange.last << ".");
157 return (!isBefore) && (!isBeyond);
158}
159
160
161/** Sets the value.
162 *
163 * We check for its validity, otherwise we throw an Assert::AssertionFailure.
164 *
165 * @param _value const reference of value to set
166 */
167template <class T>
168void ContinuousValue<T>::setValue(const T &_value)
169{
170 ASSERT(isValidValue(_value),
171 "ContinuousValue<T>::setValue() - trying to set invalid value "+toString(_value)+".");
172 if (!ValueSet)
173 ValueSet = true;
174 value = _value;
175}
176
177/** Getter for the set value.
178 *
179 * We check whether it has been set, otherwise we throw an Assert::AssertionFailure.
180 *
181 * @return set value
182 */
183template <class T>
184const T &ContinuousValue<T>::getValue() const
185{
186 ASSERT(ValueSet,
187 "ContinuousValue<T>::get() - value has never been set.");
188 return value;
189}
190
191#endif /* CONTINUOUSVALUE_IMPL_HPP_ */
Note: See TracBrowser for help on using the repository browser.