solver_series_rep< C, V > Class Template Reference

#include <series_implicit.hpp>

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

List of all members.

Public Member Functions

Public Attributes


Detailed Description

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

Definition at line 99 of file series_implicit.hpp.


Constructor & Destructor Documentation

solver_series_rep ( nat  m,
const vector< vector< C > > &  init 
) [inline]

Definition at line 425 of file series_implicit.hpp.

References mmx::N().

00425                                                                     :
00426   VSeries_rep (format<VC > (/*FIXME*/)), m (m2), cur_n (0)
00427 {
00428   this->n= N(init);
00429   this->Set_order (this->n);
00430   for (nat i=0; i<this->n; i++)
00431     this->a[i]= init[i];
00432 }


Member Function Documentation

void Increase_order ( nat  l  )  [inline, virtual]

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 }

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

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]

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]

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

Definition at line 103 of file series_implicit.hpp.

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

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

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 20 Mar 2013 for algebramix by  doxygen 1.6.1