本质上来说,智能合约是一段程序,它以计算机指令的方式实现了传统合约的自动化处理。智能合约程序不只是一个可以自动执行的计算机程序,它本身就是一个系统参与者,对接收到的信息进行回应,可以接收和储存价值,也可以向外发送信息和价值。
int TensorStatistic::_computeThreshold(const std::vector&distribution){
const int targetBinNums=128;
int threshold=targetBinNums;
if(mThresholdMethod==THRESHOLD_KL){
float minKLDivergence=10000.0f;
float afterThresholdSum=0.0f;
//统计超过128以后(超过阈值)的个数afterThresholdSum
std::for_each(distribution.begin()+targetBinNums,distribution.end(),
&{afterThresholdSum+=n;});
for(int i=targetBinNums;i<mBinNumber;++i){//从128到2048,找到新的threshold
std::vectorquantizedDistribution(targetBinNums);
std::vectorcandidateDistribution(i);
std::vectorexpandedDistribution(i);
//0~i-1的分布情况,之后的数据都列加到第i-1上,做饱和映射
std::copy(distribution.begin(),distribution.begin()+i,candidateDistribution.begin());
candidateDistribution[i-1]+=afterThresholdSum;
afterThresholdSum-=distribution;
//大小i,重新映射到targetBinNums时的bin间隔
const float binInterval=(float)i/(float)targetBinNums;
//merge i bins to target bins
//[0,j]之间的分布,合并到[0,targetBinNums]大小的空间中,并保存在quantizedDistribution
for(int j=0;j<targetBinNums;++j){
//[start,end]是映射到128长度的直方图中第j个bin所对应的数据
const float start=j*binInterval;
const float end=start+binInterval;
//将超出左右范围的数据,按照距离两端距离远近作为系数,累加到当前bin中
const int leftUpper=static_cast(std::ceil(start));
if(leftUpper>start){案例及详细:MrsFu123
const float leftScale=leftUpper-start;
quantizedDistribution[j]+=leftScale*distribution[leftUpper-1];
}
const int rightLower=static_cast(std::floor(end));
if(rightLower<end){
const float rightScale=end-rightLower;
quantizedDistribution[j]+=rightScale*distribution[rightLower];
}
//统计并累加在范围内的数据
std::for_each(distribution.begin()+leftUpper,distribution.begin()+rightLower,
&{quantizedDistribution[j]+=n;});
}