implicit_vector_series_rep< C, V > Class Template Reference

#include <series_sugar.hpp>

Inheritance diagram for implicit_vector_series_rep< C, V >:
solver_series_rep< C, V > series_rep

List of all members.

Public Member Functions

Public Attributes


Detailed Description

template<typename C, typename V = typename series_variant_helper< C >::SV>
class mmx::implicit_vector_series_rep< C, V >

Definition at line 157 of file series_sugar.hpp.


Constructor & Destructor Documentation

implicit_vector_series_rep ( const routine &  fun2,
const vector< vector< C > > &  c2 
) [inline]

Definition at line 161 of file series_sugar.hpp.

00162                                                            :
00163     Solver_rep (N(c2[0]), c2), fun (fun2), c (c2) {}
  syntactic expression (const syntactic& z) const {


Member Function Documentation

syntactic expression ( const syntactic &  z  )  const [inline]

Definition at line 164 of file series_sugar.hpp.

References mmx::flatten().

00164                                                   {
00165     (void) z;
00166     return apply ("implicit", flatten (fun), flatten (c)); }

void Increase_order ( nat  l  )  [inline, virtual, inherited]

Definition at line 435 of file series_implicit.hpp.

References solver_series_rep< C, V >::eqs, mmx::increase_order(), and mmx::N().

00435                                  {
00436   VSeries_rep::Increase_order (l);
00437   for (nat i=0; i<N(eqs); i++)
00438     increase_order (eqs[i], l);
00439 }

vector< series< unknown<C,V> > > initialize (  )  [inline, virtual]

Implements solver_series_rep< C, V >.

Definition at line 167 of file series_sugar.hpp.

References solver_series_rep< C, V >::me().

00167                                  {
00168     /*
00169     vector<USeries> mmm= this->me ();
00170     for (nat i=0; i<N(mmm); i++)
00171       for (nat j=0; j<3; j++)
00172         mmerr << i << ", " << j << " -> " << mmm[i][j] << "\n";
00173     */
00174     vector<generic> in =
00175       as<vector<generic> > (this->me ());
00176     vector<generic> out=
00177       as<vector<generic> > (fun->apply (as<generic> (in)));
00178     /*
00179     vector<USeries> rrr= as<vector<USeries > > (out);
00180     for (nat i=0; i<N(rrr); i++)
00181       for (nat j=0; j<3; j++)
00182         mmerr << i << ", " << j << " -> " << rrr[i][j] << "\n";    
00183     */
00184     return as<vector<USeries > > (out); }

vector< series< unknown< C, V > > > me (  )  [inline, inherited]

Definition at line 448 of file series_implicit.hpp.

References solver_series_rep< C, V >::m, and mmx::unknown_series().

Referenced by implicit_vector_series_rep< C, V >::initialize(), and implicit_series_rep< C, V >::initialize().

00448                 {
00449   vector<USeries > r= fill<USeries > (m);
00450   for (nat i=0; i<m; i++)
00451     r[i]= unknown_series (this, i);
00452   return r;
00453 }

syntactic name_component ( nat  i  )  [inline, virtual, inherited]

Definition at line 442 of file series_implicit.hpp.

References mmx::access(), mmx::flatten(), and solver_series_rep< C, V >::m.

00442                                  {
00443   if (m == 1) return syntactic ("f");
00444   else return access (syntactic ("f"), flatten (i+1));
00445 }

vector< C > next (  )  [inline, inherited]

Definition at line 456 of file series_implicit.hpp.

References mmx::C, solver_series_rep< C, V >::cur_n, solver_series_rep< C, V >::eqs, mmx::insert_and_reduce(), mmx::is_exact_zero(), solver_series_rep< C, V >::m, min(), mmx::N(), Solver_rep, mmx::substitute(), solver_series_rep< C, V >::sys, UC, and VC.

00456                   {
00457   //mmerr << "Solving " << this->n << "\n";
00458   for (nat i=0; i<N(sys); i++)
00459     sys[i]= substitute (sys[i]);
00460   VC  ret = fill<C> (m);
00461   nat done= 0;
00462   while (true) {
00463     ASSERT (cur_n < this->n + 100, "too large delay in implicit solve");
00464     //mmerr << "  Coefficient " << cur_n << "\n";
00465     for (nat j=0; j<N(eqs); j++) {
00466       UC c= eqs[j][cur_n];
00467       //mmerr << "    Equation " << j << "= " << c << "\n";
00468       insert_and_reduce (sys, c);
00469     }
00470     //mmerr << "  System= " << sys << "\n";
00471     cur_n++;
00472     for (nat i=0; i<N(sys); i++)
00473       ASSERT (sys[i]->f == ((Solver_rep*) this) &&
00474               sys[i]->i1 >= this->n * m && sys[i]->i2 > this->n * m,
00475               "invalid situation during implicit solving");
00476     while (N(sys) > 0 && done < m) {
00477       UC c= sys[N(sys)-1];
00478       if (c->i2 <= this->n * m + done + 1) {
00479         nat j1 = c->i1 - this->n * m;
00480         nat j2 = min (done, c->i2 - this->n * m);
00481         C   rhs= c->b;
00482         for (nat j=j1; j<j2; j++)
00483           rhs += c->s[j-j1] * ret[j];
00484         if (c->i2 <= this->n * m + done) {
00485           ASSERT (is_exact_zero (rhs), "contradictory equations"); }
00486         else {
00487           ret[done]= -rhs / c->s[done-j1];
00488           //mmerr << "  Component " << done << "= " << ret[done] << "\n";
00489           done++;
00490         }
00491         sys.secure ();
00492         inside (sys) -> resize (N(sys) - 1);
00493       }
00494       else break;
00495     }
00496     if (done == m) return ret;
00497   }
00498 }


Member Data Documentation

nat cur_n [inherited]

Definition at line 103 of file series_implicit.hpp.

Referenced by solver_series_rep< C, V >::next().

vector< series< unknown<C,V> > > eqs [inherited]
nat m [inherited]
vector< unknown<C,V> > sys [inherited]

Definition at line 104 of file series_implicit.hpp.

Referenced by solver_series_rep< C, V >::next().


The documentation for this class was generated from the following file:

Generated on 6 Dec 2012 for algebramix by  doxygen 1.6.1