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_USERINPUTGENERATOR_HPP
45 #define ROL_USERINPUTGENERATOR_HPP
46 
47 #include "ROL_SampleGenerator.hpp"
48 #include "ROL_BatchManager.hpp"
49 #include <fstream>
50 #include <iostream>
51 #include <string>
52 
53 namespace ROL {
54 
55 template<class Real>
56 class UserInputGenerator : public SampleGenerator<Real> {
57 private:
58   int nSamp_;
59 
sample(const std::string & file_pt,const std::string & file_wt,const int n,const int dim,const ROL::Ptr<BatchManager<Real>> & bman)60   void sample(const std::string &file_pt,
61               const std::string &file_wt,
62               const int n,
63               const int dim,
64               const ROL::Ptr<BatchManager<Real> > &bman) {
65     nSamp_ = n;
66     // Read in full point data and weight data
67     std::fstream input_pt;
68     input_pt.open(file_pt.c_str(),std::ios::in);
69     std::fstream input_wt;
70     input_wt.open(file_wt.c_str(),std::ios::in);
71     if ( !input_pt.is_open() || !input_wt.is_open() ) {
72       if ( !input_pt.is_open() ) {
73         if ( bman->batchID() == 0 ) {
74           std::cout << "CANNOT OPEN " << file_pt.c_str() << "\n";
75         }
76       }
77       if ( !input_wt.is_open() ) {
78         if ( bman->batchID() == 0 ) {
79           std::cout << "CANNOT OPEN " << file_wt.c_str() << "\n";
80         }
81       }
82     }
83     else {
84       std::vector<std::vector<Real> > pt(n);
85       std::vector<Real> wt(n,0.0);
86       std::vector<Real> point(dim,0.0);;
87       for (int i = 0; i < n; i++) {
88         for (int j = 0; j < dim; j++) {
89           input_pt >> point[j];
90         }
91         pt[i] = point;
92         input_wt >> wt[i];
93       }
94       // Get process rankd and number of processes
95       int rank  = bman->batchID();
96       int nProc = bman->numBatches();
97       // Separate samples across processes
98       int frac = n/nProc;
99       int rem  = n%nProc;
100       int N    = frac;
101       if ( rank < rem ) {
102         N++;
103       }
104       std::vector<std::vector<Real> > my_pt(N);
105       std::vector<Real> my_wt(N,0.0);
106       int index = 0;
107       for (int i = 0; i < N; i++) {
108         index = i*nProc + rank;
109         my_pt[i] = pt[index];
110         my_wt[i] = wt[index];
111       }
112       SampleGenerator<Real>::setPoints(my_pt);
113       SampleGenerator<Real>::setWeights(my_wt);
114     }
115     input_pt.close();
116     input_wt.close();
117   }
118 
119 public:
UserInputGenerator(ROL::ParameterList & parlist,const ROL::Ptr<BatchManager<Real>> & bman)120   UserInputGenerator(ROL::ParameterList &parlist,
121                const ROL::Ptr<BatchManager<Real> > &bman)
122     : SampleGenerator<Real>(bman) {
123     ROL::ParameterList &list
124       = parlist.sublist("SOL").sublist("Sample Generator").sublist("User Input");
125     if ( list.isParameter("Points File")  &&
126          list.isParameter("Weights File") &&
127          list.isParameter("Number of Samples") &&
128          list.isParameter("Dimension") ) {
129       std::string file_pt = list.get("Points File Name","points.txt");
130       std::string file_wt = list.get("Weights File Name","weights.txt");
131       int n = list.get("Number of Samples",100);
132       int dim = list.get("Dimension",4);
133       sample(file_pt,file_wt,n,dim,bman);
134     }
135     else {
136       ROL_TEST_FOR_EXCEPTION(true,std::invalid_argument,
137         ">>> (ROL::UserInputGenerator): ParameterList does not contain sufficient information.");
138     }
139   }
140 
UserInputGenerator(const std::string file_pt,const std::string file_wt,const int n,const int dim,const ROL::Ptr<BatchManager<Real>> & bman)141   UserInputGenerator(const std::string file_pt,
142                      const std::string file_wt,
143                      const int n,
144                      const int dim,
145                      const ROL::Ptr<BatchManager<Real> > &bman)
146     : SampleGenerator<Real>(bman) {
147     sample(file_pt,file_wt,n,dim,bman);
148   }
149 
refine(void)150   void refine(void) {}
151 
numGlobalSamples(void) const152   int numGlobalSamples(void) const {
153     return nSamp_;
154   }
155 };
156 
157 }
158 
159 #endif
160