-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMergeFeature.cpp
73 lines (61 loc) · 1.8 KB
/
MergeFeature.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "MergeFeature.h"
// 0000 + 00000 + 00000 , totally 14 bits
// blankCount mergeCount layerCount
//
MergeFeature::MergeFeature(double weight):
TileTuple(weight)
{
score_table_ = new double[16384];
memset(score_table_, 0, sizeof(double) * 16384);
}
MergeFeature::~MergeFeature()
{
delete[] score_table_;
}
unsigned long long MergeFeature::get_index(const unsigned long long& game_board) const
{
int tileArray[16];
int shiftNum;
unsigned long long mask = 0xf000000000000000;
int count = 0;
for(shiftNum = 60 ;shiftNum >= 0;shiftNum-=4,mask=mask>>4)
tileArray[count++] = static_cast<int>((game_board&mask)>>shiftNum);
int featureIndex;
int layerDifferent;
int blankTileCount = 0;
int mergeCount = 0;
int layerMergeCount = 0;
for(int i=0;i<16;i++)
{
if(tileArray[i]==0)
{
blankTileCount++;
continue;
}
if((tileArray[i] == tileArray[i+1]) && (i%4!=3))
mergeCount++;
if((tileArray[i] == tileArray[i+4]) && (i<12))
mergeCount++;
layerDifferent = abs(tileArray[i]-tileArray[i+1]);
if((layerDifferent==1)&& (i%4!=3) && (tileArray[i+1]!=0))
layerMergeCount++;
layerDifferent = abs(tileArray[i]-tileArray[i+4]);
if((layerDifferent==1)&& (i<12) && (tileArray[i+4]!=0) )
layerMergeCount++;
}
featureIndex = (blankTileCount<<10)| (mergeCount<<5)|layerMergeCount;
return featureIndex;
}
/*int LargeTileFeature::get_isomorphic_indexes(const board_t& original_index, board_t* isomorphic_indexes) const
{
isomorphic_indexes[0] = original_index;
return 1;
}*/
void MergeFeature::save_tuple(ofstream& fout) const
{
fout.write((char*)score_table_, sizeof(double) * 16384);
}
void MergeFeature::load_tuple(ifstream& fin)
{
fin.read((char*)score_table_, sizeof(double) * 16384);
}