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. java使用window builder图形界面开发简易计算器

    界面效果: /** * */ package calculator; import java.awt.BorderLayout; import java.awt.EventQueue; import ...

  2. 【Spark】快来学习RDD的创建以及操作方式吧!

    目录 RDD的创建 三种方式 从一个集合中创建 从文件中创建 从其他的RDD转化而来 RDD编程常用API 算子分类 Transformation 概述 帮助文档 常用Transformation表 ...

  3. 【Hadoop离线基础总结】Hue与Hive集成

    目录 1.更改hue的配置hue.ini 2.启动hive的metastore以及hiveserver2服务 3.启动hue进程,查看Hive是否与Hue集成成功 1.更改hue的配置hue.ini ...

  4. STM32 Bootloader基于ymodem传输协议串口IAP升级详解

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 1 预备知识 2 Bootloader 2.1 启动流程 2.2 校验跳转地址是否有效 ...

  5. [hdu5313]二分图性质,dp

    题意:给定二分图,求添加的最多边数,使得添加之后还是二分图 思路:如果原图可以分成X,Y两个点集,那么边数最多为|X||Y|条.由于|X|+|Y|==n,所以需要使|X|与|Y|尽量接近.先对原图进行 ...

  6. An SWT error has occurred

    对话框标题:Problem Occurred 对话框内容:Unhandled event loop exception No more handles 对话框按钮:第一个超链接:Show Error ...

  7. Android CodeReview 些许总结

    CodeReview些许总结 1:使用Handler的时候,使用handler.post(Runnable);,hanler与类尽量保持弱引用关系,或者使用静态的handler对象 public Ha ...

  8. RobotFramework自动化测试之元素定位

    前言:最近在做基于RF框架的Web自动化测试,其中涉及到元素的定位,主要用到id.name.xpath.css四中定位方法,尤其后面的两种方法特别有效,可以解决大部分的定位问题. id和name定位 ...

  9. 【雕爷学编程】Arduino动手做(57)---四档矩形波模块

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

  10. ES6常见面试题

    1.es5和es6的区别,说一下你所知道的es6 ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化 ECMAScript6,即ES6,是ECMAScript ...