21 #ifndef _libint2_src_bin_libint_rr_h_ 22 #define _libint2_src_bin_libint_rr_h_ 29 #include <exception.h> 31 #include <smart_ptr.h> 32 #include <polyconstr.h> 33 #include <singl_stack.h> 35 #include <default_params.h> 36 #include <util_types.h> 37 #include <global_macros.h> 45 class ImplicitDimensions;
47 template <
typename V>
class AlgebraicOperator;
52 template <
typename RR>
57 static SafePtr<RRStackBase<RR> > rrstack_;
64 typedef typename parent_type::data_type data_type;
65 typedef typename parent_type::value_type value_type;
83 for(citer_type it=rrs->begin(); it != rrs->end(); it++) {
84 find((*it).second.second);
90 parent_type::remove(rr);
94 template <
typename RR>
95 SafePtr<RRStackBase<RR> > RRStackBase<RR>::rrstack_;
113 virtual unsigned int num_children()
const =0;
115 virtual SafePtr<DGVertex> rr_child(
unsigned int i)
const =0;
117 virtual SafePtr<DGVertex> rr_target()
const =0;
123 const SafePtr<ExprType>&
rr_expr()
const {
return expr_; }
131 virtual bool is_simple()
const =0;
135 virtual bool invariant_type()
const;
148 size_t size_of_children()
const;
155 const std::string& label()
const;
160 virtual std::string description()
const;
163 virtual void generate_code(
const SafePtr<CodeContext>& context,
164 const SafePtr<ImplicitDimensions>& dims,
165 const std::string& funcname,
166 std::ostream& decl, std::ostream& def);
170 virtual void generate_generic_code(
const SafePtr<CodeContext>& context,
171 const SafePtr<ImplicitDimensions>& dims,
172 const std::string& funcname,
173 std::ostream& decl, std::ostream& def);
176 virtual std::string spfunction_call(
const SafePtr<CodeContext>& context,
177 const SafePtr<ImplicitDimensions>& dims)
const;
180 unsigned int nflops()
const {
return nflops_; }
186 unsigned int nflops_;
187 mutable std::string label_;
188 SafePtr<ExprType> expr_;
190 void add_expr(
const SafePtr<ExprType>& a,
int minus=1);
192 virtual std::string generate_label()
const =0;
199 SafePtr<RR> this_ptr =
200 const_pointer_cast<RR,const RR>(
201 static_pointer_cast<const RR, const RecurrenceRelation>(
202 EnableSafePtrFromThis<RecurrenceRelation>::SafePtr_from_this()
205 rrstack->find(this_ptr);
206 #if DEBUG || DEBUG_CONSTRUCTION 207 std::cout <<
"register_with_rrstack: registered " << this_ptr->label() << std::endl;
215 SafePtr<DirectedGraph> generate_graph_(
const SafePtr<DirectedGraph>& dg);
218 void assign_symbols_(SafePtr<CodeSymbols>& S);
221 virtual SafePtr<ImplicitDimensions> adapt_dims_(
const SafePtr<ImplicitDimensions>& dims)
const;
224 virtual bool has_generic(
const SafePtr<CompilationParameters>& cparams)
const;
226 virtual std::string generic_header()
const;
228 virtual std::string generic_instance(
const SafePtr<CodeContext>& context,
const SafePtr<CodeSymbols>& args)
const;
234 SafePtr<RecurrenceRelation::ExprType> operator+(
const SafePtr<DGVertex>& A,
235 const SafePtr<DGVertex>& B);
236 SafePtr<RecurrenceRelation::ExprType> operator-(
const SafePtr<DGVertex>& A,
237 const SafePtr<DGVertex>& B);
238 SafePtr<RecurrenceRelation::ExprType> operator*(
const SafePtr<DGVertex>& A,
239 const SafePtr<DGVertex>& B);
240 SafePtr<RecurrenceRelation::ExprType> operator/(
const SafePtr<DGVertex>& A,
241 const SafePtr<DGVertex>& B);
242 const SafePtr<RecurrenceRelation::ExprType>& operator+=(SafePtr<RecurrenceRelation::ExprType>& A,
243 const SafePtr<DGVertex>& B);
244 const SafePtr<RecurrenceRelation::ExprType>& operator-=(SafePtr<RecurrenceRelation::ExprType>& A,
245 const SafePtr<DGVertex>& B);
246 const SafePtr<RecurrenceRelation::ExprType>& operator*=(SafePtr<RecurrenceRelation::ExprType>& A,
247 const SafePtr<DGVertex>& B);
248 const SafePtr<RecurrenceRelation::ExprType>& operator/=(SafePtr<RecurrenceRelation::ExprType>& A,
249 const SafePtr<DGVertex>& B);
258 const SafePtr<DGVertex>& B);
260 const SafePtr<DGVertex>& B);
SingletonStack<T,KeyType> helps to implement Singleton-like objects of type T.
Definition: singl_stack.h:43
void add(const SafePtr< RRStackBase< RR > > &rrs)
adds content of rrs to this stack
Definition: rr.h:82
TrivialBFSet<T> defines static member result, which is true if T is a basis function set consisting o...
Definition: bfset.h:892
Defaults definitions for various parameters assumed by Libint.
Definition: algebra.cc:24
SafePtr< CTimeEntity< typename ProductType< T, U >::result > > operator*(const SafePtr< CTimeEntity< T > > &A, const SafePtr< CTimeEntity< U > > &B)
Creates product A*B.
Definition: entity.h:280
KeyTypes::InstanceID InstanceID
Specifies type for the instance index variables.
Definition: singl_stack.h:49
map_type::iterator iter_type
use iter_type objects to iterate over the stack
Definition: singl_stack.h:53
void inst_id(const SingletonStack< RecurrenceRelation, string >::InstanceID &i)
RecurrenceRelation is managed by SingletonStack but doesn't need to keep track of instance ID.
Definition: rr.h:183
virtual int partindex_direction() const
Definition: rr.h:139
AlgebraicOperator is an algebraic operator that acts on objects of type T.
Definition: algebra.h:48
unsigned int nflops() const
Return the number of FLOPs per this recurrence relation.
Definition: rr.h:180
void remove(const data_type &rr)
removes rr from the stack
Definition: rr.h:89
virtual BraketDirection braket_direction() const
Definition: rr.h:144
const SafePtr< ExprType > & rr_expr() const
Returns the expression.
Definition: rr.h:123
map_type::const_iterator citer_type
const version of iter_type
Definition: singl_stack.h:55
bool register_with_rrstack()
Registers with the stack.
Definition: rr.h:194
RecurrenceRelation describes all recurrence relations.
Definition: rr.h:101
AlgebraicOperator< DGVertex > ExprType
Numerical expression of a recurrence relation is always expressed as an AlgebraicOperator<DGVertex>
Definition: rr.h:121
RRStack implements a stack of RecurrenceRelation's which can only hold one instance of a given RR.
Definition: rr.h:53
static SafePtr< RRStackBase< RR > > & Instance()
Obtain the unique Instance of RRStack.
Definition: rr.h:71