/* 学習後のパラメータをニューロンの出力を計算するプログラム : pout.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define Iunits 20
#define Hunits 50
#define Ounits 2
#define SMAX 256
#define fout(x) ( 1 / ( 1 + exp( -(x) ) )) /* シグモイド関数 */
int iunits = Iunits;
double wih[Hunits][Iunits]; /* 結合荷重(重み) */
double who[Ounits][Hunits];
double dwih[Hunits][Iunits]; /* 重みの変化量 */
double dwho[Ounits][Hunits];
double shikiih[Hunits]; /* しきい値 */
double shikiio[Ounits];
double dshikiih[Hunits]; /* しきい値の変化量 */
double dshikiio[Ounits];
double iout[Iunits]; /* 各層の出力 */
double hout[Hunits], old_hout[Hunits];
double oout[Ounits];
double ts[SMAX]; /* 教師信号 */
double em[Hunits], old_em[Hunits]; /* 内部状態(イータ、ゼータ)*/
double zm[Hunits], old_zm[Hunits];
double km, kr, al; /* カオスニューロンのパラメータ */
void load_prm(char *filename){
FILE *fi;
size_t wsize;
int i;
if(( fi = fopen(filename,"r")) == NULL ){
fprintf(stderr,"Can't open %s\n",filename);
exit(1);
}
wsize = sizeof( double );
/* データーの読み込み */
fread( wih , wsize , Iunits * Hunits , fi );
fread( who , wsize , Hunits * Ounits , fi );
fread( shikiih , wsize , Hunits , fi );
fread( shikiio , wsize , Ounits , fi );
fclose(fi);
}
/* フォワードプロパゲーション */
void foward_propagation(){
int i,j;
double sum;
for( i = 0 ; i < Hunits ; i++ ){
sum = 0;
for( j = 0 ; j < Iunits ; j++ ){
sum += wih[i][j] * iout[j];
}
old_em[i] = em[i];
em[i] = km * old_em[i] + sum;
old_zm[i] = zm[i];
old_hout[i] = hout[i];
zm[i] = kr * zm[i] - al * old_hout[i];
hout[i] = fout( em[i] + zm[i] + shikiih[i] );
}
for( i = 0 ; i < Ounits ; i++ ){
sum = 0;
for( j = 0 ; j < Hunits ; j++ ){
sum += who[i][j] * hout[j];
}
oout[i] = sum + shikiio[i];
}
}
double fl( double x ){
return( -log(x)/(M_LN2 * 5) +1 );
}
double lenseik( double len ){
if( len <= ( fl(12) - fl(16) )/2 + fl(16) ){
return( fl(16) );
}else if( len <= ( fl(8)-fl(12) )/2 + fl(12) ){
return( fl(12) );
}else if( len <= ( fl(6) - fl(8) )/2 + fl(8) ){
return( fl(8) );
}else if( len <= ( fl(4) - fl(6) )/2 + fl(6) ){
return( fl(6) );
}else if( len <= ( fl(3) - fl(4) )/2 + fl(4) ){
return( fl(4) );
}else if( len <= ( fl(2) - fl(3) )/2 + fl(3) ){
return( fl(3) );
}else if( len <= ( fl(1.5) - fl(2) )/2 + fl(2) ){
return( fl(2) );
}else if( len <= ( 1 - fl(1.5) )/2 + fl(1.5) ){
return( fl(1.5) );
}else if( len <= 1 ){
return(1);
}
}
double pitseik(double pit){
int p;
pit *= 40.0;
p = rd(pit);
return( (double)p/40 );
}
int rd( double a ){
char buf[10],*s;
int b;
sprintf(buf, "%lf", a);
s = strchr(buf, '.');
if( s == NULL ) return( (int)a );
s++;
if( *s-'0'<4 ) b = a;
else b = a+1;
return(b);
}
main( int argc, char *argv[] ){
int i,j,k;
int n;
char name[64],buf[256];
FILE *fp;
if( argc != 7 ){
fprintf(stderr, "usage: pout filename n nin km kr al\n");
exit(1);
}
n = atoi( argv[2] );
iunits = atoi( argv[3] )*2;
load_prm( argv[1] );
km = atof( argv[4] );
kr = atof( argv[5] );
al = atof( argv[6] );
i = 0;
while( fscanf(stdin, "%lf %lf", &ts[i], &ts[i+1]) == 2 )
i += 2;
i = i - Iunits;
for( j = i , k = 0 ; j < i + Iunits ; j += 2 ){
iout[k] = ts[j];
iout[k+1] = ts[j+1];
k += 2;
}
/* ファイルの作成 */
sprintf(name,"Km%0.5f_Kr%0.5f_A%0.5f.data",km,kr,al);
fp = fopen(name,"w");
if( fp == NULL ){
fprintf(stderr,"error\n");
exit(1);
}
for( i = 0 ; i < n ; i++ ){
foward_propagation();
oout[0] = lenseik( oout[0] );
oout[1] = pitseik( oout[1] );
for( j = 0 ; j < Iunits - 2 ; j += 2 ){
iout[j] = iout[j+2];
iout[j+1] = iout[j+3];
}
iout[j] = oout[0];
iout[j+1] = oout[1];
/* ファイルに出力 */
fprintf(fp,"%lf %lf\n", oout[0], oout[1]);
}
fclose(fp);
}