小编Bak*_*riu的帖子

零抑制 BDD 的交集——使用 ZDD 实现多项式

我正在尝试使用 ZDD 实现单变量多项式,如另一个问题的评论中所建议的

我读过 S. Minato 的论文(你可以在这里下载)),但我不明白如何在这些ZDD上实现操作。

论文中的想法是多项式可以用x^(2^i)变量来表示。例如,x^5 + x^3 + x可以重写为x^4x^1 + x^2x^1 + x^1,如果您为每个x^(2^i)变量创建节点并与相乘的“1-边”变量和相加的“0-边”变量连接,您可以轻松获得表示该多项式的图形. ZDD 是这种图形,它在图形上强制执行某些条件(有关更多信息,请阅读 Minato 的文章和维基百科关于 BDD的页面

可以使用 2 的幂之和类似地表示系数(例如,5 = 2^2 + 2^0每个2^i都是变量并且节点以相同的方式与 1 和 0 边连接)。

现在,我的问题是添加两个 ZDD 的算法。算法看起来很简单:

如果 F 和 G (ZDDs) 没有共同的组合,只需将它们合并即可完成加法 (F + G)。当它们包含一些常见的组合时,我们计算以下公式:(F + G) = S + (Cx2),其中 C = F ? G, S = (FUG) \ C …

implementation polynomial-math binary-decision-diagram

6
推荐指数
1
解决办法
805
查看次数

验证树是否是bst

我有一个练习面试问题告诉我要验证一棵树是否是一个平衡的搜索树,并给出一个验证方法...我有一个类作为

Class Node:
def __init__(self, k, val):
    self.key = k
    self.value = val
    self.left = None
    self.right = None
Run Code Online (Sandbox Code Playgroud)

和树的最大值和最小值的其他函数定义为

def tree_max(node):
    maxleft  = float('-inf') if not node.left  else tree_max(node.left)
    maxright = float('-inf') if not node.right else tree_max(node.right)
    return max(node.value, maxleft, maxright)

def tree_min(node):
    minleft  = float('-inf') if not node.right else tree_min(node.left)
    minright = float('-inf') if not node.left else tree_min(node.right)
    return min(node.value, minleft, minright)
Run Code Online (Sandbox Code Playgroud)

我的验证方法为

def verify(node):
    if tree_max(node.left) <= node.value and node.value <= tree_min(node.right):
       if verify(node.left) and verify(node.right):
           return …
Run Code Online (Sandbox Code Playgroud)

python binary-search-tree

6
推荐指数
1
解决办法
7692
查看次数

在Cython中编译时获取整数的大小

是否有可能,如果是的话,如何确定Cython中整数数据类型的大小(以位为单位)?

我正在尝试做这样的事情,以获得整数大小:

cdef WORD_BITS = 0
IF sizeof(unsigned long long) == 8:
    WORD_BITS = 64
    DEF VECTOR_LENGTH_SHIFT_AMOUNT = 6
ELSE:
    WORD_BITS = 32
    DEF VECTOR_LENGTH_SHIFT_AMOUNT = 5

ctypedef unsigned long long word_t

cdef int vector_length(size_t bit_size):

    cdef size_t size = bit_size >> VECTOR_LENGTH_SHIFT_AMOUNT
    if size << VECTOR_LENGTH_SHIFT_AMOUNT < bit_size:
        size += 1
    return size

cdef class BitVector(object):

    cdef size_t length
    cdef size_t array_size
    cdef word_t *array

    def __cinit__(self, size_t size):
        self.length = size
        self.array_size = vector_length(size)
        self.array = <word_t *>calloc(self.array_size, …
Run Code Online (Sandbox Code Playgroud)

cython

6
推荐指数
1
解决办法
1038
查看次数

一种简单的方法来模拟松散定义的Python dict对象

有没有一种简单的方法来在Python中模拟松散定义的dict对象?例如,如何在给定dict的情况下轻松表达input,我想检查其中的每个值是否符合特定的元定义,如最小值和最大值,长度和类型?

能够这样做可能很方便,例如,在编写测试时.

mock(Python版本3.3+中的unittest.mock)中,可以指定值可以是ANY值,例如

>>> mock = Mock(return_value=None)
>>> mock('foo', bar=object())
>>> mock.assert_called_once_with('foo', bar=ANY)
Run Code Online (Sandbox Code Playgroud)

但是,如果bar上面应该是类似dict的对象,就像

>>> {'baz': <an integer between -3 and 14>, 'qux': <'yes' or 'no'>}
Run Code Online (Sandbox Code Playgroud)

python unit-testing python-mock python-unittest

6
推荐指数
1
解决办法
1765
查看次数

为什么函数定义中首选模式匹配?

我读从"learnyouahaskell"教程learnyouahaskell.它写着:

模式匹配也可以用在元组上.如果我们想要创建一个在2D空间中采用两个向量(以对形式)并将它们加在一起的函数,该怎么办?为了将两个向量相加,我们分别添加它们的x组件,然后分别添加它们的组件y.如果我们不了解模式匹配,我们将如何做到这一点:

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a)  
addVectors a b = (fst a + fst b, snd a + snd b)  
Run Code Online (Sandbox Code Playgroud)

嗯,这有效,但有一个更好的方法来做到这一点.让我们修改函数,使其使用模式匹配.

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a)  
addVectors (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)  
Run Code Online (Sandbox Code Playgroud)

我们去!好多了.请注意,这已经是一个包罗万象的模式.addVectors(在两种情况下)的类型都是addVectors :: (Num a) => (a, a) -> (a, a) - > (a, a),所以我们保证得到两对作为参数.

我的问题是:如果两个定义产生相同的签名,为什么模式匹配首选首选方式?

haskell function signature pattern-matching

6
推荐指数
1
解决办法
310
查看次数

PyInstaller打包应用程序在控制台模式下工作正常,在窗口模式下崩溃

我正在使用Python和PySide构建一个相当复杂的应用程序.最后发布的那天即将到来,所以我想将这个应用程序构建为exe.

但是,我的手上有一个奇怪的问题.我过去使用过PyInstaller(顺便使用版本2),从来没有发生过这种情况.

基本上,当我使用--console标志构建应用程序时,它工作正常 - 但它打开控制台窗口.当我使用window flag(-w)构建应用程序时,它不能正常工作.它开始和一切,但有所有这些奇怪的故障.例如,加载文本文件通常会引发BadFileDescriptor错误(在控制台模式下不会发生),并且应用程序在执行某项任务后崩溃.更糟糕的是,任务是循环,并且第一次执行正常,但是当它再次开始工作时,它会崩溃.

当我查看minidump文件时,有一些关于QtGui4.dll文件的内存访问冲突的错误.同样,这在控制台模式下不会发生.

有人有主意吗?

python qt pyqt pyinstaller pyside

5
推荐指数
1
解决办法
4798
查看次数

表中存储的数据是否区分大小写?

我有三个表样本.我曾经习惯mysql在数据库中存储数据

+--------------------------+
| Table-1                  |
+--------------------------+
| Sl.No | Name | City      |
+-------+------+-----------+
|  1    | Carl | Australia |
+-------+------+-----------+

+--------------------------+
| Table-1                  |
+--------------------------+
| Sl.No | Name | City      |
+-------+------+-----------+
|  1    | carl | australia |
+-------+------+-----------+

+--------------------------+
| Table-1                  |
+--------------------------+
| Sl.No | Name | City      |
+-------+------+-----------+
|  1    | CARL | AUSTRALIA |
+-------+------+-----------+
Run Code Online (Sandbox Code Playgroud)
  • 很明显,我们可以在每个表中看到一行数据
  • 数据的性质是一样的

我所做的是我使用了不同的大小写字母,有些是大写字母,有些是小写字母.

数据存储在数据库区分大小写吗?

mysql case-sensitive

5
推荐指数
2
解决办法
5913
查看次数

迭代文本文件中的行,返回行号和出现次数?

我正在尝试编写这段代码,它可以作为排序的索引来筛选文本文件并返回字符串的出现次数以及它们所在的行。我越来越接近了,但是我的迭代遇到了问题,我不知道该怎么做。

def index(fileName, wordList):

    infile = open(fileName,'r')

    i = 0
    lineNumber = 0
    while True:
        for line in infile:
            lineNumber += 1
            if wordList[i] in line.split():
                print(wordList[i], lineNumber)
        i += 1
        lineNumber = 0

fileName = 'index.txt'
wordList = eval(input("Enter a list of words to search for: \n"))

index(fileName,wordList)
Run Code Online (Sandbox Code Playgroud)

我用通用术语填充了我的 .txt 文件,所以它看起来像这样:

bird 
bird 
dog 
cat 
bird
Run Code Online (Sandbox Code Playgroud)

当我提供一个字符串列表时,例如:

['bird','cat']
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Enter a list of words to search for: 
['bird','cat']
bird 1
bird 2
bird 5
Run Code Online (Sandbox Code Playgroud)

所以它给了我列表中第一个字符串的术语和行号,但它没有继续到下一个字符串。有什么建议吗?如果我可以优化输出以将行号包含到单个打印中,那将不胜感激。

python string

5
推荐指数
1
解决办法
1万
查看次数

为什么 Anaconda 将我的默认 Python 路径添加到特定环境的路径中?

我已经创建了一个 anaconda 环境。当我激活环境时,我可以看到环境使用的 Python 版本与我的默认 Python 版本不同。这是对的。但是,当我在激活的环境中检查 python 路径时。

import sys
from pprint import pprint
pprint(sys.path)
Run Code Online (Sandbox Code Playgroud)

我可以看到前 4 项指向默认的 Python 安装。

['', 'C:\\Python27\\Lib\\site-packages\\distribute-0.6.35-py2.7.egg', 'C:\\Python27\\Lib\\site-packages\\ipython-1.0.0-py2.7.egg', 'C:\\Python27\\Lib\\site-packages', 'C:\\Python27\\Lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\python27.zip', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\DLLs', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\plat-win', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\lib-tk', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\PIL', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\Sphinx-1.2.3-py2.7.eg g', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\win32', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\win32\\lib', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\Pythonwin', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\runipy-0.1.1-py2.7.eg g', 'C:\\Users\\sennn\\AppData\\Local\\Continuum\\Anaconda32\\envs\\apiapi\\lib\\site-packages\\setuptools-5.8-py2.7. egg']
Run Code Online (Sandbox Code Playgroud)

这会导致导入某些库的错误版本的问题。

为什么这些默认目录已添加到路径中?这是创建新 Anaconda 环境时的默认行为吗?有没有办法覆盖它?

python python-2.7 anaconda

5
推荐指数
1
解决办法
4900
查看次数

如何创建两个调用此外部库API的ByteStrings?

我目前正在编写绑定到加密库,该库公开了生成密钥对的函数:

const size_t PUBLICKEYBYTES = 32;
const size_t SECRETKEYBYTES = 32;
int random_keypair(unsigned char pk[PUBLICKEYBYTES],
                   unsigned char sk[SECRETKEYBYTES]);
Run Code Online (Sandbox Code Playgroud)

此函数随机生成一个密钥,计算相应的公钥并将结果放入pksk.

当刚刚返回一个ByteString我发现,最简单的方法是使用create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteStringData.ByteString.Internal.但是,该功能不能同时创建两个ByteStrings.

我的第一个方法是写下这样的东西:

newtype PublicKey = PublicKey ByteString
newtype SecretKey = SecretKey ByteString
randomKeypair :: IO (PublicKey, SecretKey)
randomKeypair = do
    let pk = B.replicate 0 publicKeyBytes
        sk = B.replicate 0 secretKeyBytes
    B.unsafeUseAsCString pk $ \ppk ->
        B.unsafeUseAsCString sk …
Run Code Online (Sandbox Code Playgroud)

haskell ffi bytestring

5
推荐指数
1
解决办法
63
查看次数