#量子 #算法 #探索 #数据结构 #叠加

quantum_world_state

受量子叠加和纠缠启发的元素之间关系的内存数据库

1个不稳定版本

0.1.0 2022年8月21日

#1087 in 算法

MIT/Apache

165KB
1K SLoC

quantum_world_state

量子世界状态

此库实现了一个受量子叠加和纠缠启发的元素之间关系的内存数据库。

量子世界状态对于表示系统随时间演化的状态非常有用。它允许探索多个互斥的“分支”的演化,而不必对其中任何一个做出承诺。它对于规划最优操作序列非常有用。在量子世界状态中的“量子”一词并不指任何被量化的东西,而是指从量子力学中借用的一些隐喻,即我们借用了叠加、坍缩和纠缠的概念。许多世界解释和哥本哈根解释都提供了有用的见解,但它们只是隐喻,因此有其局限性。

概述

量子世界状态中的两个基本概念是元素和事务。

每个元素可以被认为是一个数据库记录。一个元素可以是任何实现了QWSElement特质的数据类型,但必须将对象的所有权交给QWS。每个元素都分配了一个唯一的QWSElementID,可以用来在世界上定位该元素。QWS是一个只添加的数据存储,因此不能修改已添加到世界中的元素,但事务可以删除一个给定的元素并替换为更新的版本。每个元素的版本都将有自己的唯一QWSElementID。

元素还可以提供元数据值,这些值可以用于通过查询定位元素。目前查询语义有限,但将来可能会扩展。

只添加的特性意味着数据结构的历史以不可变的方式被保留。可以使用事务销毁一个元素,这实际上将元素从代表一种可能现实的分支中删除,但还存在一个其中该元素继续存在的替代历史,而且无法删除。

事务创建和销毁元素。创建事务的过程涉及提供三组元素

  • 事务创建的元素(即添加到世界的元素)
  • 事务销毁的元素
  • 事务中纠缠的元素

当读取一个元素以影响至少一个正在创建的元素时,会发生纠缠。从概念上讲,可以将纠缠视为表达依赖关系。换句话说,如果纠缠的元素不存在,则至少无法创建一个元素,因此创建的元素不能存在于纠缠元素不存在的世界版本中。

在任何给定时刻的世界状态被称为纪元。在给定纪元中,每个元素将处于在QWSElementStatus枚举中定义的存在状态之一。事务存在于一个纪元。

添加一些元素和事务

#[macro_use] extern crate maplit;
use quantum_world_state::*;
let mut qws = QuantumWorldState::new();

// Create an object that will become our first element
// MetaData keys without values function like tags
let forty_two_element = QWSElementWrapper::new_with_metadata(hashmap!{md_str!("my_tag") => vec![]}, 42);

// Add it to the QWS with a new transaction, and get back the new ElementID
let forty_two_id = qws.add_transaction(&[], &[], vec![Box::new(forty_two_element)])
    .unwrap().created_elements()[0];

// Create another transaction that destroys 42 and adds 43
qws.add_transaction(&[forty_two_id], &[], vec![Box::new(QWSElementWrapper::new_with_metadata(hashmap!{md_str!("my_tag") => vec![]}, 43))]);

查询和视图

可以通过查询表达式找到匹配的元素来查询QuantumWorldState。目前,唯一实现的查询表达式是“键包含值”,尽管从概念上讲,这可以扩展到允许更具有表现力的查询,包括复合查询,例如使用连接操作等。

通过QWSDataView对象发布查询。实际上,视图对象是从元素可见的角度出发的,查询可以限制可见元素以匹配查询的子集。

// Get a view of the queried elements
let query_view = qws.new_view().query_contains_key(&md_str!("my_tag")).unwrap();

// Iterate over the query results
for element_id in query_view.elements_iter() {
    // Prints "element 42" and "element 43" when run with the QWS from above
    println!("element {}", qws.get_element(element_id).unwrap().get_payload::<i32>().unwrap());
}

叠加和坍缩

QWSDataView也可以被坍缩,以限制查询找到的元素。在我们的上述示例中,元素42和元素43是相互排斥的,因为元素43是在一个销毁元素42的事务中创建的。我们的查询返回了这两个元素。然而,元素的状态为叠加,表示它们可能存在或不存在。

// We see that element 42 is in Superposition, in the query view we created above
println!("status of 42 = {}", query_view.get_element_status(forty_two_id));

为了确保一个元素存在,视图必须相对于该元素进行坍缩。我们通过QWSDataView的其中一个collapse_方法来实现。

// Get the transaction id for the transaction that created element 42
let transaction_id = qws.get_creator_transaction(forty_two_id).unwrap().id();

// Collapse the view further around that transaction
let query_view = query_view.collapse_transactions(&[transaction_id]).unwrap();

// Now we see that element 42 is in KnownPresent, from the perspective of the view
println!("status of 42 = {}", query_view.get_element_status(forty_two_id));

// And we only see "element 42" when we iterate over the query results
for element_id in query_view.elements_iter() {
    println!("element {}", qws.get_element(element_id).unwrap().get_payload::<i32>().unwrap());
}

概念示例

假设我正在将"contents_of_my_backpack"存储在QuantumWorldState中。一开始,我有[苹果、棒球比赛门票和五美元纸币],它们都是在查询的纪元中存在的,即它们都是存在的

然后我进行了一笔交易,我在便利店花掉五美元纸币,买了一块三明治。在这次交易之后的纪元,contents_of_my_backpack包含的所有内容的查询结果将是:[苹果、棒球比赛门票、三明治],但在较早的纪元,结果将是[苹果、棒球比赛门票、五美元纸币]。

五美元纸币和三明治在任何时刻都不可能同时存在于我的背包中。可以说,五美元纸币和三明治是相互纠缠的。不同的结果集代表了两个不同的世界状态,即它们在两个不同的纪元中存在的状态。

如果我在不坍缩纪元的情况下发布查询,我会得到以下结果:[苹果-P、棒球比赛门票-P、五美元纸币-S、三明治-S],其中'P'表示一个元素是已知的,'S'表示该元素处于叠加状态。

现在让我们考虑一个不同的现实,在那个现实中我更加不负责任或更加口渴。比如说,我选择用五美元纸币买一打啤酒。(这啤酒真的很便宜。)现在,在三个不同的纪元中可能会有三个可能的结果集被返回:1:[苹果、棒球比赛门票、五美元纸币],2:[苹果、棒球比赛门票、三明治],3:[苹果、棒球比赛门票、一打啤酒]。

但我可以折叠视图,使我只能看到包含“六罐啤酒”的结果,从而将我的可能结果集减少到只有:[苹果,棒球比赛门票,六罐啤酒]。这被称为部分折叠视图,因为只包含与“六罐啤酒”兼容的结果。然而,这不是完全折叠视图,因为“六罐啤酒”与苹果和棒球比赛门票之间不存在纠缠。

完全折叠与部分折叠

继续上面的例子,如果我用动物园门票交换了棒球比赛门票,我仍然可以自由决定是否购买六罐啤酒或三明治。在这种情况下,我仍然可以围绕六罐啤酒折叠视图,因此可能完全折叠的全局状态集合将是:1:[苹果,棒球比赛门票,六罐啤酒],2:[苹果,动物园门票,六罐啤酒]。

但如果我用五美元现金在体育场买了一个棒球场热狗,而不是在便利店买三明治或六罐啤酒呢?在这种情况下,棒球场热狗不仅与五美元现金纠缠,还与棒球比赛门票纠缠。因此,如果我想查询包含棒球场热狗的情况下的“背包内容”,唯一可能的结果是:[苹果,棒球比赛门票,棒球场热狗]。

棒球比赛门票和棒球场热狗之间的纠缠是不对称纠缠。也就是说,棒球场热狗的存在依赖于棒球比赛门票,直到棒球场热狗被创建,但与棒球场热狗无关的任何东西都不会影响棒球比赛门票。不对称纠缠是在一个元素被非破坏性地用作创建另一个元素的输入过程中创建的。这与真实的量子物理学不同,在真实的量子物理学中,每个相互作用都会使所有参与该相互作用的粒子纠缠,没有任何东西可以影响另一个东西,而不受到自己的影响。

如果量子物理学的隐喻有些陌生,幸运的是,我们软件人员已经通过如git这样的分布式源代码控制系统了解了这些概念。我们可以将git仓库视为源树中所有文件状态的量子世界状态,单个检出可以被视为一个折叠的世界状态,因为它存在于一个观察者面前。

依赖项

~1.4–2MB
~45K SLoC