1、Abstract

SC(Stochastic Computing)对于比特翻转表现出强大的容错能力(The tolerance to bit-flip errors)。更重要的是,它相比于传统的二进制编码方式计算,能够利用更简单的电路实现更复杂的算术功能。在这篇论文中,提出了一种特殊的设计高性能随机计算电路的方法。这种方法是基于一种启发式的广度优点遍历搜索算法在解空间中确定一个最优解进而使得电路满足一些要求。

2、Introduction

对于SC的基本介绍可以查看我的这篇博客:https://blog.csdn.net/qq_34037046/article/details/84306846
中的Introduction部分,如同其中提到的:我们首先将目标函数转换为可以通过所提出的设计实现的特殊形式。 但是,布尔函数有很多选择,可以在随机域中实现转换后的函数。而这正是随机计算电路设计的难处,即能够实现目标函数的解空间是很大的,我们需要找出一个最优的解(即:如何 assign the cubes(product terms))来满足一些需求:最低的成本(最少的逻辑门器件)。但是上面博客中也提出了一种寻找满足要求的Cube Assignment方法。即使这种方法很快的确定了解,但是它缺少了在解空间Search的过程,即它无法确定在解空间中到底有没有比它更优的解。
在这篇论文中,主要的贡献:
1、提出了一种新的方法利用迭代的方法确定Cube构造目标布尔函数;
2、提出了一种启发式广度优先遍历搜索算法来寻找更好的Cube 选择方案;
3、将上述算法拓展,从而可以应用到多变量多项式中。
这篇文章相对于以前文章中提出的方法主要的改进:
1、提出了广度优先遍历算法,更加节省时间
2、不仅适用于单变量任意多项式,还适用于任意多变量多项式;
3、改进了这个算法,不仅适用于二级电路,也适用于多级电路。

3、Background on Synthesis Stochastic Circuits

我们提出的方法是基于一个一般形式的随机电路。
A、一般随机计算电路和它的表达式
一个一般形式的随机计算电路如下:

如上图,可以将输入分成k+1个部分。这些个输入都是相互独立的。可以注意到第“k+1”个部分的输入Y1,...,YmY_{1},...,Y_{m}Y1​,...,Ym​的所表示的概率值都是12\frac{1}{2}21​,这些部分是为了提供多项式的各项系数。在之前的研究中,这些0.5的随机数由伪随机比特源产生(例如:LFSR)以及利用另外的附加电路产生别的概率值,例如:比较器。通常将Y1,...,YmY_{1},...,Y_{m}Y1​,...,Ym​作为随机数的输入,这样消除了随机数据路径常数概率产生器的界限,也因此有了更大的优化空间(这句话我觉得可以这么理解:这就像一个齐次线性方程组求解,然后原先这K+1个部分的输入是完全没有关联的,我们可以看成这个向量空间的维度是所有输入个数的和,然后如果我们选择将Y部分输入作为产生X部分的输入源,那么就相当于在X与Y之间建立了一种关系,使得矩阵的秩减少,从而解空间的维度增加,使得优化空间更大)。
另外,mmm的选择很重要。它能够决定量化误差的大小,mmm越大,量化误差越小。这个事先一般会提供需要的精度,这部分见博客:
https://blog.csdn.net/qq_34037046/article/details/84306846
中的Part4 A有描述。
为了方便描述,接下来做出两个定义:
Definition1:Forany0≤s1≤d1,...,0≤sk≤dk,wedefinetheset:M(s1,...,sk)={a1,1,...,a1,d1,....,ak,1,....,ak,dk,b1,...,bm∈{0,1}m+n:∑j=1diai,j=si,foralli=1,...,k}Definition\ 1:\ For\ any\ 0\le s_{1}\le d_{1},...,\ 0\le s_{k}\le d_{k},\\ we\ define\ the\ set:\\ M(s_{1},...,s_{k})=\{a_{1,1},...,a_{1,d_{1}},....,a_{k,1},....,a_{k,d_{k}},b_{1},...,b_{m}\in\{0,1\}^{m+n}\\ :\sum_{j=1}^{d_{i}}a_{i,j}=s_{i},\ for\ all\ i=1,...,k\}Definition 1: For any 0≤s1​≤d1​,..., 0≤sk​≤dk​,we define the set:M(s1​,...,sk​)={a1,1​,...,a1,d1​​,....,ak,1​,....,ak,dk​​,b1​,...,bm​∈{0,1}m+n:j=1∑di​​ai,j​=si​, for all i=1,...,k}
Definition2:ForaBooleanfunctionB,itson−set,denotedasOn(B),isthesetofinputvectorsthatlettheBooleanfunctionevaluteto1.Definition\ 2:\ For\ a\ Boolean\ function\ B,\ its\ on-set,\ denoted\ as\ On(B),\ is\ the\ set\ of\ input\ vectors\ that\ let\ the\ Boolean\ function\ evalute\ to\ 1.Definition 2: For a Boolean function B, its on−set, denoted as On(B), is the set of input vectors that let the Boolean function evalute to 1.
我们将输入写成向量形式:(a1,1,...,ak,dk,b1,...,bm)∈{0,1}n+m(a_{1,1},...,a_{k,d_{k}},b_{1},...,b_{m})\in\{0,1\}^{n+m}(a1,1​,...,ak,dk​​,b1​,...,bm​)∈{0,1}n+m,同样,(a1,1,...,ak,dk,b1,...,bm)∈M(s1,...,sk)(a_{1,1},...,a_{k,d_{k}},b_{1},...,b_{m})\in M(s_{1},...,s_{k})(a1,1​,...,ak,dk​​,b1​,...,bm​)∈M(s1​,...,sk​)。任意输入向量(X1,1,...,Xk,dk,Y1,...,Ym)=(a1,1,...,ak,dk,b1,...,bm)(X_{1,1},...,X_{k,d_{k}},Y_{1},...,Y_{m})=(a_{1,1},...,a_{k,d_{k}},b_{1},...,b_{m})(X1,1​,...,Xk,dk​​,Y1​,...,Ym​)=(a1,1​,...,ak,dk​​,b1​,...,bm​)的概率是:
∏i=1k∏j=1diPr(Xi,j=ai,j).∏i=1mP(Yi=bi)⇒12m∏i=1kxisi(1−xi)di−si\prod_{i=1}^{k}\prod_{j=1}^{d_{i}}P_{r}(X_{i,j}=a_{i,j}).\prod_{i=1}^{m}P(Y_{i}=b_{i})\\ \Rightarrow\frac{1}{2^{m}}\prod_{i=1}^{k}x_{i}^{s_{i}}(1-x_{i})^{d_{i}-s_{i}}i=1∏k​j=1∏di​​Pr​(Xi,j​=ai,j​).i=1∏m​P(Yi​=bi​)⇒2m1​i=1∏k​xisi​​(1−xi​)di​−si​
根据上面的式子我们可以总结到:在同一个集合M(s1,...,sk)M(s_{1},...,s_{k})M(s1​,...,sk​)中的任意两个输入向量的概率是相等的。换言之,一个M(s1,...,sk)M(s_{1},...,s_{k})M(s1​,...,sk​)构造了一个等价输入向量类。这个类中含有的基数是2m∏i=1k(disi)2^{m}\prod_{i=1}^{k}\binom{d_{i}}{s_{i}}2m∏i=1k​(si​di​​)。
我们想要构造的函数实际意义是使得输出端为“1”的概率,所以:
f(x1,...,xk)=Pr(B(X1,1,...,Xk,dk,Y1,...,Ym)=1)=∑(a1,1,...,ak,dk,b1,...,bm)∈On(B)P(X1,1,...,Xk,dk,Y1,...,Ym)=(a1,1,...,ak,dk,b1,...,bm)=∑s1=0d1...∑sk=0dk∣On(B)⋂M(s1,...,sk)∣2m∏i=1kxisi(1−xi)di−sif(x_{1},...,x_{k})=Pr(B(X_{1,1},...,X_{k,d_{k}},Y_{1},...,Y_{m})=1)\\ =\sum_{(a_{1,1},...,a_{k,d_{k}},b_{1},...,b_{m})\in On(B)}{P(X_{1,1},...,X_{k,d_{k}},Y_{1},...,Y_{m})\\ =(a_{1,1},...,a_{k,d_{k}},b_{1},...,b_{m})}\\ =\sum_{s_{1}=0}^{d_{1}}...\sum_{s_{k}=0}^{d_{k}}\frac{|On(B)\bigcap M(s_{1},...,s_{k})|}{2^{m}}\prod_{i=1}^{k}x_{i}^{s_{i}}(1-x_{i})^{d_{i}-s_{i}}f(x1​,...,xk​)=Pr(B(X1,1​,...,Xk,dk​​,Y1​,...,Ym​)=1)=(a1,1​,...,ak,dk​​,b1​,...,bm​)∈On(B)∑​P(X1,1​,...,Xk,dk​​,Y1​,...,Ym​)=(a1,1​,...,ak,dk​​,b1​,...,bm​)=s1​=0∑d1​​...sk​=0∑dk​​2m∣On(B)⋂M(s1​,...,sk​)∣​i=1∏k​xisi​​(1−xi​)di​−si​

B、设计任意目标函数以及核心的优化问题
给定一个k变量(x1,...,xk)(x_{1},...,x_{k})(x1​,...,xk​)的目标函数,我们首先将它估计成一个多项式(比如利用泰勒级数展开)。只要这个多项式满足在0≤x1≤1,...,0≤xk≤10\le x_{1}\le 1,...,\ 0\le x_{k}\le 10≤x1​≤1,..., 0≤xk​≤1,我们可以利用一定的数学方法将任意多项式转变成伯恩斯坦多项式并且伯恩斯坦多项式的系数也都在[0,1]区间内,形式如下:
f1(x1,...,xk)=∑s1=0d1....∑sk=0dkαs1,...,sk∏i=1k(disi)xisi(1−xi)di−si0≤αs1,...,sk≤1f_{1}(x_{1},...,x_{k})=\sum_{s_{1}=0}^{d_{1}}....\sum_{s_{k}=0}^{d_{k}}\alpha_{s_{1},...,s_{k}}\prod_{i=1}^{k}\binom{d_{i}}{s_{i}}x_{i}^{s_{i}}(1-x_{i})^{d_{i}-s_{i}}\\ 0\le\alpha_{s_{1},...,s_{k}}\le 1f1​(x1​,...,xk​)=s1​=0∑d1​​....sk​=0∑dk​​αs1​,...,sk​​i=1∏k​(si​di​​)xisi​​(1−xi​)di​−si​0≤αs1​,...,sk​​≤1
所以我们的方法可以用来设计具有任何多项式的随机计算电路。但是如果多项式在(0,1)区间内的值域不在[0,1]内,需要进行一个仿射变换,使得它的值域落到[0,1]的范围。
forany0≤s1≤d1,....,0≤sk≤dk,G(s1,...,sk)=[αs1,...,sk.2m.∏i=1k(disi)]=∣On(B)⋂M(s1,...,s2)∣G(s1,...,sk)2m≈αs1,...,sk.∏i=1k(disi)for\ any\ 0\le s_{1}\le d_{1},....,0\le s_{k}\le d_{k},\\ G(s_{1},...,s_{k})=[\alpha_{s_{1},...,s_{k}}.2^{m}.\prod_{i=1}^{k}\binom{d_{i}}{s_{i}}]=|On(B)\bigcap M(s_{1},...,s_{2})|\\ \frac{G(s_{1},...,s_{k})}{2^{m}}\approx\alpha_{s_{1},...,s_{k}}.\prod_{i=1}^{k}\binom{d_{i}}{s_{i}}for any 0≤s1​≤d1​,....,0≤sk​≤dk​,G(s1​,...,sk​)=[αs1​,...,sk​​.2m.i=1∏k​(si​di​​)]=∣On(B)⋂M(s1​,...,s2​)∣2mG(s1​,...,sk​)​≈αs1​,...,sk​​.i=1∏k​(si​di​​)
所以最终我们的目标函数被约等于:
f2(x1,...,xk)=∑s1=0d1....∑sk=0dkG(s1,...,sk)2m∏i=1ksixisi(1−xi)di−si0≤αs1,...,sk≤1,G(s1,...,sk)∈[0,2m∏i=1k(disi)]f_{2}(x_{1},...,x_{k})=\sum_{s_{1}=0}^{d_{1}}....\sum_{s_{k}=0}^{d_{k}}\frac{G(s_{1},...,s_{k})}{2^{m}}\prod_{i=1}^{k}{s_{i}}x_{i}^{s_{i}}(1-x_{i})^{d_{i}-s_{i}}\\ 0\le\alpha_{s_{1},...,s_{k}}\le 1,\ \ \ G(s_{1},...,s_{k})\in[0,2^{m}\prod_{i=1}^{k}\binom{d_{i}}{s_{i}}]f2​(x1​,...,xk​)=s1​=0∑d1​​....sk​=0∑dk​​2mG(s1​,...,sk​)​i=1∏k​si​xisi​​(1−xi​)di​−si​0≤αs1​,...,sk​​≤1,   G(s1​,...,sk​)∈[0,2mi=1∏k​(si​di​​)]
如果有G(s1,...,sk)G(s_{1},...,s_{k})G(s1​,...,sk​)个向量(a1,1,....,ak,dk)(a_{1,1},....,a_{k,d_{k}})(a1,1​,....,ak,dk​​)使得布尔函数B等于1,那么这个布尔函数就可以实现目标函数的功能。然而,会有许多个布尔函数可供选择。我们需要设计一个最佳的布尔函数满足需求。在论文中,主要是涉及到两级的电路,可以通过计算SOP(Sum-of-product)形式的布尔函数中的字母的个数来衡量成本。

总结起来,这个优化问题可以描述成如下:
给定一个整数mmm和∏i=1k(1+di)\prod_{i=1}^{k}(1+d_{i})∏i=1k​(1+di​)个整数G(0,0,...,0),...,G(d1,d2,...,dk)G(0,0,...,0),...,G(d_{1},d_{2},...,d_{k})G(0,0,...,0),...,G(d1​,d2​,...,dk​),并且这些整数满足:0≤G(s1,....,sk)≤2m∏i=1k(disi)0\le G(s_{1},....,s_{k})\le 2^{m}\prod_{i=1}^{k}\binom{d_{i}}{s_{i}}0≤G(s1​,....,sk​)≤2m∏i=1k​(si​di​​),然后我们需要从这么多选择中根据我们得到的BCP形式的多项式得到每一个等价类(s1,...,sk)(s_{1},...,s_{k})(s1​,...,sk​)有多少个最小项即G(s1,....,sk)G(s_{1},....,s_{k})G(s1​,....,sk​)个,进而确定一个布尔函数使得满足布尔函数中“字母个数”最小的要求
为了更方便的解决这个优化问题,我们将布尔函数B(X1,1,....,Xk,dk,Y1,....,Ym)B(X_{1,1},....,X_{k,d_{k}},Y_{1},....,Y_{m})B(X1,1​,....,Xk,dk​​,Y1​,....,Ym​)看作是一个矩阵,矩阵的每一行表示一个关于输入YYY的组合,每一列表示一个关于输入XXX的组合,如下例:
B(X1,1,X1,2,X1,3,Y1,Y2)=X1,1‾Y1‾+X1,2Y1‾+X1,1‾X1,3(k=1,d1=3,m=2)B(X_{1,1},X_{1,2},X_{1,3},Y_{1},Y_{2})=\overline{X_{1,1}}\overline{Y_{1}}+X_{1,2}\overline{Y_{1}}+\overline{X_{1,1}}X_{1,3}(k=1,d_{1}=3,m=2)B(X1,1​,X1,2​,X1,3​,Y1​,Y2​)=X1,1​​Y1​​+X1,2​Y1​​+X1,1​​X1,3​(k=1,d1​=3,m=2)

为了更好的理解矩阵形式是如何表示布尔函数的,我们做出如下定义:
Forany0≤s1≤d1,....,0≤sk≤dk,wedefinethesetI(s1,....,sk)={(a1,1,...,ak,dk)∈{0,1}n:∑j=1diai,j=si,foralli=1,...,k}For\ any\ 0\le s_{1}\le d_{1},....,0\le s_{k}\le d_{k},\ we\ define\ the\ set\\ I(s_{1},....,s_{k})=\{(a_{1,1},...,a_{k,d_{k}})\in\{0,1\}^{n}:\\ \sum_{j=1}^{d_{i}}a_{i,j}=s_{i},\ for\ all\ i=1,...,k\}For any 0≤s1​≤d1​,....,0≤sk​≤dk​, we define the setI(s1​,....,sk​)={(a1,1​,...,ak,dk​​)∈{0,1}n:j=1∑di​​ai,j​=si​, for all i=1,...,k}
这个定义表示集合I(s1,...,sk)I(s_{1},...,s_{k})I(s1​,...,sk​)是指矩阵中输入集合XXX的和等于(s1,....,sk)(s_{1},....,s_{k})(s1​,....,sk​)的每一列。那么我们所需要做的就是在集合I(s1,...,sk)I(s_{1},...,s_{k})I(s1​,...,sk​)中的这些列中分配这G(s1,....,sk)G(s_{1},....,s_{k})G(s1​,....,sk​)个"1"来获得一个最优的布尔函数。
因此,总结看来,SC电路的设计与传统逻辑电路的设计是不一样的,因为传统逻辑电路在涉及到有无关项非完全描述逻辑函数在化简布尔函数的时候,不会明确要求布尔函数有多少个最小项,即多少的输入向量,因为在传统逻辑电路设计的时候有些无关项可以要可以不要。但是在SC电路设计时,由于将多项式转化成不管是BCP形式的多项式还是多变量的伯恩斯坦多项式,都会指明每一个等价类中的最小项的个数。所以这就会涉及到含约束条件的最优化问题。

4、提出通过分配“Cube”的解决方法

首先我们先针对单变量多项式的解决方案。
A、预处理
我们首先介绍一些符号和定义。
对于单变量的情况,最小项可以分成n+1n+1n+1个集合:(M(0),....,M(n))(M(0),....,M(n))(M(0),....,M(n))。然后,对于所有待分配的最小项 我们用一个向量进行表示:(V(0),....,V(n))(V(0),....,V(n))(V(0),....,V(n)),其中V(i)V(i)V(i)表示待分配的最小项中属于M(i)M(i)M(i)集合的最小项个数。我们将这个向量叫做问题向量(Problem Vector)。初始问题向量设置为(G(0),....,G(n))(G(0),....,G(n))(G(0),....,G(n))。当随着待分配的最小项逐渐被分配到on-set On(B)On(B)On(B),问题向量中的每一项都逐渐减小,直到最终问题向量变成零向量。另外,我们最重要需要利用的CubeCubeCube,也利用一个向量表示,为了和问题向量区分开来,将这个向量表示成[C(0),....,C(n)][C(0),....,C(n)][C(0),....,C(n)],长度也还是n+1n+1n+1,其中C(i)C(i)C(i)表示在一个CubeCubeCube中包含的属于 集合M(i)M(i)M(i)中的最小想的个数。需要注意的是,虽然每一个CubeCubeCube都对应一个独特的向量,但是一个独特的问题向量可能对应多个CubeCubeCube。
我们的方法就是将问题向量分解成一个个的CubeCubeCube向量。因此,我们需要研究一下CubeCubeCube向量的结构及特点:
Theorem1.:Theorem\ 1.:Theorem 1.:假设一个CubeCubeCube表示的一个含有uuu个未置反的XXX变量,ccc个置反的XXX变量以及lll个YYY变量的布尔函数,同时0≤u,c≤n,u+c≤n,0≤l≤m0\le u,c\le n,\ u+c\le n,\ 0\le l\le m0≤u,c≤n, u+c≤n, 0≤l≤m,那么这个CubeCubeCube向量的形式可以表示成:
2m−l×[0,...,0,(r0),(r1),....,(rr),0,....,0]2^{m-l}\times [0,...,0,\binom{r}{0},\binom{r}{1},....,\binom{r}{r},0,....,0]2m−l×[0,...,0,(0r​),(1r​),....,(rr​),0,....,0]
其中r=n−u−cr=n-u-cr=n−u−c,并且CubeCubeCube向量开头有uuu个0,以及结尾有ccc个0.。
解释:首先,由于只含有 lll个YYY变量,代表着剩下的m−lm-lm−l个YYY变量被化简掉了,从矩阵表示的形势看,也就是说每一个XXX的组合下面,对应着2m−l2^{m-l}2m−l个最小项。接着,由于一个CubeCubeCube表示的一个布尔函数中有uuu个未置反的布尔变量,那么要使得这个布尔函数值为1,至少uuu个布尔变量必须是1,同理,至少ccc布尔变量也必须是0。而剩下的r=n−u−cr=n-u-cr=n−u−c个XXX变量,可以随便取1或0,如果XXX变量的和是uuu,那么则有(r0)\binom{r}{0}(0r​)个,如果XXX变量的和是u+1u+1u+1,那么则有(r1)\binom{r}{1}(1r​)个,如果XXX变量的和是u+iu+iu+i,那么则有(ri)\binom{r}{i}(ir​)个。由此我们可以直到,CubeCubeCube向量的形式确实如上面所写的那样。

B、基本思想
我们提出的方法的思路是迭代地添加CubeCubeCube到On(B)On(B)On(B)中。每次添加了CubeCubeCube之后,问题向量中的对应项也要减去CubeCubeCube向量中的对应项,更新为新的问题向量。但是,CubeCubeCube在添加的时候需要遵循两条规则:1、Disjointness Constraint:如果每次添加的CubeCubeCube都是不相交的,那么每次问题向量的更新也变得很简单,只需要减去CubeCubeCube向量的对应项;另外也消除某些冗余的情况。 2、Capacity Constraint:就是说每次添加的CubeCubeCube的向量中的每一项必须不大于当前问题向量的对应的每一项。
另外,在每一次的选择CubeCubeCube的时候,使用贪心算法。我们每次选择的CubeCubeCube都是当前允许的最大的CubeCubeCube。原因有两个:一个是我们的目的就是使得最后的字母个数达到最少,所以当选择的CubeCubeCube越大就代表每一项中字母个数越少;另外一个原因是如果每次都选择最大的CubeCubeCube,那么这个迭代的过程会更快的结束。
虽然,关于CubeCubeCube如何选择的解空间是很大的,但是提出的解决方案是在原来解空间中的符合要求的子空间中选择一个好的解并且迭代过程花费的时间合理。

C、为最大的可用的Cube确定Cube向量
在开始每一次的迭代,问题向量是(V(0),....,V(n))(V(0),....,V(n))(V(0),....,V(n))。那么s=∑i=0nV(i)s=\sum_{i=0}^{n}V(i)s=∑i=0n​V(i)表示当前还剩下多少个没分配的最小项,令q=⌊log⁡2s⌋q=\lfloor\log_{2}s\rfloorq=⌊log2​s⌋,由于需要满足Capacity Constraint.所以我们接下来要做的就是确定一个大小为2q2^{q}2q的CubeCubeCube。也因此,我们的CubeCubeCube向量,需要满足一个条件是:m−l+r=qm-l+r=qm−l+r=q。我们的方法是需寻找所有满足这个等式的并且还满足CapacityConstraintCapacity ConstraintCapacityConstraint的CubeCubeCube向量。
但是有的时候,我们无法找到一个满足条件的大小为2q2^{q}2q的CubeCubeCube向量。那么我就找一个2q−12^{q-1}2q−1大小的CubeCubeCube向量。肯定最终可以找到一个CubeCubeCube,因为最差的情况下是,CubeCubeCube的大小是1。但是同样,也会存在同时有几个不同的CubeCubeCube向量,在之后的Part E会提出处理这种问题的方法。

D、根据Cube向量确定Cube
分为两个步骤:
1、确定由XXX构成的sub−cubesub-cubesub−cube:
根据确定的CubeCubeCube向量,确定所有可能的XXX组合
2、然后确定由YYY构成的sub−cubesub-cubesub−cube
在确定了由XXX构成的所有的sub−cubesub-cubesub−cube后,针对每一个XXX的sub−cubesub-cubesub−cube,在矩阵表示形式中,为了满足Disjoint Constraint,只有没有"1"的那几行可供选择,因此在没有1的那几行选择2m−l2^{m-l}2m−l行。我们可以先将可供选择这些行的Y−cubeY-cubeY−cube表示成一个布尔函数。利用一种工具——ESPRESSO来化简这个关于YYY的布尔函数。如果化简的结果中最大的一个CubeCubeCube项(在化简得到的布尔函数是SOP形式的,最大的一项即某个乘积项所含的字母最少)的大小小于2m−l2^{m-l}2m−l,则表示没有合适的CubeCubeCube大小等于2q2^{q}2q,所以我们需要减小qqq,进行下一次迭代。反之,如果最大的CubeCubeCube不小于2m−l2_{m-l}2m−l​,那么就选择ESPRESSO返回的最大的那个CubeCubeCube中的前2m−l2_{m-l}2m−l​个最小项作为我们为当前X−CubeX-CubeX−Cube分配的Y−CubeY-CubeY−Cube。

E、启发性的广度优先搜索
就像之前说的,在每次迭代中我都需要选择最大的CubeCubeCube.但是在很多情况下,选择最大的CubeCubeCube也会有很多种情况。但是我们没办法立刻选择出一个CubeCubeCube使得最后布尔函数中的"字母"的个数最少。采取的措施是保留这些所有的待选项,然后依据它们继续拓展,这样这个过程就可以描述成一个解决方案树的形成。如下图:

在这个解决方案树中,我们用CubeCubeCube向量表示一个CubeCubeCube;然后不同的树枝树枝树枝表示选择不同的最大CubeCubeCube从而不同的CubeCubeCube向量;叶子节点叶子节点叶子节点表示最终的所有解决方案。
为了遍历解决方案树,我们采用了一个广度优先搜索。但是,由于节点数是随着树的级数的增加而指数增加的,所以我们不是展开所有的可供选择的方案,我们在树的每一级只展开一小部分的局部最优节点。
接下来,我们解决在展开解决方案树的每个节点时,怎么挑选去选择合适的节点展开,而不是全部展开,那样的话就像上面所说的那样,节点个数随着树的级数指数增加。解决方案树的一个特性是:即使是同一级的节点,每个节点所能添加的最大的CubeCubeCube是不一样的,因此我们只保留所有那些能添加在这一级的所有节点能添加的所有CubeCubeCube中最大的CubeCubeCube的节点。
原因是:因为选择了能添加最大CubeCubeCube的这些节点之后不断拓展能添加的CubeCubeCube,也会比那些被去掉的节点大。因此选择的这些节点更有可能经历更少的迭代次数就能完成所有的CubeCubeCube分配,因此最后会有更少的CubeCubeCube,也会有更少的字母个数
接下来,为了进一步筛去没必要的候选项,需要在集合S(表示下一级所有添加了最大CubeCubeCube的节点组成的集合)中做进一步的过滤。在第二轮的过滤中我们以所有节点部分解的CubeCubeCube的LiteralCountLiteral CountLiteralCount(字母个数,利用ESPRESSO得到)作为过滤准则。
并且,我们在这里有一个直观经验就是:一般选择一个较好的局部解也会使得最后的解变得更好。具体流程如下:
我们定义在每一级的局部解的字母个数的最小值是minminmin,然后且局部解的字母个数还要不大于min+wmin+wmin+w。因此,我们选择保留的节点是那些字母个数接近minminmin的节点,但是我们不是只保留那些字母个数等于minminmin的节点,因为我们当前也无法确保局部最优的解能够导致全局最优的解,而局部次优的解也有可能导致最后更好的全局解。另外,如果我们调整这个www,也就是意味着我们能够得到更多的局部解,这样最后获得更优的全局解的可能性也就更大。这就是所谓的在solution−qualitysolution-qualitysolution−quality和run−timerun-timerun−time之间的一个tradeoff

F、加速技术
尽管在Part E中提出的启发式广度优先搜索算法从解决方案树中去掉了一些没必要的节点,但是仍然还会有许多节点随着多项式变量度的增加。这一部分提出两种加速技术。
(1)去掉有重复Cube 集合的节点
正如Part C中所描述的那样,我们选取最大的CubeCubeCube,即大小为2q2^{q}2q,但是我们也会碰到情况是找不到这么大的CubeCubeCube,进而我们只能选取一个更小的CubeCubeCube,比如大小为2q−12^{q-1}2q−1。但是这种情况,便会造成一种重复的情况。例如下面这种:

在解决方案树中如果两条枝干是由于相同的CubeCubeCube选择但是不同的添加顺序造成的,那么这种情况我们没必要重复检测 ,所以这个枝干我们可以删去。因此,在我们不断生成节点的过程中,我们检查当前节点的CubeCubeCube向量集合是否已经在之前的同级节点又过了。如果有的话直接去掉这条枝干

(2)限制X-Cube 的数量
正如在Part D中所描述的那样,为了根据已确定好的CubeCubeCube向量来选取合适的CubeCubeCube,我们是分两个步骤做的,第一步是先确定X−CubeX-CubeX−Cube,而进行这一步,需要先遍历所有可能的X−CubeX-CubeX−Cube,即所有符合要求的XXX组合;然后第二步是 对于每一个X−CubeX-CubeX−Cube,选择对应的Y−CubeY-CubeY−Cube。
当我们首先从根节点即初始的问题向量中开始选择第一个最大CubeCubeCube时,我们只需选择任意一个X−CubeX-CubeX−Cube,它们都是等价的,因为在这个时候我们还没有分配任何的CubeCubeCube。但是到了后面的节点选择X−CubeX-CubeX−Cube时,不能任意选择了,还是需要遍历每一个。因为这个时候,已经有分配了的CubeCubeCube了,所以选择不同的X−CubeX- CubeX−Cube时,最终会形成不同的布尔函数。

5、多变量多项式的设计

在上面一部分,是设计实现单变量多项式的SC电路,在这部分,进行了拓展来解决多变量的多项式。
为多变量设计布尔函数的过程和单变量多项式的过程是一样的。但是,CubeCubeCube向量的形式以及为问题向量确定适当的CubeCubeCube的方法是不一样的。
在多变量多项式的情况下,问题向量表示为:(V(0,...,0),...,V(d1,..,dk))⇔(G(0,...,0),...,G(d1,...,dk))(V(0,...,0),...,V(d_{1},..,d_{k}))\Leftrightarrow(G(0,...,0),...,G(d_{1},...,d_{k}))(V(0,...,0),...,V(d1​,..,dk​))⇔(G(0,...,0),...,G(d1​,...,dk​))
然后,CubeCubeCube向量表示为:[C(0,...,0),...,C(d1,...,dk)][C(0,...,0),...,C(d_{1},...,d_{k})][C(0,...,0),...,C(d1​,...,dk​)],其中C(s1,...,sk)C(s_{1},...,s_{k})C(s1​,...,sk​)表示在某个CubeCubeCube中有CCC个最小项在M(s1,...,sk)M(s_{1},...,s_{k})M(s1​,...,sk​)中。另外,多变量多项式的CubeCubeCube向量也有一些性质:
Theorem 1:一个CubeCCube\ CCube C是由一系列的sub−cubeCX1,...,CXk,CYsub-cube\ C_{X_{1}},...,C_{X_{k}},C_{Y}sub−cube CX1​​,...,CXk​​,CY​的乘积组成的。对于每一个CXiC_{X_{i}}CXi​​都有一个对应的X−CubeX-CubeX−Cube向量与之对应,即[Ci(0),...,Ci(di)](0≤j≤ui−1,Ci(j)=0;ui≤j≤di−ci,Ci(j)=(di−ui−cij−ui);di−ci+1≤j≤di,Ci(j)=0)[C_{i}(0),...,C_{i}(d_{i})](0\le j\le u_{i-1},\ C_{i}(j)=0;\ u_{i}\le j\le d_{i}-c_{i},\ C_{i}(j)=\binom{d_{i}-u_{i}-c_{i}}{j-u_{i}};\ d_{i}-c_{i}+1\le j\le d_{i},\ C_{i}(j)=0)[Ci​(0),...,Ci​(di​)](0≤j≤ui−1​, Ci​(j)=0; ui​≤j≤di​−ci​, Ci​(j)=(j−ui​di​−ui​−ci​​); di​−ci​+1≤j≤di​, Ci​(j)=0),所以对于任意的C(s1,...,sk)C(s_{1},...,s_{k})C(s1​,...,sk​)可以表示为2m−l∏i=1kCi(si)2^{m-l}\prod_{i=1}^{k}C_{i}(s_{i})2m−l∏i=1k​Ci​(si​)。
确定了每一个等价类中最小项的个数,之后的步骤也和单变量多项式的一致。先确定最大的CubeCubeCube向量然后把它们映射成真正的有效的CubeCubeCube。
首先仍然和之前一样,q=⌊log⁡2(∑i=1k∑si=1diC(s1,...,sk))⌋q=\lfloor\log_{2}(\sum_{i=1}^{k} \sum_{s_{i}=1}^{d_{i}} C(s_{1},...,s_{k}))\rfloorq=⌊log2​(∑i=1k​∑si​=1di​​C(s1​,...,sk​))⌋。接下来就是要求出各ui,ci以及lu_{i},c_{i}以及lui​,ci​以及l了,满足等式:
objective:m−l+∑i=1k(di−ui−ci)=qsubjectto:0≤ui,ci≤di,0≤ui+ci≤di0≤l≤mobjective:\ m-l+\sum_{i=1}^{k}(d_{i}-u_{i}-c_{i})=q\\ subject\ to:\ 0\le u_{i},c_{i}\le d_{i},\ 0\le u_{i}+c_{i}\le d_{i}\\ 0\le l\le mobjective: m−l+i=1∑k​(di​−ui​−ci​)=qsubject to: 0≤ui​,ci​≤di​, 0≤ui​+ci​≤di​0≤l≤m
我们需要找出所有满足条件的ui,ci,lu_{i},c_{i},lui​,ci​,l,最后再在所有的选择挑选出满足Capacity Constraint的组合。接下来就是选择CubeCubeCube,我们依据4、Part D部分的方法,先确定X−CubeX-CubeX−Cube即(CX1,...,CXk)(C_{X_{1}},...,C_{X_{k}})(CX1​​,...,CXk​​),也就是知道每一个ui,ci以及lu_{i},c_{i}以及lui​,ci​以及l。但是针对每一个ui,ciu_{i},c_{i}ui​,ci​,相应的sub-Cube CXiC_{X_{i}}CXi​​也不是唯一确定的,我们需要列出所有可能的组合从而来寻找最优的解。

6、复杂度分析

时间复杂度 ∝\propto∝ 每个节点的工作量×\times×节点的数量

在每个节点处,我们的工作是找到所有符合要求的最大CubeCubeCube,这就需要我们遍历所有的XXX组合以及YYY组合。首先确定X−CubeX-CubeX−Cube,总共有3n3^{n}3n种组合;然后再确定Y−CubeY-CubeY−Cube,这部分所用的时间占主要部分,就是遍历矩阵里每一个“格子”,总共有2m+n2^{m+n}2m+n个。所有每个节点的工作量就可以写成c1.2m+n.3nc_{1}.2^{m+n}.3^{n}c1​.2m+n.3n。
由于我们的算法特殊性,每一级的节点个数基本是相等的,所以节点数适合树的级数成正比的,而级数等于将节点个数二进制表示时的1的个数(由于我们每次分配CubeCubeCube的时候都是按找最大的CubeCubeCube),同时节点个数也小于2m+n2^{m+n}2m+n,所以级数的上界是m+nm+nm+n,最后时间复杂度就是O((n+m)3n.2n+m)O((n+m)3^{n}.2^{n+m})O((n+m)3n.2n+m)

空间复杂度
在我们的算法中,最大的存储空间就是下一级的所有待选节点。而每一级的节点个数都基本是相同的。下一级的节点个数的上界是3n3^{n}3n。然后对于每一个节点,又都会有有一个矩阵空间用来存储,所以最后空间复杂度是O(3n.2n+m)O(3^{n}.2^{n+m})O(3n.2n+m)。

随机计算(3)——Stochastic Circuit Synthesis by Cube Assignment相关推荐

  1. 1.1 鞅、停时和域流-随机过程的可测性(布朗运动与随机计算【习题解答】)

    1.1 鞅.停时和域流-随机过程的可测性(布朗运动与随机计算[习题解答]) 1.5 Problem. Let Y be a modification of X, and suppose that bo ...

  2. 【转载】深度学习数学基础(二)~随机梯度下降(Stochastic Gradient Descent, SGD)

    Source: 作者:Evan 链接:https://www.zhihu.com/question/264189719/answer/291167114 来源:知乎 著作权归作者所有.商业转载请联系作 ...

  3. 慢速随机指标Slow Stochastic

    Slow Stochastic:慢速随机指标 通过差值平均过滤了短期的波动,使每次买卖点的趋势反应避免了不必要的失误.通常设SLOWKD参数为(36,5) 应用: 1.筑底阶段:SLOWKD在20以下 ...

  4. 机器学习笔记:随机深度网络 stochastic depth

    [1603.09382v1] Deep Networks with Stochastic Depth (arxiv.org) 1 模型介绍 有点类似于以层为基本单元的dropout 在ResNet中, ...

  5. 模型泛化技巧“随机权重平均(Stochastic Weight Averaging, SWA)”介绍与Pytorch Lightning的SWA实现讲解

    文章目录 SWA简介 SWA公式 SWA常见参数 Pytorch Lightning的SWA源码分析 SWALR 参考资料 SWA简介 SWA,全程为"Stochastic Weight A ...

  6. 1.2 鞅、停时和域流-停时(布朗运动与随机计算【习题解答】)

    Proposition 11 If E \mathcal{E} E is a non-empty class of sets containing ∅ \varnothing ∅, write E

  7. B站大佬用我的世界搞出卷积神经网络,LeCun转发!爆肝6个月,播放破百万

    丰色 发自 凹非寺 量子位 | 公众号 QbitAI 非计算机专业.神经网络小白,爆肝六个月-- 在<我的世界>里搭建一个卷积神经网络,这是什么神操作? ‍‍ 最近,来自B站up主@辰占鳌 ...

  8. LeCun大佬点赞转发!B站大佬爆肝6个月,目前播放量破百万!

    来源:量子位 非计算机专业.神经网络小白,爆肝六个月-- 在<我的世界>里搭建一个卷积神经网络,这是什么神操作? ‍‍ 最近,来自B站up主@辰占鳌头的作品着实火了一把. 他和朋友们合作完 ...

  9. 3D Cube计算引擎加速运算

    3D Cube计算引擎加速运算 华为达芬奇架构的AI芯片Ascend910,同时与之配套的新一代AI开源计算框架MindSpore. 为什么要做达芬奇架构? AI将作为一项通用技术极大地提高生产力,改 ...

最新文章

  1. 前端的单页面模式和多页面模式
  2. git checkout 命令详解
  3. redis hash
  4. Oracle获取月初/月末/季初/季末/半年初/半年末/年初/年末
  5. 学什么就业前景好的专业_新能源汽车专业学什么?其就业前景如何?
  6. 33迭代器模式(Iterator Pattern)
  7. 2017阿里技术年度精选(全)
  8. supersocket新的配置属性 textEncoding
  9. 基于梯度的权重更新优化迭代算法
  10. 思维认知-读mindhacks杂记
  11. 一个按钮会随着鼠标移动而变化的小工具
  12. Linux salt
  13. 什么是 SNMP 和 MIB
  14. 图像分类数据集(Fashion-MNIST)
  15. 艺电模拟城市开源代码读后感
  16. Spirent Testcenter基本配置使用说明_1022
  17. Golang 加密方法
  18. MQTT协议的智能家居之指纹锁
  19. python中输出手机话费_用Python生成柱状图、折线图、饼状图来统计自己的手机话费...
  20. 腾讯网UED体验设计之旅

热门文章

  1. PHP 进阶:代码整洁之道
  2. Xshell 6链接Liunx链接不上:
  3. 可以在PowerShell里使用的Word度量单位
  4. 重拾Java基础知识:网络编程
  5. 你是否了解APP耗电问题?深入探索 Android 电量优化,flutter插件推荐
  6. APP软件开发的步骤
  7. 曲速未来 揭示:Lisk(LSK)有什么价值?
  8. 喜茶门店总数超过650家,深圳单城市突破100家店
  9. STL--list的模拟实现
  10. 关于华硕主板的图像输出设置