6 #ifndef realroot_SOLVE_SBDSLV_BERNSTEIN_EENV_H
7 #define realroot_SOLVE_SBDSLV_BERNSTEIN_EENV_H
19 #define _valueof_(x) std::cout << #x" = " << (x) << std::endl;
32 for (
int i = m_nvr-2; i >= -1; i-- ) m_str[i] = m_szs[i+1]*m_str[i+1];
37 inline sz_t
sz( sz_t v )
const {
return m_szs[v]; };
39 inline sz_t
data_size()
const {
return m_str[-1]; };
41 template<
typename real_t>
46 int kstr = (m_szs[v]-1)*m_str[v];
47 for ( k = i = 0; i <
data_size(); i += m_str[v-1], k += kstr )
48 for ( j = 0; j < m_str[v]; j++ )
52 template<
typename X,
typename real_t>
55 template<
typename real_t>
56 real_t
eval( real_t * data,
const real_t * prm, real_t * chunk = 0 )
60 if ( chunk ) tmp = chunk;
63 for (
int v =
nvars()-1; v >= 0 ; v -- )
64 for ( i = 0; i <
data_size(); i += m_str[v-1] )
67 if ( !chunk )
delete[] tmp;
71 template<
typename real_t,
typename X>
72 void spmeval(
X& res, real_t* src,
X * prm,
unsigned * supp,
unsigned nsupp )
const
77 for ( v = 0; v < m_nvr; v ++ ) if ( m_szs[v] > m_szs[lg] ) lg = v;
78 X powers [
m_nvr][m_szs[lg]];
80 for ( v = 0; v <
m_nvr; v ++ )
81 for ( powers[v][0] = 1.0, d = 1; d < m_szs[v]; powers[v][d] = prm[v]*powers[v][d-1], d ++ );
83 for ( i = 0; i < nsupp; res += acc, i ++ )
84 for ( add = supp[i], acc = src[add], v = m_nvr-1;
add; add /= m_szs[v], v -- )
85 acc *= powers[v][add%m_szs[v]];
89 template<
typename real_t,
typename X>
90 void meval(
X& res, real_t * data,
const X * prm )
const
95 for (
int v =
nvars()-1; v >= 0 ; v -- )
96 for ( i = 0; i <
data_size(); i += m_str[v-1] )
102 template<
typename real_t>
106 real_t * tmp =
new real_t[
data_size() ];
108 for (
int v =
nvars()-1; v >= 0 ; v -- )
109 for ( i = 0; i <
data_size(); i += m_str[v-1] )
117 template<
typename real_t>
118 void mins( real_t * _mins_, real_t
const *
const data, sz_t v )
const
121 for ( p = 0, k = 0; k < m_szs[v]; k++, p += m_str[v] )
124 for ( i = 0; i <
data_size(); i += m_str[v-1] )
125 for ( j = i; j < i + m_str[v]; j ++ )
126 if ( data[j+p] < _mins_[k] ) _mins_[k] = data[j+p];
130 template<
typename real_t>
131 void maxs( real_t * _maxs_, real_t
const *
const data, sz_t v )
const
135 for ( p = 0, k = 0; k < m_szs[v]; k++, p += m_str[v] )
138 for ( i = 0; i <
data_size(); i += m_str[v-1] )
139 for ( j = i; j < i + m_str[v]; j ++ )
140 if ( data[j+p] > _maxs_[k] ) _maxs_[k] = data[j+p];
144 template<
typename real_t>
145 inline void maxs( real_t * _maxs_, real_t
const *
const data )
const
146 {
for ( sz_t v = 0; v <
m_nvr; v ++ ) {
maxs(_maxs_,data,v); _maxs_ += m_szs[v];}; };
148 template<
typename real_t>
149 inline void mins( real_t * _mins_, real_t
const *
const data )
const
150 {
for ( sz_t v = 0; v <
m_nvr; v ++ ) {
mins(_mins_,data,v); _mins_ += m_szs[v];}; };
154 template<
typename real_t>
155 void split( real_t * left, real_t * right,
int v,
const real_t& t )
158 for ( i = 0; i <
data_size(); i += m_str[v-1] )
159 for ( j = i; j < i + m_str[v]; j++ )
160 split(left+j,right+j,m_szs[v],m_str[v],t);
163 template<
typename real_t>
164 void split2( real_t * left, real_t * right,
int v )
167 for ( i = 0; i <
data_size(); i += m_str[v-1] )
168 for ( j = i; j < i + m_str[v]; j++ )
169 split2(left+j,right+j,m_szs[v],m_str[v]);
172 template<
typename real_t>
173 void lrestrict( real_t * data,
int v,
const real_t& mn )
176 for ( i = 0; i <
data_size(); i += m_str[v-1] )
177 for ( j = i; j < i + m_str[v]; j++ )
181 template<
typename real_t>
182 void rrestrict( real_t * data,
int v,
const real_t& mx )
185 for ( i = 0; i <
data_size(); i += m_str[v-1] )
186 for ( j = i; j < i + m_str[v]; j++ )
190 template<
typename real_t>
193 template<
typename real_t>
200 template<
typename real_t >
204 for ( i = 0; i <
data_size(); i += m_str[v-1] )
205 for ( j = i; j < i + m_str[v]; j++ )
206 env->fromMonoms(data+j,m_szs[v],m_str[v]);
208 template<
typename real_t >
212 template<
typename real_t >
216 for ( i = 0; i <
data_size(); i += m_str[v-1] )
217 for ( j = i; j < i + m_str[v]; j++ )
218 env->toMonoms(data+j,m_szs[v],m_str[v]);
220 template<
typename real_t >
232 template<
typename real_t >
237 for ( i = 0; i <
data_size(); i += m_str[v-1] )
238 for ( j = i; j < i + m_str[v]; j++ )
259 m_szs =
new sz_t[4*m_nvr+2];
260 m_vrs = m_szs +
m_nvr;
261 m_str = m_vrs + m_nvr + 1;
262 m_pszs = m_str + m_nvr + 1;
268 m_szs[0] = szu; m_szs[1] = szv;
269 m_vrs[0] = 0; m_vrs[1] = 1;
273 for ( sz_t v = 0; v <
m_nvr; v ++ )
274 m_pszs[v] = m_pszs[v-1] + m_szs[v];
277 eenv( sz_t nvr, sz_t
const * szs, sz_t
const * vrs )
285 for (sz_t v = 0; v < m_nvr; v ++ ) if ( m_vrs[v] >
m_mxvr ) m_mxvr = m_vrs[v];
286 for ( sz_t v = 0; v <
m_nvr; v ++ )
287 m_pszs[v] = m_pszs[v-1] + m_szs[v];
299 sz_t
psz(){
return m_pszs[m_nvr-1]; };
300 sz_t
psft( sz_t v ) {
return m_pszs[v-1];}
308 sz_t
stride( sz_t v )
const {
return m_str[v]; };
309 sz_t
var ( sz_t v )
const {
return m_vrs[v]; };
315 for ( sz_t v = 0; v <
m_nvr; v ++ )
316 if ( m_vrs[v] == gv )
return v;
328 for ( sz_t i = 0; i <
m_nvr; m_szs[i] = e->
sz(i), i ++ );
333 template<
typename real_t>
334 static void mdiff(
eenv * res,
eenv * a, real_t * dst, real_t
const *
const src,
int v )
338 for ( sz_t j = 0; j < a->
m_str[v]; j ++ )
342 template<
typename real_t>
346 for (
int c = 0;
c < n;
c ++ )
349 mdiff( res, a, dst[
c], src[c], v );
356 template<
typename real_t>
361 if ( c < 0 ) o <<
"-";
363 if ( ! first ) o <<
"+";
365 for ( sz_t v = 0; v <
nvars(); v ++ )
366 if ( add[
var(v)] ) o <<
"*x" <<
var(v) <<
"^" << add[
var(v)];
372 template<
typename real_t>
384 if ( first && b ) first =
false;
388 while ( c >0 && (add[
var(c)] == m_szs[c]))
395 if ( mcount == 0 ) o <<
"0";
401 template<
typename real_t>
406 template<
typename real_t>
412 for ( sz_t j = 0; j < in->
m_str[v]; j ++ )
429 out <<
"\n\ttsz = " << env.
data_size() << std::endl;
void hodograph(real_t *dst, real_t const *const src, unsigned sz, int st)
Definition: loops_brnops.hpp:138
sz_t * m_vrs
Definition: bernstein_eenv.hpp:253
void toMonoms(real_t *data, bzenv< real_t > *env=bzenv< real_t >::_default_)
Definition: bernstein_eenv.hpp:221
void fill(C *a, unsigned n, int s, const C &x)
Definition: tensor_vctops.hpp:152
const C & b
Definition: Interval_glue.hpp:25
void monoms_print(std::ostream &o, real_t *src)
Definition: bernstein_eenv.hpp:373
TMPL X
Definition: polynomial_operators.hpp:148
void scale(real_t *data)
Definition: bernstein_eenv.hpp:194
static void elevation(eenv *out, eenv *in)
Definition: bernstein_eenv.hpp:402
sz_t stride(sz_t v) const
Definition: bernstein_eenv.hpp:308
sz_t sz(sz_t v) const
Definition: bernstein_eenv.hpp:37
void compute_strides()
Definition: bernstein_eenv.hpp:29
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
static void mdiff(eenv *res, eenv *a, real_t *dst, real_t const *const src, int v)
Definition: bernstein_eenv.hpp:334
void decasteljau(real_t *r, unsigned sz, const real_t &t, int str=1)
Definition: loops_brnops.hpp:23
sz_t var(sz_t v) const
Definition: bernstein_eenv.hpp:309
void swap(eenv &e)
Definition: bernstein_eenv.hpp:290
void maxs(real_t *_maxs_, real_t const *const data, sz_t v) const
Definition: bernstein_eenv.hpp:131
static void elevation(eenv *out, eenv *in, real_t *dst, real_t *src, bzenv< real_t > *bznv=bzenv< real_t >::_default_)
Definition: bernstein_eenv.hpp:407
void toMonoms(real_t *data, sz_t v, bzenv< real_t > *env=bzenv< real_t >::_default_)
Definition: bernstein_eenv.hpp:213
void scale(real_t *src, unsigned sz, const real_t &sc=(real_t)(1.0), int st=1)
Definition: loops_vctops.hpp:216
void rrestrict(real_t *data, int sz, const real_t &t, int st)
Definition: loops_brnops.hpp:132
std::ostream & operator<<(std::ostream &out, const eenv &env)
Definition: bernstein_eenv.hpp:421
eenv_base(sz_t nvr=0)
Definition: bernstein_eenv.hpp:35
real_t eval(real_t *data, const real_t *prm, real_t *chunk=0)
Definition: bernstein_eenv.hpp:56
int indexofvar(sz_t gv) const
Definition: bernstein_eenv.hpp:311
void meval(X &res, real_t *data, const X *prm) const
Definition: bernstein_eenv.hpp:90
void lrestrict(real_t *data, int sz, const real_t &t, int st)
Definition: loops_brnops.hpp:123
sz_t m_nvr
Definition: bernstein_eenv.hpp:27
void fromMonoms(real_t *data, bzenv< real_t > *env=bzenv< real_t >::_default_)
Definition: bernstein_eenv.hpp:209
std::ostream & print(real_t const *const data, unsigned sz, int st=1, std::ostream &out=std::cout)
Definition: loops_vctops.hpp:130
void _alloc_(sz_t nvr)
Definition: bernstein_eenv.hpp:256
~eenv()
Definition: bernstein_eenv.hpp:302
void spmeval(X &res, real_t *src, X *prm, unsigned *supp, unsigned nsupp) const
Definition: bernstein_eenv.hpp:72
int sz_t
Definition: bernstein_eenv.hpp:26
void lrestrict(real_t *data, int v, const real_t &mn)
Definition: bernstein_eenv.hpp:173
void mins(real_t *_mins_, real_t const *const data, sz_t v) const
Definition: bernstein_eenv.hpp:118
Definition: bernstein_eenv.hpp:24
sz_t m_mxvr
Definition: bernstein_eenv.hpp:255
void split(real_t *left, real_t *right, int v, const real_t &t)
Definition: bernstein_eenv.hpp:155
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
sz_t data_size() const
Definition: bernstein_eenv.hpp:39
void mins(real_t *_mins_, real_t const *const data) const
Definition: bernstein_eenv.hpp:149
bool in(const T &x, const Interval< T, r > &y)
Definition: Interval_fcts.hpp:100
void copy(X *dst, real_t const *const src)
Definition: bernstein_eenv.hpp:53
sz_t nvars() const
Definition: bernstein_eenv.hpp:38
eenv(sz_t nvr, sz_t const *szs, sz_t const *vrs)
Definition: bernstein_eenv.hpp:277
bool sgnchg(real_t const *const b, unsigned sz, int st=1)
Definition: loops_vctops.hpp:154
sz_t psft(sz_t v)
Definition: bernstein_eenv.hpp:300
sz_t * m_str
Definition: bernstein_eenv.hpp:27
void abs(Interval< C, r > &x, const Interval< C, r > &a)
Definition: Interval_fcts.hpp:185
real_t monoms_eval(real_t *data, const real_t *prm) const
Definition: bernstein_eenv.hpp:103
void diff(VECTOR1 &res, const VECTOR2 &pol)
Definition: bernstein_univariate.hpp:13
Definition: bernstein_eenv.hpp:246
void rrestrict(real_t *data, int v, const real_t &mx)
Definition: bernstein_eenv.hpp:182
void fromMonoms(real_t *data, sz_t v, bzenv< real_t > *env=bzenv< real_t >::_default_)
Definition: bernstein_eenv.hpp:201
sz_t * m_szs
Definition: bernstein_eenv.hpp:27
const C & c
Definition: Interval_glue.hpp:45
void diff(eenv *e, sz_t v)
Definition: bernstein_eenv.hpp:322
eenv()
Definition: bernstein_eenv.hpp:264
void set_szs(sz_t *szs)
Definition: bernstein_eenv.hpp:36
bool print_monom(std::ostream &o, const real_t &c, sz_t *add, bool first)
Definition: bernstein_eenv.hpp:357
void split2(real_t *left, real_t *right, int v)
Definition: bernstein_eenv.hpp:164
bool sgnchg(real_t *data)
Definition: bernstein_eenv.hpp:191
Definition: bernstein_bzenv.hpp:17
sz_t * m_pszs
Definition: bernstein_eenv.hpp:254
real_t flatness(real_t *data, int v)
Definition: bernstein_eenv.hpp:233
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
sz_t psz()
Definition: bernstein_eenv.hpp:299
void add(dynamic_exp< E > &r, const dynamic_exp< E > &A, const dynamic_exp< E > &B)
Definition: dynamicexp.hpp:295
void maxs(real_t *_maxs_, real_t const *const data) const
Definition: bernstein_eenv.hpp:145
static void monoms_derivative(eenv *res, eenv *a, real_t **dst, real_t **src, int v, int n=1)
Definition: bernstein_eenv.hpp:343
eenv_base::sz_t sz_t
Definition: bernstein_eenv.hpp:248
eenv(sz_t szu, sz_t szv)
Definition: bernstein_eenv.hpp:265
Definition: bernstein_eenv.hpp:249
void horner(parm_t &res, coeff_t const *const mnms, unsigned sz, const parm_t &t, int st=1)
Definition: loops_upoldse.hpp:19
void hodograph(real_t *dst, real_t *src, int v)
Definition: bernstein_eenv.hpp:42