ROL
ROL_UserInputGenerator.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Rapid Optimization Library (ROL) Package
4//
5// Copyright 2014 NTESS and the ROL contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef ROL_USERINPUTGENERATOR_HPP
11#define ROL_USERINPUTGENERATOR_HPP
12
14#include "ROL_ParameterList.hpp"
15#include "ROL_BatchManager.hpp"
16#include <fstream>
17#include <iostream>
18#include <string>
19
20namespace ROL {
21
22template<typename Real>
23class UserInputGenerator : public SampleGenerator<Real> {
24private:
25 int nSamp_;
26
27 void sample(std::string file_pt, std::string file_wt,
28 int n, int dim,
29 const ROL::Ptr<BatchManager<Real>> &bman) {
30 nSamp_ = n;
31 // Read in full point data and weight data
32 std::fstream input_pt, input_wt;
33 input_pt.open(file_pt.c_str(),std::ios::in);
34 input_wt.open(file_wt.c_str(),std::ios::in);
35 if ( !input_pt.is_open() || !input_wt.is_open() ) {
36 if ( !input_pt.is_open() ) {
37 if ( bman->batchID() == 0 ) {
38 std::cout << "CANNOT OPEN " << file_pt.c_str() << std::endl;
39 }
40 }
41 if ( !input_wt.is_open() ) {
42 if ( bman->batchID() == 0 ) {
43 std::cout << "CANNOT OPEN " << file_wt.c_str() << std::endl;
44 }
45 }
46 }
47 else {
48 std::vector<std::vector<Real>> pt(n);
49 std::vector<Real> wt(n,0.0);
50 std::vector<Real> point(dim,0.0);;
51 for (int i = 0; i < n; i++) {
52 for (int j = 0; j < dim; j++) {
53 input_pt >> point[j];
54 }
55 pt[i] = point;
56 input_wt >> wt[i];
57 }
58 // Get process rankd and number of processes
59 int rank = bman->batchID();
60 int nProc = bman->numBatches();
61 // Separate samples across processes
62 int frac = n/nProc;
63 int rem = n%nProc;
64 int N = frac;
65 if ( rank < rem ) N++;
66 std::vector<std::vector<Real>> my_pt(N);
67 std::vector<Real> my_wt(N,0.0);
68 int index = 0;
69 for (int i = 0; i < N; i++) {
70 index = i*nProc + rank;
71 my_pt[i] = pt[index];
72 my_wt[i] = wt[index];
73 }
76 }
77 input_pt.close();
78 input_wt.close();
79 }
80
81public:
82 UserInputGenerator(ROL::ParameterList &parlist,
83 const ROL::Ptr<BatchManager<Real>> &bman)
84 : SampleGenerator<Real>(bman) {
85 ROL::ParameterList &list
86 = parlist.sublist("SOL").sublist("Sample Generator").sublist("User Input");
87 if ( list.isParameter("Points File") &&
88 list.isParameter("Weights File") &&
89 list.isParameter("Number of Samples") &&
90 list.isParameter("Dimension") ) {
91 std::string file_pt = list.get("Points File Name","points.txt");
92 std::string file_wt = list.get("Weights File Name","weights.txt");
93 int n = list.get("Number of Samples",100);
94 int dim = list.get("Dimension",4);
95 sample(file_pt,file_wt,n,dim,bman);
96 }
97 else {
98 ROL_TEST_FOR_EXCEPTION(true,std::invalid_argument,
99 ">>> (ROL::UserInputGenerator): ParameterList does not contain sufficient information.");
100 }
101 }
102
103 UserInputGenerator(std::string file_pt,
104 std::string file_wt,
105 int n,
106 int dim,
107 const ROL::Ptr<BatchManager<Real>> &bman)
108 : SampleGenerator<Real>(bman) {
109 sample(file_pt,file_wt,n,dim,bman);
110 }
111
112 void refine(void) {}
113
114 int numGlobalSamples(void) const {
115 return nSamp_;
116 }
117};
118
119}
120
121#endif
void setPoints(std::vector< std::vector< Real > > &p)
void setWeights(std::vector< Real > &w)
UserInputGenerator(std::string file_pt, std::string file_wt, int n, int dim, const ROL::Ptr< BatchManager< Real > > &bman)
UserInputGenerator(ROL::ParameterList &parlist, const ROL::Ptr< BatchManager< Real > > &bman)
void sample(std::string file_pt, std::string file_wt, int n, int dim, const ROL::Ptr< BatchManager< Real > > &bman)
constexpr auto dim