Changeset e420f9


Ignore:
Timestamp:
Oct 6, 2011, 7:17:46 AM (13 years ago)
Author:
Frederik Heber <heber@…>
Branches:
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
Children:
7a0340
Parents:
d2bac9
git-author:
Frederik Heber <heber@…> (04/23/11 19:38:12)
git-committer:
Frederik Heber <heber@…> (10/06/11 07:17:46)
Message:

Added read/write capability of VectorContent from stream.

  • this is all taken and adapted from MatrixContent.
  • Unit test function added on this.
Location:
LinearAlgebra/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • LinearAlgebra/src/LinearAlgebra/VectorContent.cpp

    rd2bac9 re420f9  
    2525#include <iostream>
    2626#include <limits>
     27#include <vector>
    2728
    2829#include "CodePatterns/Assert.hpp"
     
    7778};
    7879
    79 /** Copy constructor of class VectorContent.
     80/** Constructor that parses vector from a stream.
     81 *
     82 * \param _dimension size of vector
     83 * \param &inputstream stream to parse from
     84 */
     85VectorContent::VectorContent(const size_t _dimension, std::istream &inputstream) :
     86  dimension(_dimension),
     87  content(NULL),
     88  free_content_on_exit(true)
     89{
     90   // allocate vector and set contents
     91  content = gsl_vector_alloc(dimension);
     92
     93  size_t row = 0;
     94  size_t index = 0;
     95  do {
     96    std::string line;
     97    getline(inputstream, line);
     98    //std::cout << line << std::endl;
     99    std::stringstream parseline(line);
     100    // skip comments
     101    if ((parseline.peek() == '#') || (parseline.str().empty()))
     102      continue;
     103    // break on empty lines
     104    if (parseline.peek() == '\n')
     105      break;
     106
     107    // parse line with values
     108    std::vector<double> line_of_values;
     109    do {
     110      double value;
     111      parseline >> value >> ws;
     112      line_of_values.push_back(value);
     113    } while (parseline.good());
     114
     115    // check number of columns parsed
     116    ASSERT(line_of_values.size()+index <= dimension,
     117        "VectorContent::VectorContent() - exceedingly many entries in row "
     118        +toString(row)+": current number is "
     119        +toString(index)+" and expecting now "
     120        +toString(line_of_values.size())+" which exceeds "+toString(dimension)+".");
     121
     122    for (std::vector<double>::const_iterator iter = line_of_values.begin();
     123        iter != line_of_values.end();++iter, ++index)
     124      at(index) = *iter;
     125    ++row;
     126  } while (inputstream.good());
     127  // check number of rows parsed
     128  ASSERT(index == dimension,
     129      "VectorContent::VectorContent() - insufficent number of components "
     130      +toString(index)+" < "+toString(dimension)+" read.");
     131}
     132
     133
     134/** Constructor of class VectorContent.
    80135 * No allocation, we just take over gsl_vector.
    81136 * \param *src source gsl_vector
     
    463518}
    464519
     520/** Preparses a vector in an input stream for component count.
     521 *
     522 *  \note This does not change the get position within the stream.
     523 *
     524 * @param inputstream to parse vector from
     525 * @return number of present entries
     526 */
     527size_t VectorContent::preparseVectorDimensions(std::istream &inputstream)
     528{
     529  const std::streampos initial_position(inputstream.tellg());
     530//  std::cout << "We are at position "
     531//      +toString((int)inputstream.tellg())+" from start of stream." << std::endl;
     532  size_t index = 0;
     533  do {
     534    std::string line;
     535    getline(inputstream, line);
     536    std::stringstream parseline(line);
     537    // skip comments
     538    if ((parseline.peek() == '#') || (line.empty()))
     539      continue;
     540    // break on empty lines
     541    if (parseline.peek() == '\n')
     542      break;
     543
     544    // parse line with values
     545    std::vector<double> line_of_values;
     546    do {
     547      double value;
     548      parseline >> value >> ws;
     549      line_of_values.push_back(value);
     550    } while (parseline.good());
     551
     552    index += line_of_values.size();
     553  } while (inputstream.good());
     554  // clear end of file flags
     555  inputstream.clear();
     556
     557  // reset to initial position
     558  inputstream.seekg(initial_position);
     559//  std::cout << "We are again at position "
     560//      +toString((int)inputstream.tellg())+" from start of stream." << std::endl;
     561
     562  return index;
     563}
     564
     565/** Writes vector content to ostream in such a manner that it can be re-parsed
     566 * by the code in the constructor.
     567 *
     568 * @param ost stream to write to
     569 */
     570void VectorContent::write(std::ostream &ost) const
     571{
     572  for (size_t index = 0; index < dimension; ++index)
     573    ost << at(index) << "\t";
     574  ost << std::endl;
     575}
     576
     577
    465578/* ======================== Properties ============================= */
    466579/** Calculates scalar product between \a *this and \a b.
  • LinearAlgebra/src/LinearAlgebra/VectorContent.hpp

    rd2bac9 re420f9  
    5555  VectorContent(const VectorContent & src);
    5656  VectorContent(gsl_vector * _src, bool _free_content_on_exit = false);
     57  VectorContent(const size_t _dimension, std::istream &inputstream);
    5758  virtual ~VectorContent();
    5859
     
    107108  const size_t getDimension() const;
    108109
     110  static size_t preparseVectorDimensions(std::istream &inputstream);
     111  void write(std::ostream &ost) const;
     112
    109113  size_t dimension;
    110114  gsl_vector *content;
  • LinearAlgebra/src/unittests/VectorContentUnitTest.cpp

    rd2bac9 re420f9  
    175175  CPPUNIT_ASSERT_EQUAL( true, unit.IsOne() );
    176176};
     177
     178/** Unit test for reading from and writing vector to stream
     179 *
     180 */
     181void VectorContentTest::ReadWriteTest()
     182{
     183  // set up matrix
     184  VectorContent v((size_t)3);
     185  for (size_t i=0; i<3;++i)
     186    v.at(i) = i+1.;
     187
     188  // write to stream
     189  std::stringstream vectorstream;
     190  v.write(vectorstream);
     191
     192  // parse in dimensions and check
     193  size_t vectordimension = VectorContent::preparseVectorDimensions(vectorstream);
     194  CPPUNIT_ASSERT_EQUAL( (size_t)3, vectordimension );
     195  // parse in vector and check
     196  VectorContent w(3, vectorstream);
     197  CPPUNIT_ASSERT_EQUAL( v, w );
     198}
  • LinearAlgebra/src/unittests/VectorContentUnitTest.hpp

    rd2bac9 re420f9  
    3030    CPPUNIT_TEST (OperatorAlgebraTest );
    3131    CPPUNIT_TEST (OperatorIsTest );
     32    CPPUNIT_TEST (ReadWriteTest );
    3233    CPPUNIT_TEST_SUITE_END();
    3334
     
    4243    void OperatorIsTest();
    4344    void OperatorAlgebraTest();
     45    void ReadWriteTest();
    4446
    4547private:
Note: See TracChangeset for help on using the changeset viewer.