CaDiCal2019学习笔记(2)

CaDiCal2019学习笔记(2)

读代码的初步心得:

1.将很多技术模块设计为结构体和类型,这些结构体和类型分别由相应的.hpp文件给出;与之相对应的同名.cpp并不都是类型的函数实现代码所在的文件。

结构体或类中的成员函数的实现代码通常在internal.cpp;   (少数除外,如version.hpp对应的version.cpp是与传统方式一致的)

同名的.cpp文件给出的是internal.hpp声明的函数,这些函数与目前标识名称所在类型关联性很强。

同名的.cpp文件头部没用如通常情况#include自己同名文件,而是#include "internal.hpp"

2.子句管理是硬核技术,所以有几个类型(Tracer、Checker)都是派生于observer类。

该类用于处理添加、派生或删除的子句的类。Proof observer class used to act on added, derived or deleted clauses.   

提供一众虚函数作为统一的函数接口。

virtual void add_original_clause (const vector<int> &) { }

virtual void add_derived_clause (const vector<int> &) { }

virtual void delete_clause (const vector<int> &) { }

3.编程指导思想创新之处:

使用opt标识使用的前提状态;

大量使用assert,确保每个函数的运行条件时正确的,便于纠错;

使用通用宏,实现统一操作。如打印。

将技术模块分为internal和external。

函数在调用时,其前面会加上命名空间、所属类名、成员类\结构体(或子对象)名等,被调用函数出现多个圆点.组成的前导,功能和来源一目了然。

有专门的统计数据类型,见stats.hpp,各个环节的数据信息以结构体形式组合,非常适合观测。为今后深入利用这些信息开展大数据处理及统计分析奠定了物质基础。——根据需要,可以不断增加。

采用了迭代器类:基类ClauseIterator和派生类ClauseCopier、基类WitnessIterator和派生类 WitnessCopier 。(声明在solver.cpp Line1023-1043)

采用装饰器技术简化操作函数和类型使用

 

4.主函数在:

 

5.Var类型的声明——关注的是传播进行是var在trail队列的对应信息(所在的层、蕴含来源的子句等)和局部搜索信息(walk阶段)等。

//----------------------------------------------------------------------------------------------------------------

struct Var {

// Note that none of these members is valid unless the variable is
// assigned. During unassigning a variable we do not reset it.

int level; // decision level
int trail; // trail height at assignment

union {

Clause * reason; // implication graph edge during search
int parent; // implication graph parent during probing

};

};

//----------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/yuweng1689/p/12670469.html
今日推荐