-
Notifications
You must be signed in to change notification settings - Fork 0
/
HEM3_ASO.h
65 lines (51 loc) · 3.41 KB
/
HEM3_ASO.h
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
#pragma once
#include <algorithm>
#include <bitset>
#include <cstring>
#include <unordered_set>
#include "Util.h"
#include "constant.h"
#include "ThreadPool.h"
// Virtual/Real Attribute Subset/Class Mode with OR operation result precomputed optimization
// 参考自 HEM5_AS.h/cpp
class HEM3_ASO
{
private:
int numSub; // 插入的订阅个数
int numDimension; // 内容空间的维度
int buckStep; // 每个桶负责的范围大小
int numBits; // 位集的个数
int numAttrGroup; // 属性组数
int attrGroupSize; // 每个属性组负责的属性个数
vector<vector<vector<Combo>>> data[2]; // 0: 低值端, 1:高值端
vector<vector<bitset<subs>>> bits; // 每个属性上高低两端只需要存一份位集了!
vector<vector<int>> fix[2]; // 0 代表 low 上的后缀和,1是 high 上的前缀和,用于计算任务量
// vector<bitset<subs>> fullBits; // 全覆盖的 bits 单独存,因为只要存一次 // deprecated,高低端位集都只需要一份了
vector<bitset<subs>> attrGroupBits; // 每个实 or 虚属性组对应一个bitset
int **endBucket[2]; // 每个维度上,落入这个 bucket 的事件在遍历标记时终止于哪一个 bucket,只使用其中一份(这里用 LVE)
int **bitsID; // 每个维度上,落入这个 bucket 的事件用到的 bits 数组的下标,只需要存一份了
// bool **doubleReverse[2]; // 为 true 时是把 1 标成 0 // deprecated,取高左、低右端位集做或运算,不支持再反转了,即高端必须往事件桶左端标记,低端必须往事件桶右端标记
ThreadPool threadPool; // 每个维度上不需要做或运算了,负载更小了
public:
int numBucket;
double compareTime = 0.0; // 所有维度上事件值落入的那个cell里逐个精确比较的时间
double markTime = 0.0; // 遍历完全不匹配桶的标记时间
double orTime = 0.0; // 维度之间做或运算的时间
double bitTime = 0.0; // 遍历结果数组获取匹配个数所花的时间
double mergeTime = 0.0; // 合并每个并行线程部分匹配结果的时间
HEM3_ASO(int);
~HEM3_ASO();
void insert_VASO(const IntervalSub &); // 没有bitset时的插入算法
void insert_RASO(const IntervalSub &); // 没有bitset时的插入算法
void initBits(); // 初始化 bits 数组 / 重新初始化 bits 数组以负载均衡,可以看成一个训练索引的过程
void insert_online_VASO(const IntervalSub &); // 构建好订阅集后的在线插入订阅算法, 虚拟属性组版本
void insert_online_RASO(const IntervalSub &); // 构建好订阅集后的在线插入订阅算法, 实际属性组版本
bool deleteSubscription_VASO(const IntervalSub &);
bool deleteSubscription_RASO(const IntervalSub &);
void match_VASO(const Pub &pub, int &matchSubs);
void match_RASO(const Pub &pub, int &matchSubs);
void match_RASO_parallel(const Pub &pub, int &matchSubs);
int calMemory(); // 计算占用内存大小
void printRelation(int dimension_i); // 打印映射关系
vector<int> calMarkNumForBuckets(); // 计算事件落到每个属性的同一个桶里时需要标记和比较的谓词个数
};