#include <stdio.h>
#include <math.h>
#include <mikenet/simulator.h>

#include "model.h"

#include "simconfig.h"

Net *reading,*hearing;
Group *input,*hidden,*output,*phohid,*bias;
Connections *c1,*c2,*c3,*c4=NULL,*c5=NULL,*c6,*c7,*c8,*c9;
ExampleSet *reading_examples,*hearing_examples;

build_model()
{
  float range;
  int i;
  /* build a network, with SAMPLES number of time ticks */
  reading=create_net(SAMPLES);
  reading->integrationConstant=(float)SECONDS/(float)SAMPLES;
  hearing=create_net(5);
  hearing->integrationConstant=(float)SECONDS/(float)SAMPLES;

  default_errorComputation=CROSS_ENTROPY_ERROR;

  default_tai=1;

  default_errorRamp=RAMP_ERROR;

  /* learning rate */
  default_activationType=LOGISTIC_ACTIVATION;

  default_errorRadius=0.1;

  /* create our groups.  
     format is: name, num of units,  ticks */
  input=init_group("Ortho",ORTHO_FEATURES,SAMPLES);
  hidden = init_group("Hidden",100,SAMPLES);
  output=init_group("Phono",PHO_SLOTS*PHO_FEATURES,SAMPLES);
  phohid=init_group("PhoHid",20,SAMPLES);
  bias = init_bias(1.0,SAMPLES);

  /* now add our groups to the network object */
  bind_group_to_net(reading,input);
  bind_group_to_net(reading,output);
  bind_group_to_net(reading,hidden);
  bind_group_to_net(reading,phohid);
  bind_group_to_net(reading,bias);

  bind_group_to_net(hearing,bias);
  bind_group_to_net(hearing,phohid);
  bind_group_to_net(hearing,output);
  

  /* now connect our groups, instantiating
     connection objects c1 through c4 */
  c1=connect_groups(input,hidden);
  c2=connect_groups(hidden,output);
  c3=connect_groups(bias,output);
  c4=connect_groups(bias,hidden);
  c6=connect_groups(output,output);
  c7=connect_groups(output,phohid);
  c8=connect_groups(phohid,output);
  c9=connect_groups(bias,phohid);


  bind_connection_to_net(hearing,c6);
  bind_connection_to_net(hearing,c7);
  bind_connection_to_net(hearing,c8);
  bind_connection_to_net(hearing,c3);
  bind_connection_to_net(hearing,c9);

  /* add connections to our network */
  bind_connection_to_net(reading,c1);
  bind_connection_to_net(reading,c2);
  bind_connection_to_net(reading,c3);
  bind_connection_to_net(reading,c4);
  bind_connection_to_net(reading,c6);
  bind_connection_to_net(reading,c7);
  bind_connection_to_net(reading,c8);
  bind_connection_to_net(reading,c9);

  /* randomize the weights in the connection objects.
     2nd argument is weight range. */
  range=0.1;
  randomize_connections(c1,range);
  randomize_connections(c2,range);
  randomize_connections(c3,range);
  randomize_connections(c4,range);
  randomize_connections(c6,range);
  randomize_connections(c7,range);
  randomize_connections(c8,range);
  randomize_connections(c9,range);

  for(i=0;i<hearing->numConnections;i++)
    hearing->connections[i]->epsilon=default_epsilon/10.0;
}

