// Ce code source est régi par la licence CeCILL V2.1 soumise au droit français et 
//respectant les principes de diffusion des logiciels libres. Il est autorisé de modifier 
//et/ou redistribuer ce code sous les conditions de la licence CeCILL V2.1. Le texte complet
// de la licence CeCILL V2.1 est dans le fichier `LICENSE`.

// fonction : calcule la contribution de la variable serie a partir de la serie mainf qui doit deja
// avoir été créée et a partir d'une periode de debut
// la fonction n'a été testée que sur données annuelles 
// il faudra peut-être l'adapter pour des donnees trimestrielles 



addfun main ;
procedure main(serie,serie_mainf) 
{
debut=startdate(serie) ; /* date de debut de la serie */
fin=enddate(serie) ; /* date de fin de la serie */

sortie=c.() ; /* initialisation à  blanc de sortie */

while (not namask(datint(serie,na))) /* cette boucle elimine les na et ce qui les precede ;*/
{
   if ((debut+datint(serie,na)-1)==fin) 
      {
      print("***** erreur : votre serie se termine par des NA ******");
      exit() ;
      }
   serie=subrange(serie,debut+datint(serie,na),fin) ;
   debut=startdate(serie) ; /*date de debut de la nouvelle serie */
}   

i=debut;

while (i<=fin)  /* bouclage jusqu'à la date de fin de la serie en entrée */
{
   nbret0=mins(i-debut+1,100) ; 
   deb=maxs(debut,i-99) ;
// nombre de retards sur lequel peut être calculée la contrib, compte tenu de la date de départ de la série et du nombre 
// de la date i sur laquelle est calculée cette contrib
   
   serie_mainf_souspart=rev.(serie_mainf[1::nbret0]) ;
// extraction de la partie du mainf dont on a besoin et inversion

   serie_souspart=reshape(subrange(serie,deb,i));
// extraction de la partie de la série dont on a besoin
 
   serie_calcul=matmult(transp(serie_souspart),serie_mainf_souspart) ;
// multiplication de la structure de mainf par la structure de retard de la série
 
   sortie=c.(sortie,serie_calcul) ;/* ajout aux calculs précédents */
   i=i+1;
}   
contrib=reshape(sortie,debut) ;/* reformatage de la série pour la ramener a la date voulue */
return(contrib) ;
}
