{
/* **** 変更部分 ************************************* */
/* 各素子数の宣言 */
/* 教師信号あり */
#define Tunit 2 /* 音の長さ・高さが与えられる層 */
#define Lunit 0 /* 過去の音が与えられる層(偶数個用意) */
#define Cunit 0 /* ランダムな値が与えられる層 */
/* 教師信号なし */
#define Nunit 23 /* 内部記憶層 */
#define Eunit 0 /* 文脈層 */
#define Filenumber 11 /* ファイル番号 */
#define Inunit ( Tunit + Lunit + Cunit + Nunit + Eunit ) /* 入力層 */
#define Midunit 15 /* 中間層 */
#define Outunit ( Tunit + Lunit + Cunit + Nunit + Eunit ) /* 出力層 */
/* 共通フラグ */
int Quant = 0; /* 量子化するか ( 0 : しない <> それ以外 : する ) */
int Flag_zero = 0; /* 学習 : 第一音目に対する内部記憶層を0にするか
想起 : 内部記憶層部分に0を入れて想起するか */
int Flag_Elman = 0; /* 文脈層を用いた場合のフラグ */
int Flag_NNaibu = 0; /* 内部記憶層の内部記憶層を用いた場合のフラグ */
#ifdef STUDY
/* 学習のフラグ */
int Flag_noize = 0; /* 学習時に入力にノイズを与える */
int Flag_gosaplotnew = 0; /* 誤差信号の大きさを測定する */
int Flag_backpro = 3; /* バックプロパゲーションの遅れ回数(default = 3) */
/* 成功のためのフラグ */
int Flag_continue = 1; /* 学習を続けるかどうかのフラグ */
int Flag_success = 0; /* 学習が成功した場合のフラグ */
#endif
#ifdef RECALL
/* 想起のフラグ */
int Flag_random = 0; /* 内部記憶部分にランダムな値を入れて想起 */
int Flag_inc = 0; /* 音の長さ・高さにノイズを入れる */
int Flag_inout = 0; /* 内部記憶部分で全て0や一つだけ1.0の設定をする */
int Flag_teachcut = 0; /* 音の長さ・高さ部分を入れずに想起 */
int Flag_view = 1; /* 出力結果を画面表示する */
int Flag_weightplot = 1; /* 結合荷重 - 結合荷重特性を測定する */
int Flag_weightsearch = 0; /* 結合荷重の積を測定する */
int Flag_weightplot02 = 1; /* 出力値 - 結合荷重特性を測定する */
int Flag_caos = 0; /* カオスニューロンを用いた想起を行なう */
int Set_zero = 0; /* 部分的に0を入れるための変数 */
int Set_inout = 0; /* 一箇所だけ1.0を入れる */
#endif
/***** ここまで **************************************/
/***** 共通変数 **************************************/
#define TL ( Tunit + Lunit )
#define TLC ( Tunit + Lunit + Cunit )
#define TLCN ( Tunit + Lunit + Cunit + Nunit )
/* 時系列の個数 */
#define Smax 256
#define Time 40
/* 量子化レベル */
#define Kaisou ( 10 + 1 ) /* レベル数 */
#define Zoubun 0.1 /* 1レベルの値 */
#define Seed 1 /* 乱数の種 */
#define Bai 1 /* Etaの倍数(内部記憶部分だけ学習を強化させる) */
#define Gakusyu 10000 /* 基本学習回数 */
#define Saidai 1000000 /* 最大学習回数 */
#define Souki 2000 /* 想起回数 */
/* ランダムな値を設定する */
#define Lhigh 1.0 /* 内部記憶の出力値 */
#define Llow 0.0
#define qrand() ( drand48() * ( Lhigh - Llow ) + Llow )
#define Nhigh 0.05 /* 音の長さ */
#define Nlow -0.05
#define lenrand() ( drand48() * ( Nhigh - Nlow ) + Nlow )
#define Hhigh 0.00625 /* 音の高さ */
#define Hlow -0.00625
#define heirand() ( drand48() * ( Hhigh - Hlow ) + Hlow )
#define fsig( in ) ( 1 / ( 1 + exp( -( in ))) ) /* シグモイド関数 */
#define frev( in ) ( log( ( in ) / ( in - 1 ) ) ) /* 音の長さの関数 */
/* 結合荷重 */
double wim[Midunit][Inunit]; /* 入力層〜中間層 */
double wmo[Outunit][Midunit]; /* 中間層〜出力層 */
/* 閾値 */
double sikiiim[Midunit]; /* 中間層素子 */
double sikiimo[Outunit]; /* 出力層素子 */
/* 各入出力値 */
double inout[Inunit][Time]; /* 入力層へ入力される */
double midout[Midunit]; /* 中間層へ入力される */
double outout[Outunit]; /* 出力層から出力される */
int tsmax; /* 実際の時系列の長さ */
int k; /* 計算回数の変数 */
int kk; /* 計算回数の最大 */
int t; /* 現在の時間の変数 */
int r; /* 現在の計算回数の合計 */
double inkeep[Inunit][Time]; /* 実際に教師信号が入る */
double outkeep[Outunit]; /* 出力値を保持する */
char *Data = "saita"; /* 教師信号ファイル名 */
char *fi_weight = NULL;
char fiplot[Smax];
char fisong[Smax];
char finaibu[Smax];
FILE *fpplot;
FILE *fpsong;
FILE *fpnaibu;
/***** 学習に使う変数 **************************************/
#ifdef STUDY
double Eta = 0.5; /* 学習係数 */
double Alpha = 0.005; /* 加速項 */
double Eta2; /* 内部記憶部分に与えられる学習係数 */
/* 各層重みの変化分 */
double dwim[Midunit][Inunit];
double dwmo[Outunit][Midunit];
/* 伝搬される誤差信号 */
double dim[Midunit];
double dmo[Outunit];
/* しきい値の変化分 */
double dsikiiim[Midunit];
double dsikiimo[Outunit];
/* 結合荷重をランダムで決める */
#define Rhigh 0.30
#define Rlow -0.30
#define urand() ( drand48() * ( Rhigh - Rlow ) + Rlow )
double midkeep[Midunit]; /* t-1 の中間層への入力 */
double midkeep2[Midunit]; /* t-2 の中間層への入力 */
double midkeep3[Midunit]; /* t-3 の中間層への入力 */
double outkept[Outunit][Time];
double outkeep2[Outunit];
double outkeep3[Outunit];
double gosa[Outunit][Time];
double kekka[Outunit];
double cyclekeep[Inunit][Time];
double noisein[Tunit][Time];
double gosakeep[Tunit];
double gosasumcloseteach , gosasumcloseall;
double gosasumopenteach , gosasumopenall;
double dmoteach[TLC];
double dmonaibu[Nunit];
double dimlate[Midunit] , dimlate2[Midunit]; /* 誤差信号 */
double dimget[Midunit];
int chsuccess,chfault;
FILE *fi;
FILE *fprecall;
FILE *fpin;
FILE *fpnaibucheck;
FILE *fpnaibu2,*fpnaibu4;
FILE *fpout;
FILE *fpfirst;
FILE *fpsumplot;
FILE *fpdimplot;
char figosa[Smax];
char firecall[Smax];
char fiin[Smax];
char finaibucheck[Smax];
char finaibu2[Smax],finaibu4[Smax];
char fiout[Smax];
char fifirst[Smax];
char fisumplot[Smax];
char fidimplot[Smax];
#endif
/****** 想起に使う変数 *************************************/
#ifdef RECALL
double song[Tunit][Time];
double songkeep[Tunit][Time];
double Noize;
double em[Midunit] , old_em[Midunit];
double zm[Midunit] , old_zm[Midunit];
double km , kr , al;
double old_midout[Midunit];
int over , under;
char fiweight_tm[Smax];
char fiweight_nm[Smax];
char fiweight_mt[Smax];
char fiweight_mn[Smax];
FILE *fpweight_tm;
FILE *fpweight_nm;
FILE *fpweight_mt;
FILE *fpweight_mn;
char fiweight02_tm[Smax];
char fiweight02_nm[Smax];
char fiweight02_mt[Smax];
char fiweight02_mn[Smax];
FILE *fpweight02_tm;
FILE *fpweight02_nm;
FILE *fpweight02_mt;
FILE *fpweight02_mn;
#endif