1 // @HEADER 2 // ************************************************************************ 3 // 4 // Rapid Optimization Library (ROL) Package 5 // Copyright (2014) Sandia Corporation 6 // 7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 8 // license for use of this work by or on behalf of the U.S. Government. 9 // 10 // Redistribution and use in source and binary forms, with or without 11 // modification, are permitted provided that the following conditions are 12 // met: 13 // 14 // 1. Redistributions of source code must retain the above copyright 15 // notice, this list of conditions and the following disclaimer. 16 // 17 // 2. Redistributions in binary form must reproduce the above copyright 18 // notice, this list of conditions and the following disclaimer in the 19 // documentation and/or other materials provided with the distribution. 20 // 21 // 3. Neither the name of the Corporation nor the names of the 22 // contributors may be used to endorse or promote products derived from 23 // this software without specific prior written permission. 24 // 25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 // 37 // Questions? Contact lead developers: 38 // Drew Kouri (dpkouri@sandia.gov) and 39 // Denis Ridzal (dridzal@sandia.gov) 40 // 41 // ************************************************************************ 42 // @HEADER 43 44 #ifndef ROL_SAMPLEGENERATOR_HPP 45 #define ROL_SAMPLEGENERATOR_HPP 46 47 #include "ROL_BatchManager.hpp" 48 #include "ROL_Vector.hpp" 49 #include <fstream> 50 51 namespace ROL { 52 53 template<class Real> 54 class SampleGenerator { 55 private: 56 int begin_; 57 ROL::Ptr<BatchManager<Real> > bman_; 58 std::vector<std::vector<Real> > points_; 59 std::vector<Real> weights_; 60 61 protected: setPoints(std::vector<std::vector<Real>> & p)62 void setPoints(std::vector<std::vector<Real> > &p) { 63 points_.clear(); 64 points_.assign(p.begin(),p.end()); 65 } setWeights(std::vector<Real> & w)66 void setWeights(std::vector<Real> &w) { 67 weights_.clear(); 68 weights_.assign(w.begin(),w.end()); 69 } 70 71 public: ~SampleGenerator()72 virtual ~SampleGenerator() {} SampleGenerator(const ROL::Ptr<BatchManager<Real>> & bman)73 SampleGenerator(const ROL::Ptr<BatchManager<Real> > &bman) 74 : begin_(0), bman_(bman) {} SampleGenerator(const SampleGenerator<Real> & sampler)75 SampleGenerator(const SampleGenerator<Real> &sampler) 76 : begin_(sampler.begin_), bman_(sampler.bman_), 77 points_(sampler.points_), weights_(sampler.weights_) {} 78 update(const Vector<Real> & x)79 virtual void update(const Vector<Real> &x) { 80 begin_ = 0; 81 } 82 start(void)83 virtual int start(void) { 84 return begin_; 85 } 86 computeError(std::vector<Real> & vals)87 virtual Real computeError(std::vector<Real> &vals) { 88 return 0.0; 89 } 90 computeError(std::vector<ROL::Ptr<Vector<Real>>> & vals,const Vector<Real> & x)91 virtual Real computeError(std::vector<ROL::Ptr<Vector<Real> > > &vals, const Vector<Real> &x) { 92 return 0.0; 93 } 94 refine(void)95 virtual void refine(void) { 96 begin_ = numMySamples(); 97 } 98 setSamples(bool inConstructor=false)99 virtual void setSamples(bool inConstructor = false) {} 100 numGlobalSamples(void) const101 virtual int numGlobalSamples(void) const { 102 Real nms = static_cast<Real>(numMySamples()); 103 Real gnms = static_cast<Real>(0); 104 sumAll(&nms,&gnms,1); 105 return static_cast<int>(gnms); 106 } 107 numMySamples(void) const108 virtual int numMySamples(void) const { 109 return weights_.size(); 110 } 111 getMyPoint(const int i) const112 virtual std::vector<Real> getMyPoint(const int i) const { 113 return points_[i]; 114 } 115 getMyWeight(const int i) const116 virtual Real getMyWeight(const int i) const { 117 return weights_[i]; 118 } 119 batchID(void) const120 int batchID(void) const { 121 return bman_->batchID(); 122 } 123 numBatches(void) const124 int numBatches(void) const { 125 return bman_->numBatches(); 126 } 127 sumAll(Real * input,Real * output,int dim) const128 void sumAll(Real *input, Real *output, int dim) const { 129 bman_->sumAll(input, output, dim); 130 } 131 sumAll(Vector<Real> & input,Vector<Real> & output) const132 void sumAll(Vector<Real> &input, Vector<Real> &output) const { 133 bman_->sumAll(input,output); 134 } 135 broadcast(Real * input,int cnt,int root) const136 void broadcast(Real *input, int cnt, int root) const { 137 bman_->broadcast(input,cnt,root); 138 } 139 barrier(void) const140 void barrier(void) const { 141 bman_->barrier(); 142 } 143 getBatchManager(void) const144 const ROL::Ptr<BatchManager<Real>> getBatchManager(void) const { 145 return bman_; 146 } 147 print(const std::string & filename="samples",const int prec=12) const148 void print(const std::string &filename = "samples", 149 const int prec = 12) const { 150 int width = prec + 5 + 4; 151 std::stringstream name; 152 name << filename << "_" << batchID() << ".txt"; 153 std::ofstream file(name.str().c_str()); 154 if (file.is_open()) { 155 file << std::scientific << std::setprecision(prec); 156 for (int i = 0; i < numMySamples(); ++i) { 157 std::vector<Real> pt = getMyPoint(i); 158 Real wt = getMyWeight(i); 159 for (int j = 0; j < static_cast<int>(pt.size()); ++j) { 160 file << std::setw(width) << std::left << pt[j]; 161 } 162 file << std::setw(width) << std::left << wt << std::endl; 163 } 164 file.close(); 165 } 166 else { 167 ROL_TEST_FOR_EXCEPTION(true, std::invalid_argument, 168 ">>> (ROL::SampleGenerator::print): Unable to open file!"); 169 } 170 } 171 172 }; 173 174 } 175 176 #endif 177