//=====================================================
// File   :  STL_interface.hh
// Author :  L. Plagne <laurent.plagne@edf.fr)>
// Copyright (C) EDF R&D,  lun sep 30 14:23:24 CEST 2002
//=====================================================
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
#ifndef STL_INTERFACE_HH
#define STL_INTERFACE_HH
#include <string>
#include <vector>
#include "utilities.h"

using namespace std;

template<class real>
class STL_interface{

public :

  typedef real real_type ;

  typedef std::vector<real>  stl_vector;
  typedef std::vector<stl_vector > stl_matrix;

  typedef stl_matrix gene_matrix;

  typedef stl_vector gene_vector;

  static inline std::string name( void )
  {
    return "STL";
  }

  static void free_matrix(gene_matrix & A, int N){}

  static void free_vector(gene_vector & B){}

  static inline void matrix_from_stl(gene_matrix & A, stl_matrix & A_stl){
    A = A_stl;
  }

  static inline void vector_from_stl(gene_vector & B, stl_vector & B_stl){
    B = B_stl;
  }

  static inline void vector_to_stl(gene_vector & B, stl_vector & B_stl){
    B_stl = B ;
  }


  static inline void matrix_to_stl(gene_matrix & A, stl_matrix & A_stl){
    A_stl = A ;
  }

  static inline void copy_vector(const gene_vector & source, gene_vector & cible, int N){
    for (int i=0;i<N;i++){
      cible[i]=source[i];
    }
  }


  static inline void copy_matrix(const gene_matrix & source, gene_matrix & cible, int N){
    for (int i=0;i<N;i++)
      for (int j=0;j<N;j++)
        cible[i][j]=source[i][j];
  }

  static inline void ata_product(const gene_matrix & A, gene_matrix & X, int N)
  {
    real somme;
    for (int j=0;j<N;j++){
      for (int i=0;i<N;i++){
        somme=0.0;
        for (int k=0;k<N;k++)
          somme += A[i][k]*A[j][k];
        X[j][i]=somme;
      }
    }
  }

  static inline void aat_product(const gene_matrix & A, gene_matrix & X, int N)
  {
    real somme;
    for (int j=0;j<N;j++){
      for (int i=0;i<N;i++){
        somme=0.0;
        for (int k=0;k<N;k++){
          somme+=A[k][i]*A[k][j];
        }
        X[j][i]=somme;
      }
    }
  }


  static inline void matrix_matrix_product(const gene_matrix & A, const gene_matrix & B, gene_matrix & X, int N)
  {
    real somme;
    for (int j=0;j<N;j++){
      for (int i=0;i<N;i++){
        somme=0.0;
        for (int k=0;k<N;k++)
          somme+=A[k][i]*B[j][k];
        X[j][i]=somme;
      }
    }
  }

  static inline void matrix_vector_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)
  {
    real somme;
    for (int i=0;i<N;i++){
      somme=0.0;
      for (int j=0;j<N;j++)
        somme+=A[j][i]*B[j];
      X[i]=somme;
    }
  }

  static inline void atv_product(gene_matrix & A, gene_vector & B, gene_vector & X, int N)
  {
    real somme;
    for (int i=0;i<N;i++){
      somme = 0.0;
      for (int j=0;j<N;j++)
        somme += A[i][j]*B[j];
      X[i] = somme;
    }
  }

  static inline void axpy(real coef, const gene_vector & X, gene_vector & Y, int N){
    for (int i=0;i<N;i++)
      Y[i]+=coef*X[i];
  }

  static inline real norm_diff(const stl_vector & A, const stl_vector & B)
  {
    int N=A.size();
    real somme=0.0;
    real somme2=0.0;

    for (int i=0;i<N;i++){
      real diff=A[i]-B[i];
      somme+=diff*diff;
      somme2+=A[i]*A[i];
    }
    return somme/somme2;
  }

  static inline real norm_diff(const stl_matrix & A, const stl_matrix & B)
  {
    int N=A[0].size();
    real somme=0.0;
    real somme2=0.0;

    for (int i=0;i<N;i++){
      for (int j=0;j<N;j++){
        real diff=A[i][j] - B[i][j];
        somme += diff*diff;
        somme2 += A[i][j]*A[i][j];
      }
    }

    return somme/somme2;
  }

  static inline void display_vector(const stl_vector & A)
  {
    int N=A.size();
    for (int i=0;i<N;i++){
      INFOS("A["<<i<<"]="<<A[i]<<endl);
    }
  }

};

#endif
