7 template<
typename real_t >
8 real_t
density( real_t * src,
const real_t prec = 1e-12,
unsigned nsmp = 0 )
14 for (
unsigned i = 0; i < nsmp; i ++ )
19 for (
unsigned i = 0; i < nsmp; i ++ )
20 if (
std::abs(src[rand()%data_size()] > prec) ) c++;
22 return ((real_t)c)/nsmp;
26 template<
class real_t>
27 unsigned support(
unsigned * supp, real_t * src,
const real_t& prec = 1e-6 )
31 for (
unsigned i = 0; i < data_size(); i ++ )
32 if (
std::abs(src[i]) > prec ) supp[c++] = i;
39 if ( nvars() ) this->~
eenv();
40 _alloc_( a->nvars()+b->nvars() );
41 std::copy( a->m_vrs, a->m_vrs+a->nvars(), m_vrs );
42 std::copy( b->m_vrs, b->m_vrs+b->nvars(), m_vrs + a->nvars() );
44 for ( sz_t v = 0; v < m_nvr; v ++ )
46 int av = a->indexofvar(var(v));
47 int bv = b->indexofvar(var(v));
48 m_szs[ v ] = ((av!=-1)?(a->sz(av)-1):0) + ((bv!=-1)?(b->sz(bv)-1):0) + 1;
50 m_mxvr =
std::max(a->m_mxvr,b->m_mxvr);
57 for ( sz_t v = 0; v < i->m_nvr; v ++ )
60 for ( sz_t k = 0; k < o->m_nvr; k ++ )
61 if ( o->m_vrs[k] == i->m_vrs[v] ) vmap[v] = k;
71 sz_t vmap_[ ienv->m_nvr ];
73 vmap( vmap_, oenv, ienv );
75 for ( c = 0; c < nsp; osupp[
c] = addo, c ++ )
76 for ( addi = isupp[c], addo = 0, v = ienv->m_nvr-1; addi; addi /= ienv->m_szs[v], v-- )
77 addo += (addi%ienv->m_szs[v])*oenv->m_str[vmap_[v]];
80 nsp = ienv->data_size();
81 for ( c = 0; c < nsp; osupp[
c] = addo, c ++ )
82 for ( addi = c, addo = 0, v = ienv->m_nvr-1; addi; addi /= ienv->m_szs[v], v -- )
83 addo += (addi%ienv->m_szs[v])*oenv->m_str[vmap_[v]];
89 template<
class real_t,
char op >
93 unsigned * asupp = 0,
unsigned nas = 0,
95 unsigned * bsupp = 0,
unsigned nbs = 0,
96 unsigned * obsup = 0 )
99 unsigned * loasup, * lobsup; loasup = lobsup = 0;
101 if ( !oasup ) {
if ( !asupp ) nas = aenv->data_size(); loasup =
new unsigned[ nas ]; oasup = loasup; oaddress( oenv, oasup, aenv, asupp, nas ); };
103 if ( !obsup ) {
if ( !bsupp ) nbs = benv->data_size(); lobsup =
new unsigned[ nbs ]; obsup = lobsup; oaddress( oenv, obsup, benv, bsupp, nas ); };
105 unsigned ia, ib, out; real_t ca;
106 switch( (asupp!=0)<<1|(bsupp!=0) )
109 assert(nas==aenv->data_size() && nbs == benv->data_size());
112 for ( ia = 0; ia < nas; ia ++ )
113 for ( ib = 0; ib < nbs; ib ++ )
114 dst[oasup[ia]+obsup[ib]] += sra[ia]*srb[ib];
119 for ( ia = 0; ia < nas; ia ++ )
120 for ( ib = 0; ib < nbs; out += obsup[ib], ib ++ )
121 dst[oasup[ia]+obsup[ib]] -= sra[ia]*srb[ib];
126 assert(nas == aenv->data_size() && bsupp != 0);
129 assert(nas==aenv->data_size() && nbs == benv->data_size());
130 for ( ia = 0; ia < nas; ia ++ )
131 for ( ib = 0; ib < nbs; ib ++ )
132 dst[oasup[ia]+obsup[ib]] += sra[ia]*srb[bsupp[ib]];
137 for ( ia = 0; ia < nas; ia ++ )
138 for ( ib = 0; ib < nbs; ib ++ )
139 dst[oasup[ia]+obsup[ib]] -= sra[ia]*srb[bsupp[ib]];
144 assert(nbs == benv->data_size() && asupp != 0);
147 for ( ia = 0; ia < nas; ia ++ )
148 for ( ib = 0; ib < nbs; ib ++ )
149 dst[oasup[ia]+obsup[ib]] += sra[asupp[ia]]*srb[ib];
154 for ( ia = 0; ia < nas; ia ++ )
155 for ( ib = 0; ib < nbs; ib ++ )
156 dst[oasup[ia]+obsup[ib]] -= sra[asupp[ia]]*srb[ib];
161 assert(asupp != 0 && bsupp != 0);
164 for ( ia = 0; ia < nas; ia ++ )
165 for ( ib = 0; ib < nbs; ib ++ )
166 dst[oasup[ia]+obsup[ib]] += sra[asupp[ia]]*srb[bsupp[ib]];
171 assert(nas==aenv->data_size() && nbs == benv->data_size());
172 for ( ia = 0; ia < nas; ia ++ )
173 for ( ib = 0; ib < nbs; ib ++ )
174 dst[oasup[ia]+obsup[ib]] -= sra[asupp[ia]]*srb[asupp[ib]];
180 if ( loasup )
delete[] loasup;
if ( lobsup )
delete[] lobsup;
201 template<
typename real_t>
202 static void monoms_multiply_loop(
eenv * o,
eenv * a,
eenv *
b, real_t * dst, real_t * src_a, real_t * src_b )
203 { _mvrcvloop_<real_t,'+'>( o, dst, a, src_a,
b, src_b ); };
205 template<
typename real_t>
207 real_t * dst, real_t * src_a, real_t * src_b )
208 { res->op_mul(a,b); monoms_multiply_loop( res, a, b, dst, src_a, src_b ); };
211 template<
typename real_t >
212 static void pmmul(
eenv * oenv, real_t ** dst,
eenv * aenv, real_t ** src_a,
eenv * benv, real_t ** src_b,
int n,
214 unsigned * asupp = 0,
unsigned nas = 0,
215 unsigned * oasup = 0,
216 unsigned * bsupp = 0,
unsigned nbs = 0,
217 unsigned * obsup = 0 )
219 if (
clear )
for (
int d=0;d<n;
std::fill(dst[d],dst[d]+oenv->data_size(),(real_t)0.0),d++);
220 unsigned * loasup, * lobsup; loasup = lobsup = 0;
222 if ( !oasup ) {
if ( !asupp ) nas = aenv->data_size(); loasup =
new unsigned[ nas ]; oasup = loasup; oaddress( oenv, oasup, aenv, asupp, nas ); };
224 if ( !obsup ) {
if ( !bsupp ) nbs = benv->data_size(); lobsup =
new unsigned[ nbs ]; obsup = lobsup; oaddress( oenv, obsup, benv, bsupp, nbs ); };
225 for (
unsigned i = 0; i < n; i ++ )
226 _mvrcvloop_<real_t,'+'>(oenv,dst[i],aenv,src_a[i],benv,src_b[i],asupp,nas,oasup,bsupp,nbs,obsup);
227 if ( loasup )
delete[] loasup;
if ( lobsup )
delete[] lobsup;
230 template<
typename real_t >
231 static inline void mmul(
eenv * oenv, real_t * dst,
eenv * aenv, real_t * src_a,
eenv * benv, real_t * src_b,
233 unsigned * asupp = 0,
unsigned nas = 0,
234 unsigned * oasupp = 0,
235 unsigned * bsupp = 0,
unsigned nbs = 0,
236 unsigned * obsupp = 0 )
237 { pmmul( oenv, &dst, aenv, &src_a, benv, &src_b, 1,
clear, asupp, nas, oasupp, bsupp, nbs, obsupp ); };
239 template<
typename real_t >
240 static void spmmul(
eenv * oenv, real_t ** dst,
eenv * aenv, real_t ** src_a,
eenv * benv, real_t ** src_b,
int n,
241 bool clear =
true,
bool stats =
false )
244 unsigned * assup =
new unsigned[ aenv->data_size() ];
245 unsigned * bssup =
new unsigned[ benv->data_size() ];
247 for (
int i = 0; i < n; i ++ )
249 nas = aenv->support(assup,src_a[i]);
250 nbs = benv->support(bssup,src_b[i]);
251 mmul( oenv, dst[i], aenv, src_a[i], benv, src_b[i],
true, assup, nas, 0, bssup, nbs, 0 );
257 template<
typename real_t >
258 static void spmmul(
eenv * oenv, real_t * dst,
eenv * aenv, real_t * src_a,
eenv * benv, real_t * src_b,
259 bool clear =
true,
bool stats =
false )
261 spmmul( oenv, &dst, aenv, &src_a, benv, &src_b, 1,
clear, stats );
264 template<
typename real_t>
265 static void mcrossp(
eenv * oenv, real_t ** dst,
eenv * aenv, real_t ** src_a,
eenv * benv, real_t ** src_b,
267 unsigned * asupp = 0,
unsigned nas = 0,
268 unsigned * oasup = 0,
269 unsigned * bsupp = 0,
unsigned nbs = 0,
270 unsigned * obsup = 0 )
274 if (
clear )
for (
int d=0;d<3;
std::fill(dst[d],dst[d]+oenv->data_size(),(real_t)0.0),d++);
275 unsigned * loasup, * lobsup; loasup = lobsup = 0;
277 if ( !oasup ) {
if ( !asupp ) nas = aenv->data_size(); loasup =
new unsigned[ nas ]; oasup = loasup; oaddress( oenv, oasup, aenv, asupp, nas ); };
279 if ( !obsup ) {
if ( !bsupp ) nbs = benv->data_size(); lobsup =
new unsigned[ nbs ]; obsup = lobsup; oaddress( oenv, obsup, benv, bsupp, nbs ); };
280 _mvrcvloop_<real_t,'+'>(oenv,dst[2],aenv,src_a[0],benv,src_b[1],asupp,nas,oasup,bsupp,nbs,obsup);
281 _mvrcvloop_<real_t,
'-'>(oenv,dst[2],aenv,src_a[1],benv,src_b[0],asupp,nas,oasup,bsupp,nbs,obsup);
282 _mvrcvloop_<real_t,'+'>(oenv,dst[0],aenv,src_a[1],benv,src_b[2],asupp,nas,oasup,bsupp,nbs,obsup);
283 _mvrcvloop_<real_t,
'-'>(oenv,dst[0],aenv,src_a[2],benv,src_b[1],asupp,nas,oasup,bsupp,nbs,obsup);
284 _mvrcvloop_<real_t,'+'>(oenv,dst[1],aenv,src_a[2],benv,src_b[0],asupp,nas,oasup,bsupp,nbs,obsup);
285 _mvrcvloop_<real_t,
'-'>(oenv,dst[1],aenv,src_a[0],benv,src_b[2],asupp,nas,oasup,bsupp,nbs,obsup);
286 if ( loasup )
delete[] loasup;
if ( lobsup )
delete[] lobsup;
312 template<
typename real_t>
313 static void mcrossp(
eenv * res,
eenv * a,
eenv * b, real_t ** dst, real_t ** src_a, real_t ** src_b )
314 { mcrossp( res, dst, a, src_a, b, src_b ); };
316 template<
typename real_t>
317 static void monoms_crossprod(
eenv * res,
eenv * a,
eenv * b,
319 real_t ** src_a, real_t ** src_b )
322 for (
int d = 0; d < 3; d ++ ) dst[d] =
new real_t[ res->data_size() ];
323 mcrossp( res, dst, a, src_a, b, src_b );
327 template<
typename real_t>
328 static void mdotp(
eenv * oenv, real_t * dst,
eenv * aenv, real_t ** src_a,
eenv * benv, real_t ** src_b,
int n,
330 unsigned * asupp = 0,
unsigned nas = 0,
331 unsigned * oasup = 0,
332 unsigned * bsupp = 0,
unsigned nbs = 0,
333 unsigned * obsup = 0 )
338 unsigned * loasup, * lobsup; loasup = lobsup = 0;
340 if ( !oasup ) {
if ( !asupp ) nas = aenv->data_size(); loasup =
new unsigned[ nas ]; oasup = loasup; oaddress( oenv, oasup, aenv, asupp, nas ); };
342 if ( !obsup ) {
if ( !bsupp ) nbs = benv->data_size(); lobsup =
new unsigned[ nbs ]; obsup = lobsup; oaddress( oenv, obsup, benv, bsupp, nas ); };
343 for (
int i = 0; i < n; i ++ )
344 _mvrcvloop_<real_t,'+'>(oenv,dst,aenv,src_a[i],benv,src_b[i],asupp,nas,oasup,bsupp,nbs,obsup);
345 if ( loasup )
delete[] loasup;
if ( lobsup )
delete[] lobsup;
348 template<
typename real_t>
349 static void monoms_dotprod(
eenv * res,
eenv * a,
eenv * b, real_t *& dst, real_t ** src_a, real_t ** src_b,
int n )
352 dst =
new real_t[res->data_size()];
353 mdotp( res, dst, a, src_a, b, src_b, n );
359 template<
class real_t >
361 unsigned * isupp = 0,
unsigned nsp = 0, bernstein::bzenv<real_t> * bznv = bzenv<real_t>::_default_ )
367 for ( c = 0; c < nsp; bcff[
c] = cff, c ++ )
368 for ( cff = (real_t)1.0, addi = isupp[c], v = ienv->m_nvr-1; addi; addi /= ienv->m_szs[v], v-- )
369 cff /= bznv->binomial(ienv->m_szs[v]-1,addi % ienv->m_szs[v]);
371 for ( c = 0; c < ienv->data_size(); bcff[
c] = cff, c ++ )
372 for ( addi = c, v = ienv->m_nvr-1; addi; addi /= ienv->m_szs[v], v -- )
373 cff /= bznv->binomial(ienv->m_szs[v]-1,addi % ienv->m_szs[v]);
unsigned set_conversion(real_t *src, unsigned sz, const real_t &epsilon=(real_t) 0)
Definition: loops_vctops.hpp:206
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 clear(monomials< C > &monoms)
Definition: tensor_monomials_fcts.hpp:87
tensor::eenv eenv
Definition: tensor_convert.hpp:12
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
void op_mul(eenv *a, eenv *b)
Definition: bernstein_eenv_multiply.hpp:37
void abs(Interval< C, r > &x, const Interval< C, r > &a)
Definition: Interval_fcts.hpp:185
const C & c
Definition: Interval_glue.hpp:45
real_t density(real_t *src, const real_t prec=1e-12, unsigned nsmp=0)
Definition: bernstein_eenv_multiply.hpp:8
unsigned support(unsigned *supp, real_t *src, const real_t &prec=1e-6)
Definition: bernstein_eenv_multiply.hpp:27
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
#define assert(expr, msg)
Definition: shared_object.hpp:57