File: monoms.h

package info (click to toggle)
dynare 4.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 40,640 kB
  • sloc: fortran: 82,231; cpp: 72,734; ansic: 28,874; pascal: 13,241; sh: 4,300; objc: 3,281; yacc: 2,833; makefile: 1,288; lex: 1,162; python: 162; lisp: 54; xml: 8
file content (128 lines) | stat: -rw-r--r-- 2,964 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* $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: