Rev 289 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "unit.h"
#include "qube.h"
#include <cstdio>
/**
* @brief Fire the unit
* @param q the qube this unit belongs to
* @param me
*/
void unit::fire ( qube * q, int me, float val )
{
int qx, qy, qz;
n_to_xyz ( me, qx, qy, qz, QUBE_DIM );
printf("Firing: %f from %d\n",val,me);
for ( int i = 0; i < SYNS_PER_UNIT; i++ ) {
int sx, sy, sz;
n_to_xyz ( i, sx, sy, sz, SYN_DIM );
int dx, dy, dz;
dx = qx + sx - SYN_DIM / 2;
dy = qy + sy - SYN_DIM / 2;
dz = qz + sz - SYN_DIM / 2;
q->fire_hub ( i, dx, dy, dz, val );
}
}
/**
* @brief
* @param qube Qube
* @return
*/
int unit::run ( class qube * qube, int me )
{
int ret;
float fsum = 0;
mtx.lock();
if ( sum > 0.7 ) {
fsum = sum;
sum = 0;
// printf("%f\n",sum);
adjust ( 0 );
ret = 1;
} else {
ret = 0;
}
mtx.unlock();
if ( fsum )
fire ( qube, me, fsum );
return ret;
}
/**
* @brief Funtion to receive an impulse
* @param from From where thim impulse comes
* @param val Value
*/
void unit::receive ( int from, float val )
{
mtx.lock();
weight_t w = syns[from];
sum += w * val;
syns[from] = w + ( 1.0 - w ) / ( WSTEP * val ) * 2;
// adjust ( 0 );
mtx.unlock();
}
/**
* @brief
* @param from
*/
void unit::adjust ( int from )
{
for ( int i = 0; i < SYNS_PER_UNIT; i++ ) {
weight_t w = syns[i];
syns[i] = w - w / WSTEP;
/* if (i==from){
val = (1.0-val)/10000.0+val;
}
else{
val = val - val/10000.0;
}
syns[i]=val;
*/
}
}