Subversion Repositories PlanixRsrch.SVN

Rev

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;
        */
    }
}