/*

   Modèle de fichier pour les modèles compilés Netral

   Le modèle utilisé est model0

*/
  #include <stdio.h>
  #include <stdlib.h>
  #include "model0DLM.h"
  #include "model0tfr.h"
  #include "model0Grd.h"

EXPORT int __stdcall init (char *arg)
{
        return model0loadw(NULL);
}

EXPORT int __stdcall close(void)
{
        return 0;
}

EXPORT int __stdcall getauthorcode(void)
{
        return 1;
}

EXPORT int __stdcall getinfo(int InfoParam)
{
        switch(InfoParam){
                case 1:
                        return model0INPUTS; // Nombre d'entrées
                case 2:
                        return model0OUTPUTS; // Nombre de sorties
                case 3:
                        return model0SYNAPSES; // Nombre de paramètres
                case 4:
                        return 3; // Normabilité
                default: return 0;        
        }
}

EXPORT int __stdcall transfer(double *VEntree, double *VSortie)
{       // Fonction de transfert
        model0transfer(VEntree, VSortie);
        return 0;  
}

EXPORT int __stdcall setparam(double *Source)
{       // Ecriture des paramètres
        memmove(model0weights, Source, model0SYNAPSES*sizeof(double));
        return 0; 
}

EXPORT int __stdcall getparam(double *Cible)
{       // Lecture des paramètres
        memmove(Cible, model0weights, model0SYNAPSES*sizeof(double));
        return 0; 
}

EXPORT int __stdcall getgradient(double *VEntree, double *VGradient, int OutputIndex)
{       // Calcul du gradient
        double iniback[model0OUTPUTS];
        double outputs[model0OUTPUTS];
               
        iniback[OutputIndex] = 1;
        model0transfergradient(model0weights, VEntree, outputs, VGradient, iniback);
        return 0; 
}

EXPORT int __stdcall gethessian(double *VEntree, double *Hessien, int OutputIndex)
{       // Calcul du Hessien
        return -2; 
}

EXPORT int __stdcall getexperimentalspace(double *Cible)
{       // Lecture du domaine expérimental
        double* temp;
        int i;
        for (i=0; i < model0INPUTS; i++){
                temp = model0inputrange(i);
                Cible[2*i] = temp[0];
                Cible[2*i+1] = temp[1];
        }
        return 0; 
}

EXPORT int __stdcall getinputgradient(double *VEntree, double *VGradient, int OutputIndex)
{       // Calcul du gradient relatif aux entrées
        double iniback[model0OUTPUTS];
        double outputs[model0OUTPUTS];
               
        iniback[OutputIndex] = 1;
        model0transfergradientinput(model0weights, VEntree, outputs, VGradient, iniback);
        return 0; 
}

EXPORT int __stdcall getiniparams(int Index, double *IniMean, double *IniDev)
{       // Lecture des conditions d'initialisation des paramètres
        double* temp=NULL;
        temp = model0getweightini(Index);
        if (temp){
                *IniMean = temp[0];
                *IniDev = temp[1];
                return 0;
        } else
                return -3;        
}

EXPORT int __stdcall getparamspace(double *Cible)
{       // Lecture du domaine paramétrique
        return -2; 
}

EXPORT int __stdcall getfindiff(double *FiniteDiff)
{       // Lecture de la différence finie
        return -2; 
}

EXPORT int __stdcall getmsg(char *Dest, int Index)
{       // Lecture des messages
        return -2; 
}

EXPORT int __stdcall getname(char *Dest, int Style, int Index)
{       // Lecture des noms
        int res = 0;
        char* PC;
        switch(Style){
                // case 0: Nom du modèle
                case 0: PC = "model0"; break;
                case 1: PC = (char*)model0inputname(Index); break;
                case 2: PC = (char*)model0outputname(Index); break;
                case 3: PC = (char*)model0weightname(Index); break; // Noms des paramètres
                default: res = -2;
        }
        if (res == 0)
                if (Dest)
                        strcpy(Dest, PC);
                else
                        res = strlen(PC);
        return res; 
}


 

NETRAL - Neuro Code 6