我想在Fortran中实现一个小而快速的定性数据类型

时间:2013-12-26 19:49:21

标签: types fortran

这是关于在Fortran中实现定性数据类型的一系列问题的一部分。

背景:该主题涉及一个名为复杂系统的循环分析的东西,人们可能会在其中阅读,例如,Puccia,CJ和Levins,R。(1986 )。 复杂系统的定性建模:循环分析和时间平均介绍。哈佛大学出版社,剑桥,马萨诸塞州或莱文斯,R。(1974)。部分指定系统的定性分析。 纽约科学院年刊,231:123-138。虽然我可以使用数值矩阵代数实现这种技术(如其他地方所做的那样),但我有兴趣从不同的方向处理问题。循环分析的本质是复杂和昂贵的(我不是CS人,但我认为它类似于#P难度计算),我的长期目标是为各种各样的循环分析问题创建一组库,根据定性算法的属性采用修剪优化。如果这看起来毫无希望地被误导,请幽默我,并认为这是一种学习练习。

为了我的目的,QUALIT数据类型可以有4个值:-1,0,+ 1和? (有时在文献中表示为 - ,0,+和+/-。)

我可以使用两个逻辑元素来实现它:

bit2  bit1  value
0      0     -1
0      1      0
1      0      1
1      1      ?

或者在Fortan:

TYPE QUALIT
  LOGICAL bit2, bit1
  END TYPE

QUALIT数据上有一些算术运算,它们与标准数学包中的符号算术不同,它们将成为不同问题的主题。我的问题在这里:

是否正在导出一个具有两个逻辑变量的类型,就像我在最小(内存)和最快(在操纵这些数据方面)上面所做的那样定义QUALIT数据类型?我想要用它们做大量的算术运算(包括算术和条件测试);我还想要创建包含QUALIT类型元素的数组,并对这些数据执行许多操作。

1 个答案:

答案 0 :(得分:3)

对此的回答以及您的其他两个问题(以及这些问题的两个部分)充其量只是“它取决于”。考虑到你写出实际问题的方式,“不”没有详细说明也可能就足够了。

答案几乎可以肯定是硬件(假设您甚至在计算机上解决这些问题...),特定的软件和问题详细信息(特别是问题大小)。

我建议你需要构建一个用于测试的原型,在代表性数据上设置一些计算,并测量时间和内存需求。请注意,最小的解决方案可能不是最快的解决方案,最快的解决方案可能取决于问题的大小。

您应该考虑的变体包括使用非默认类型逻辑。默认类型逻辑的存储必须与默认类型整数和默认类型实数相同,它总是比保持真或假值所需的标称一位存储空间大得多。

明显的替代实现是在小范围整数中编码数据类型的四个值,甚至可能使用位内在函数。这最终会变得更快还是更小......这取决于。

您可能还想重新考虑从逻辑组件/位到四个值的映射,给定您要对其他问题中的值执行的操作以及如何使用常规逻辑运算来表示它们(和/或/ eqv / neqv等)。考虑表示“为负”的组件或位,以及表示“为正”的组件或位。您可能(或可能不)发现简单地使用基本逻辑运算会比预先计算的表方法提供更快的结果,在其他两个问题中使用,特别是考虑到计算表索引中固有的逻辑运算。

选择超出速度和内存占用的方法的另一个重要指标是生成的代码的清晰度和可用性。在许多情况下,这确实是最重要的指标。