/* $Id: monoms.h 148 2005-04-19 15:12:26Z kamenik $ */ /* Copyright 2004, Ondra Kamenik */ #ifndef MONOMS_H #define MONOMS_H #include "int_sequence.h" #include "gs_tensor.h" #include "t_container.h" #include "sparse_tensor.h" #include "Vector.h" class IntGenerator { int maxim; double probab; public: IntGenerator() : maxim(5), probab(0.3) {} void init(int nf, int ny, int nv, int nw, int nu, int mx, double prob); int get() const; }; extern IntGenerator intgen; class Monom : public IntSequence { public: Monom(int len); // generate a random monom Monom(int len, int item); // generate monom whose items are the given item double deriv(const IntSequence& vars) const; // this = this*m^ex (in monomial sense) void multiplyWith(int ex, const Monom& m); void print() const; }; class Monom2Vector; class Monom1Vector { friend class Monom2Vector; int nx; int len; Monom** const x; public: Monom1Vector(int nxx, int l); ~Monom1Vector(); void deriv(const IntSequence& c, Vector& out) const; FGSTensor* deriv(int dim) const; void print() const; }; //class Monom3Vector; class Monom2Vector { int ny; int nu; int len; Monom** const y; Monom** const u; public: // generate random vector of monom two vector Monom2Vector(int nyy, int nuu, int l); // calculate g(x(y,u)) Monom2Vector(const Monom1Vector& g, const Monom2Vector& xmon); ~Monom2Vector(); void deriv(const Symmetry& s, const IntSequence& c, Vector& out) const; FGSTensor* deriv(const Symmetry& s) const; FGSContainer* deriv(int maxdim) const; void print() const; }; class Monom4Vector { int len; int nx1; int nx2; int nx3; int nx4; Monom** const x1; Monom** const x2; Monom** const x3; Monom** const x4; public: /* random for g(y,u,sigma) */ Monom4Vector(int l, int ny, int nu); /* random for G(y,u,u',sigma) */ Monom4Vector(int l, int ny, int nu, int nup); /* random for f(y+,y,y-,u) */ Monom4Vector(int l, int nbigg, int ng, int ny, int nu); /* substitution f(G(y,u,u',sigma),g(y,u,sigma),y,u) */ Monom4Vector(const Monom4Vector& f, const Monom4Vector& bigg, const Monom4Vector& g); ~Monom4Vector(); FSSparseTensor* deriv(int dim) const; FGSTensor* deriv(const Symmetry& s) const; void deriv(const Symmetry& s, const IntSequence& coor, Vector& out) const; void print() const; protected: void init_random(); }; struct SparseDerivGenerator { int maxdimen; FGSContainer* bigg; FGSContainer* g; FGSContainer* rcont; FSSparseTensor** const ts; SparseDerivGenerator(int nf, int ny, int nu, int nup, int nbigg, int ng, int mx, double prob, int maxdim); ~SparseDerivGenerator(); }; struct DenseDerivGenerator { int maxdimen; FGSContainer* xcont; FGSContainer* rcont; FGSTensor** const ts; UGSContainer* uxcont; UGSTensor** const uts; DenseDerivGenerator(int ng, int nx, int ny, int nu, int mx, double prob, int maxdim); void unfold(); ~DenseDerivGenerator(); }; #endif // Local Variables: // mode:C++ // End: