https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA

 
简单介绍ReduceOthers的实现。
 
 
1. 基本介绍
 
输入一组Bool元素,把其他位置元素逐个相与的结果,作为当前位置的值输出。
 
2. helper
 
helper实现ReduceOthers的核心功能:
 
1) 输入参数
 
x是输入的一组Bool类型的元素。
 
2) 返回值
 
返回一个元组:(Seq[Bool], Bool)
a. Seq[Bool]:每个位置上返回其他位置上元素逐个相与的结果;
b. Bool:全部输入元素相与的结果;
 
3) x.size <= 1
 
 
可以分成两组情况:
a. x.size == 0:返回(true, true)
b. x.size == 1:返回(true, x(0))
 
4) x.size <= 3
 
因为元素个数有限,所以直接生成结果逻辑。
a. 返回元组的第二个元素为x里的所有元素相与的结果:x.reduce(_ && _)
b. x.take(i)取x中从0到i(不包含,exclusive)的元素:
 
 
c. x.drop(i + 1)取x中从i+1(包含,inclusive)开始的元素;
d. 这样x.take(i) ++ x.drop(i + 1)取x中除去i之外的全部元素;
e. 把这些元素逐个相与:(x.take(i) ++ x.drop(i + 1)).reduce(_ && _)
 
5) x.size > 3
 
如果x中元素过多,则需要提升效率。
 
a. x.grouped(2)把x中的元素每2个分成一个小组,若有多余的1个元素,则自成一组;
 
b. (i ^ 1) >= x.size表示自成一组的多余的1个元素
 
 
c. i/2表示当前元素所在的小组的编号;
d. half(i / 2)表示其他小组中所有元素相与的结果;
e. x(i ^ 1)表示当前小组中的另外一个元素;
f. x(i ^ 1) && half(i / 2)表示其他所有元素的相与结果;
 
3. def apply(x: Seq[Bool]): Seq[Bool]
 
使用helper实现ReduceOthers的功能,考虑输入带有常量的情况。
 
所谓常量就是输入是一个已知恒定的值(字面量,lieral),而不是可变的值(variable)。
a. 把输入分成常量和变量:val (literals, variables) = x.partition(_.isLit)
b. 找出值为假的常量:val falses = literals.count(_.litValue == 0)
c. 如果有两个及以上值为假的常量,则所有输出都为假:
 
这里有个Bug,应该是大于等于2:
 
d. 如果只有一个为假的常量
这个值为假的常量所在位置的输出由其他元素相与获得;
其他位置的输出为假;
 
e. 如果没有为假的常量
 
常量不加入相与运算,只需要求出所有变量ReduceOthers的输出。
 
常量元素对应位置的输出为所有变量相与的结果;
变量元素对应位置的输出从helper的输出中逐个取出;
 
4. def apply(x: Seq[(Bool, Bool)])
 
输入参数为:Seq[(Bool, Bool)]
其中:
a. 所有元组的第二个Bool集中在一起进行ReduceOthers运算。
b. 元组的第一个Bool,连接到第二个Bool对应位置ReduceOthers的运算结果;
 
5. 附录
 
 
 

Rocket - util - ReduceOthers的更多相关文章

  1. Rocket - util - Annotations

    https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg   介绍util中定义的注解(Annotations).   ​​   1. Annotation ...

  2. Rocket - util - Timer

    https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A   简单介绍Timer的实现.   ​​   1. 基本功能   实现定时器的功能.   2. Ti ...

  3. Rocket - util - Replacement

    https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw   简单介绍Replacement的实现.   ​​   1. 基本介绍   用于实现Cache替换 ...

  4. Rocket - util - Repeater

    https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA   简单介绍Repeater的实现.   ​​   1. 基本功能   A Repeater pas ...

  5. Rocket - util - PrefixSum

    https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA   简单介绍PrefixSum的实现.   ​​   1. 基本介绍   ​​ 把一个序列从前向后逐 ...

  6. Rocket - util - MultiWidthFifo

    https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A   简单介绍MultiWidthFifo的实现.   ​​   1. 基本介绍   实现一个输入宽度 ...

  7. Rocket - util - MaskGen

    https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw   介绍MaskGen的实现.   ​​   1. 基本介绍   给定总线宽度beatBytes,根 ...

  8. Rocket - util - Misc

    https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg   简单介绍Misc中各个辅助方法的用途和实现.   ​​   1. ParameterizedBu ...

  9. Rocket - util - LanePositionedQueue

    https://mp.weixin.qq.com/s/yO_9Ec3S5-AosRVLpsBgOg   简单介绍基于通道位置的队列(LanePositionedQueue)的实现.   ​​   1. ...

随机推荐

  1. Tarjan缩点割点(模板)

    描述:https://www.luogu.com.cn/problem/P3387 给定一个 nn 个点 mm 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权 ...

  2. Codeforces Round #577 (Div. 2) D. Treasure Hunting

    Codeforces Round #577 (Div. 2)  D. Treasure Hunting 这个一场div2 前面三题特别简单,这个D题的dp还是比较难的,不过题目告诉你了只能往上走,所以 ...

  3. js和jq的获取焦点失去焦点写法

  4. Programmatically add an application to Windows Firewall

    Programmatically add an application to Windows Firewall 回答1   Not sure if this is the best way, but ...

  5. SVN 分支代码合并到主线

    SVN 分支代码合并到主线 步骤一安装TortoiseSVN 客户端,在本地 checkout主线代码 步骤二:创建branches分支 步骤三.branches修改提交代码 步骤四:分支代码合并到主 ...

  6. Pytorch使用分布式训练,单机多卡

    pytorch的并行分为模型并行.数据并行 左侧模型并行:是网络太大,一张卡存不了,那么拆分,然后进行模型并行训练. 右侧数据并行:多个显卡同时采用数据训练网络的副本. 一.模型并行 二.数据并行 数 ...

  7. 初试stm32嵌入式开发遇到的巨坑

    开发板使用的是st官方的stm32F207ZG nucleo,遇到的问题是在keil中报错: no target connected 到网上找答案,都是说gpio口的问题,让按着reset键改debu ...

  8. 轻量级熔断降级框架 alibaba sentinel 应用

    一.简介: wiki:https://github.com/alibaba/Sentinel/wiki 选择: ♥ 开源,成熟(功能完备.实际应用),活跃(功能维护及拓展) ♥ 更轻量:依赖资源少:a ...

  9. 【雕爷学编程】Arduino动手做(47)---七段LED数码管模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  10. Codeforces1157A(A题)Reachable Numbers

    A. Reachable Numbers Let's denote a function f(x)f(x) in such a way: we add 11 to xx, then, while th ...