// three ints void GetTiles(int tiles[],int nt,int memory,float floats[],int nf,int h1,int h2,int h3) { i_tmp_arr[0]=h1; i_tmp_arr[1]=h2; i_tmp_arr[2]=h3; GetTiles(tiles,nt,memory,floats,nf,i_tmp_arr,3); }
void Button::Update(float dt) { if(isInit == false) { GetTiles(); } Tile *aboveTile = System::stateManager->GetLevel()->GetTile(x,y + 1); if(aboveTile->solid == true && active == false) { active = true; for(auto it = tiles.begin(); it != tiles.end(); ++it) { Tile &curTile = *it; Tile *tile = System::stateManager->GetLevel()->GetTile(curTile.x,curTile.y); tile->data = curTile.data != TILE_AIR ? TILE_AIR : TILE_SOLID; tile->solid = curTile.data != TILE_AIR ? false : true; } } if(aboveTile->solid == false && active == true) { active = false; for(auto it = tiles.begin(); it != tiles.end(); ++it) { Tile &curTile = *it; Tile *tile = System::stateManager->GetLevel()->GetTile(curTile.x,curTile.y); tile->data = curTile.data != TILE_AIR ? curTile.data : TILE_AIR; tile->solid = curTile.data != TILE_AIR ? curTile.solid : false; } } }
void GetTiles1(int tiles[],int nt,collision_table *ct,float f1,int h1,int h2) { f_tmp_arr[0]=f1; i_tmp_arr[0]=h1; i_tmp_arr[1]=h2; GetTiles(tiles,nt,ct,f_tmp_arr,1,i_tmp_arr,2); }
// one float, two ints void GetTiles1(int tiles[],int nt,int memory,float f1,int h1,int h2) { f_tmp_arr[0]=f1; i_tmp_arr[0]=h1; i_tmp_arr[1]=h2; GetTiles(tiles,nt,memory,f_tmp_arr,1,i_tmp_arr,2); }
// two floats, one int void GetTiles2(int tiles[],int nt,int memory,float f1,float f2,int h1) { f_tmp_arr[0]=f1; f_tmp_arr[1]=f2; i_tmp_arr[0]=h1; GetTiles(tiles,nt,memory,f_tmp_arr,2,i_tmp_arr,1); }
void GetTiles2(int tiles[],int nt,collision_table *ct,float f1,float f2,int h1) { f_tmp_arr[0]=f1; f_tmp_arr[1]=f2; i_tmp_arr[0]=h1; GetTiles(tiles,nt,ct,f_tmp_arr,2,i_tmp_arr,1); }
//Train CMAC on current input towards given target void CMAC::updateOR(double target) { //Number of distinct tables int numDistinctTables = numFloatInputs / tableDimensionality; //Populate tiles array with tile indices for(int i=0; i<numDistinctTables; i++){ intInputs[1] = i; int begin = (numTilings / numDistinctTables) * i; GetTiles(&tiles[begin], (numTilings / numDistinctTables), memorySize, &floatInputs[i], tableDimensionality, intInputs, numIntInputs); } //Calculate the sum of all indexed tiles double pred = 0; for(int i=0; i<numTilings; i++){ pred += u[tiles[i]]; } //Train CMAC memory cells for(int i=0; i<numTilings; i++){ u[tiles[i]] += ((alpha / numTilings) * (target - pred)); } }
void GetTiles(int tiles[],int nt,collision_table *ct,float floats[],int nf,int h1,int h2,int h3) { i_tmp_arr[0]=h1; i_tmp_arr[1]=h2; i_tmp_arr[2]=h3; GetTiles(tiles,nt,ct,floats,nf,i_tmp_arr,3); }
// two floats, three ints void GetTiles2(int tiles[],int nt,int memory,float f1,float f2,int h1,int h2,int h3) { f_tmp_arr[0]=f1; f_tmp_arr[1]=f2; i_tmp_arr[0]=h1; i_tmp_arr[1]=h2; i_tmp_arr[2]=h3; GetTiles(tiles,nt,memory,f_tmp_arr,2,i_tmp_arr,3); }
//Predict target for current input vector double CMAC::predict() { //Populate tiles array with tile indices GetTiles(tiles, numTilings, memorySize, floatInputs, numFloatInputs, intInputs, numIntInputs); //Calculate the sum of all indexed tiles double sum = 0; for(int i=0; i<numTilings; i++){ sum += u[tiles[i]]; } //Return the sum return sum; }
//Train CMAC on current input towards given target void CMAC::update(double target) { //Populate tiles array with tile indices GetTiles(tiles, numTilings, memorySize, floatInputs, numFloatInputs, intInputs, numIntInputs); //Calculate the sum of all indexed tiles double pred = 0; for(int i=0; i<numTilings; i++){ pred += u[tiles[i]]; } //Train CMAC memory cells for(int i=0; i<numTilings; i++){ u[tiles[i]] += ((alpha / numTilings) * (target - pred)); } }
//Predict target for current input vector double CMAC::predictOR() { //Number of distinct tables int numDistinctTables = numFloatInputs / tableDimensionality; //Populate tiles array with tile indices for(int i=0; i<numDistinctTables; i++){ intInputs[1] = i; int begin = (numTilings / numDistinctTables) * i; GetTiles(&tiles[begin], (numTilings / numDistinctTables), memorySize, &floatInputs[i], tableDimensionality, intInputs, numIntInputs); } //Calculate the sum of all indexed tiles double sum = 0; for(int i=0; i<numTilings; i++){ sum += u[tiles[i]]; } //Return the sum return sum; }
// No ints void GetTiles(int tiles[],int nt,int memory,float floats[],int nf) { GetTiles(tiles,nt,memory,floats,nf,i_tmp_arr,0); }
void GetTiles(int tiles[],int nt,collision_table *ct,float floats[],int nf) { GetTiles(tiles,nt,ct,floats,nf,i_tmp_arr,0); }
//one int void GetTiles(int tiles[],int nt,int memory,float floats[],int nf,int h1) { i_tmp_arr[0]=h1; GetTiles(tiles,nt,memory,floats,nf,i_tmp_arr,1); }
void GetTiles(IntArr* pv_tiles,int nt,int memory,float floats[],int nf,int h1, unsigned int offset) { i_tmp_arr[0]=h1; GetTiles(pv_tiles,nt,memory,floats,nf,i_tmp_arr,1, offset); }
void GetTiles(int tiles[],int nt,collision_table *ct,float floats[],int nf,int h1) { i_tmp_arr[0]=h1; GetTiles(tiles,nt,ct,floats,nf,i_tmp_arr,1); }
void GetTiles1(int tiles[],int nt,collision_table *ct,float f1) { f_tmp_arr[0]=f1; GetTiles(tiles,nt,ct,f_tmp_arr,1,i_tmp_arr,0); }
// one float, No ints void GetTiles1(int tiles[],int nt,int memory,float f1) { f_tmp_arr[0]=f1; GetTiles(tiles,nt,memory,f_tmp_arr,1,i_tmp_arr,0); }