Re: do you support MTL?

"Xu Bin" <[email protected]> Fri, 12 May 2006 11:04:52 -0600
Newsgroups gmane.comp.lib.mtl.devel
Message-ID <[email protected]>
On 5/10/06, Irek Szczesniak <[email protected]> wrote:
>
> Hi Peter,
>
> Thank you for your email and resolving my problems.  I implemented the
> operators for the polynomial type, and now I'm able to multiply
> vectors and matrixes of polynomials.  I'm attaching a complete program
> at the bottom of this email.
>
> Because I have the basic functionality going (a product of polynomial
> vectors and matrixes), I think I will plugh ahead harnessing MTL.
>
> I'm looking forward to the release of the new MTL.
>
>
> Best,
> Irek
>
> Peter Gottschling wrote:
>
> > Hi Irek,
> >
> > Thank you for your interest in MTL and sorry for the trouble you run
> > into.  The problem is that nobody developed MTL for some years.
> > When we restarted it (with different authors), we saw many things
> > principally different.  Therefore, we decided to restart from the
> > beginning (which unfortunately goes slower than expected).
> > Therefore I tend to keep the maintenance efforts on MTL 2.xx minimal
> > (to not delay the delivery of the new version even further).
> >
> > However, the idea of polynomials as scalar types is interesting and
> > I tried to figure out your problems.  There were severals issues and
> > not everything was MTL's fault ;-)
> > 1. print_all_matrix is implemented as std::cout << x ..., it better
> > should be 'using std::cout; cout << x; ...'
> > - there are several such functions and we will fix this one day
> > - one can work around by defining the << operator in std namespace
> > 2. print_vector used iterator -> I changed it to const_iterator in
> > the hope that all relevant vectors have this
> > 3. instead of defining * and + operator for map it works better to
> > define a new type that derives from map (which is needed by
> > 4. anyway)
> > 4. the utilization of scale(v, 0) requires that polynomial is
> > constructible from int or double
> >
> > I add some code that solved the syntactical problems.  The
> > implementation of the numerical part I leave to you although that is
> > the more interesting.  I would appreciate if you can keep me
> > up-to-date occasionally (better directly to me instead of the list).
> >
> > Best,
> > Peter
>
> ********************************************************************
>
> #include <iostream>
> #include <map>
> #include <vector>
> #include <mtl/matrix.h>
> #include <mtl/mtl.h>
> #include <mtl/utils.h>
> #include <mtl/blais.h>
> #include <mtl/sparse1D.h>
>
> using namespace mtl;
> using namespace std;
>
> struct polynomial : map<int, double>
> {
>   typedef map<int, double> base;
>
>   polynomial() : base() {}
>
>   polynomial(double c0) : base()
>   {
>     (*this)[0]= c0;
>   }
> };
>
>
> typedef matrix<polynomial,
>                 rectangle<>,
>                 array< dense<> >,
>                 row_major>::type Mat;
>
>
> polynomial
> operator *(const polynomial &p1, const polynomial &p2)
> {
>   polynomial result;
>
>   for(polynomial::const_iterator i = p1.begin(); i != p1.end(); ++i)
>     for(polynomial::const_iterator j = p2.begin(); j != p2.end(); ++j)
>       result[i->first + j->first] += i->second * j->second;
>
>   return result;
> }
>
>
> polynomial&
> operator +=(polynomial &p1, const polynomial &p2)
> {
>   for(polynomial::const_iterator i = p2.begin(); i != p2.end(); ++i)
>     p1[i->first] += i->second;
>   return p1;
> }
>
>
> polynomial
> operator +(const polynomial &p1, const polynomial &p2)
> {
>   polynomial result = p1;
>   result += p2;
>   return result;
> }
>
>
> namespace std
> {
>   ostream &operator << (ostream &out, const polynomial &p)
>   {
>     for(polynomial::const_reverse_iterator i = p.rbegin(); i !=
> p.rend();)
>       {
>        out << i->second;
>
>        if (i->first)
>          out << "*x^" << i->first;;
>
>        if (++i != p.rend())
>          cout << " + ";
>       }
>
>     return out;
>   }
> }
>
> int
> main()
> {
>   Mat A(3, 3);
>
>   A(0, 0) = polynomial();
>   A(1, 1) = polynomial();
>   A(2, 2) = polynomial();
>
>   A(0, 0)[2] = 1;
>   A(1, 1)[1] = 1;
>   A(2, 2)[0] = 1;
>
>   dense1D<polynomial> c(3), result(3);
>
>   c[0][0] = 1;
>   c[1][1] = 3;
>   c[2][2] = 2;
>
>   mult(A, c, result);
>
>   print_all_matrix(A);
>
>   print_vector(result);
>
>   return 0;
> }
> _______________________________________________
> This list is archived at http://www.osl.iu.edu/MailArchives/mtl-devel/
>



-- 
xubin

_______________________________________________
This list is archived at http://www.osl.iu.edu/MailArchives/mtl-devel/