ROL
ROL_RieszVector.hpp
Go to the documentation of this file.
1 
2 // @HEADER
3 // ************************************************************************
4 //
5 // Rapid Optimization Library (ROL) Package
6 // Copyright (2014) Sandia Corporation
7 //
8 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9 // license for use of this work by or on behalf of the U.S. Government.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact lead developers:
39 // Drew Kouri (dpkouri@sandia.gov) and
40 // Denis Ridzal (dridzal@sandia.gov)
41 //
42 // ************************************************************************
43 // @HEADER
44 
45 #ifndef ROL_RIESZVECTOR_H
46 #define ROL_RIESZVECTOR_H
47 
48 #include <ostream>
49 
51 #include "ROL_LinearOperator.hpp"
52 
53 /*
54  \class ROL::RieszPrimalVector
55  \brief Abstract implementation of a primal vector corresponding to
56  an inner-product that involves the application of a linear
57  operator
58 
59  \class ROL::RieszDualVector
60  \brief Abstract implementation of a dual vector corresponding to
61  an inner-product that involves the application of a linear
62  operator inverse
63 
64 */
65 
66 
67 namespace ROL {
68 
69 template<class Real>
71 
72 template<class Real>
74 
75 
76 template <class Real>
77 class RieszPrimalVector : public ElementwiseVector<Real> {
78 
79  using V = Vector<Real>;
82 
83 private:
84 
85  const ROL::Ptr<V> v_;
86  mutable ROL::Ptr<DualVector> dual_;
87  const ROL::Ptr<OP> op_;
88  mutable Real tol_;
89 
90  mutable bool isDualInitialized_;
91 
92  void initialize_dual( void ) const {
93 
94  dual_ = ROL::makePtr<DualVector>(v_->clone(),op_,tol_);
95  op_->apply(*(dual_->getVector()),*v_,tol_);
96  isDualInitialized_ = true;
97  }
98 
99 public:
100 
101  RieszPrimalVector( const ROL::Ptr<V> &v,
102  const ROL::Ptr<OP> &op,
103  Real tol=std::sqrt(ROL_EPSILON<Real>()) ) :
104  v_(v), op_(op), tol_(tol), isDualInitialized_(false) {
105  }
106 
107  virtual ~RieszPrimalVector() {}
108 
109  virtual Real dot( const V &x ) const {
110  if( !isDualInitialized_ ) {
111  initialize_dual();
112  }
113 
114  const RieszPrimalVector &ex = dynamic_cast<const RieszPrimalVector&>(x);
115  return dual_->getVector()->dot(*(ex.getVector()));
116  }
117 
118  virtual ROL::Ptr<V> clone() const {
119  return ROL::makePtr<RieszPrimalVector>( v_->clone(), op_, tol_ );
120  }
121 
122  virtual const V & dual() const {
123  if( !isDualInitialized_ ) {
124  initialize_dual();
125  }
126  return *dual_;
127  }
128 
129  void applyUnary( const Elementwise::UnaryFunction<Real> &f ) {
130  v_->applyUnary(f);
131  }
132 
133  void applyBinary( const Elementwise::BinaryFunction<Real> &f, const V &x ) {
134  const RieszPrimalVector &ex = dynamic_cast<const RieszPrimalVector&>(x);
135  v_->applyBinary(f,*(ex.getVector()));
136  }
137 
138  Real reduce( const Elementwise::ReductionOp<Real> &r ) const {
139  return v_->reduce(r);
140  }
141 
142  void setScalar( const Real C ) {
143  v_->setScalar(C);
144  }
145 
146  void randomize( const Real l=0.0, const Real u=1.0 ) {
147  v_->randomize(l,u);
148  }
149 
150  ROL::Ptr<V> getVector( void ) {
151  return v_;
152  }
153 
154  ROL::Ptr<const V> getVector( void ) const {
155  return v_;
156  }
157 
158 }; // class RieszPrimalVector
159 
160 
161 
162 template<class Real>
163 class RieszDualVector : public ElementwiseVector<Real> {
164 
165  using V = Vector<Real>;
168 
169 private:
170 
171  const ROL::Ptr<V> v_;
172  mutable ROL::Ptr<PrimalVector> primal_;
173  const ROL::Ptr<OP> op_;
174  mutable Real tol_;
175 
176  mutable bool isPrimalInitialized_;
177 
178  void initialize_primal( void ) const {
179 
180  primal_ = ROL::makePtr<PrimalVector>(v_->clone(),op_,tol_);
181  op_->applyInverse(*(primal_->getVector()),*v_,tol_);
182  isPrimalInitialized_ = true;
183  }
184 
185 public:
186 
187  RieszDualVector( const ROL::Ptr<V> &v,
188  const ROL::Ptr<OP> &op,
189  Real tol=std::sqrt(ROL_EPSILON<Real>()) ) :
190  v_(v), op_(op), tol_(tol), isPrimalInitialized_(false) {
191  }
192 
193  virtual ~RieszDualVector() {}
194 
195  virtual Real dot( const V &x ) const {
196  if( !isPrimalInitialized_ ) {
198  }
199 
200  const RieszDualVector &ex = dynamic_cast<const RieszDualVector&>(x);
201  return primal_->getVector()->dot(*(ex.getVector()));
202  }
203 
204  virtual ROL::Ptr<V> clone() const {
205  return ROL::makePtr<RieszDualVector>( v_->clone(), op_, tol_ );
206  }
207 
208  virtual const V & dual() const {
209  if( !isPrimalInitialized_ ) {
211  }
212  return *primal_;
213  }
214 
215  void applyUnary( const Elementwise::UnaryFunction<Real> &f ) {
216  v_->applyUnary(f);
217  }
218 
219  void applyBinary( const Elementwise::BinaryFunction<Real> &f, const V &x ) {
220  const RieszDualVector &ex = dynamic_cast<const RieszDualVector&>(x);
221  v_->applyBinary(f,*(ex.getVector()));
222  }
223 
224  Real reduce( const Elementwise::ReductionOp<Real> &r ) const {
225  return v_->reduce(r);
226  }
227 
228  void setScalar( const Real C ) {
229  v_->setScalar(C);
230  }
231 
232  void randomize( const Real l=0.0, const Real u=1.0 ) {
233  v_->randomize(l,u);
234  }
235 
236  ROL::Ptr<V> getVector( void ) {
237  return v_;
238  }
239 
240  ROL::Ptr<const V> getVector( void ) const {
241  return v_;
242  }
243 
244 }; // class RieszDualVector
245 
246 
247 
248 } // namespace ROL
249 
250 #endif // ROL_RIESZVECTOR_H
const ROL::Ptr< V > v_
virtual ROL::Ptr< V > clone() const
Clone to make a new (uninitialized) vector.
const ROL::Ptr< V > v_
RieszPrimalVector(const ROL::Ptr< V > &v, const ROL::Ptr< OP > &op, Real tol=std::sqrt(ROL_EPSILON< Real >()))
void applyUnary(const Elementwise::UnaryFunction< Real > &f)
ROL::Ptr< PrimalVector > primal_
Intermediate abstract class which does not require users implements plus, set, scale, axpy, norm, dot, or zero if they implement the three elementwise functions: applyUnary, applyBinary, and reduce.
ROL::Ptr< DualVector > dual_
ROL::Ptr< const V > getVector(void) const
ROL::Ptr< V > getVector(void)
Defines the linear algebra or vector space interface.
Definition: ROL_Vector.hpp:80
virtual const V & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
virtual Real dot(const V &x) const
Compute where .
void randomize(const Real l=0.0, const Real u=1.0)
Set vector to be uniform random between [l,u].
void setScalar(const Real C)
Set where .
const ROL::Ptr< OP > op_
virtual Real dot(const V &x) const
Compute where .
ROL::Ptr< V > getVector(void)
ROL::Ptr< const V > getVector(void) const
void initialize_dual(void) const
Real reduce(const Elementwise::ReductionOp< Real > &r) const
void randomize(const Real l=0.0, const Real u=1.0)
Set vector to be uniform random between [l,u].
void applyUnary(const Elementwise::UnaryFunction< Real > &f)
Provides the interface to apply a linear operator.
void applyBinary(const Elementwise::BinaryFunction< Real > &f, const V &x)
const ROL::Ptr< OP > op_
Real reduce(const Elementwise::ReductionOp< Real > &r) const
RieszDualVector(const ROL::Ptr< V > &v, const ROL::Ptr< OP > &op, Real tol=std::sqrt(ROL_EPSILON< Real >()))
void initialize_primal(void) const
void setScalar(const Real C)
Set where .
virtual ROL::Ptr< V > clone() const
Clone to make a new (uninitialized) vector.
virtual const V & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
void applyBinary(const Elementwise::BinaryFunction< Real > &f, const V &x)