ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
factor.c File Reference
#include "factor.h"
#include "bump.h"
#include "clause.h"
#include "dense.h"
#include "heap.h"
#include "import.h"
#include "inline.h"
#include "inlineheap.h"
#include "inlinequeue.h"
#include "inlinevector.h"
#include "internal.h"
#include "logging.h"
#include "print.h"
#include "report.h"
#include "sort.h"
#include "terminate.h"
#include "vector.h"
#include "watch.h"
#include <string.h>
Include dependency graph for factor.c:

Go to the source code of this file.

Classes

struct  quotient
 
struct  scores
 
struct  factoring
 

Macros

#define FACTOR   1
 
#define QUOTIENT   2
 
#define NOUNTED   4
 

Typedefs

typedef struct quotient quotient
 
typedef struct scores scores
 
typedef struct factoring factoring
 

Functions

void kissat_factor (kissat *solver)
 

Macro Definition Documentation

◆ FACTOR

#define FACTOR   1

Definition at line 24 of file factor.c.

◆ NOUNTED

#define NOUNTED   4

Definition at line 26 of file factor.c.

◆ QUOTIENT

#define QUOTIENT   2

Definition at line 25 of file factor.c.

Typedef Documentation

◆ factoring

typedef struct factoring factoring

Definition at line 65 of file factor.c.

◆ quotient

typedef struct quotient quotient

Definition at line 37 of file factor.c.

◆ scores

typedef struct scores scores

Definition at line 44 of file factor.c.

Function Documentation

◆ kissat_factor()

void kissat_factor ( kissat * solver)

Definition at line 1083 of file factor.c.

1083 {
1084 KISSAT_assert (!solver->level);
1085 if (solver->inconsistent)
1086 return;
1087 if (!GET_OPTION (factor))
1088 return;
1089 statistics *s = &solver->statistics_;
1090 if (solver->limits.factor.marked >= s->literals_factor) {
1092 solver,
1093 "factorization skipped as no literals have been marked to be added "
1094 "(%" PRIu64 " < %" PRIu64,
1095 solver->limits.factor.marked, s->literals_factor);
1096 return;
1097 }
1098 START (factor);
1099 INC (factorizations);
1100 kissat_phase (solver, "factorization", GET (factorizations),
1101 "binary clause bounded variable addition");
1102 uint64_t limit = GET_OPTION (factoriniticks);
1103 if (s->factorizations > 1) {
1104 SET_EFFORT_LIMIT (tmp, factor, factor_ticks);
1105 limit = tmp;
1106 } else {
1108 "initially limiting to %" PRIu64
1109 " million factorization ticks",
1110 limit);
1111 limit *= 1e6;
1112 limit += s->factor_ticks;
1113 }
1114#ifndef KISSAT_QUIET
1115 struct {
1116 int64_t variables, binary, clauses, ticks;
1117 } before, after, delta;
1118 before.variables = s->variables_extension + s->variables_original;
1119 before.binary = BINARY_CLAUSES;
1120 before.clauses = IRREDUNDANT_CLAUSES;
1121 before.ticks = s->factor_ticks;
1122#endif
1124 connect_clauses_to_factor (solver);
1125 bool completed = run_factorization (solver, limit);
1127#ifndef KISSAT_QUIET
1128 after.variables = s->variables_extension + s->variables_original;
1129 after.binary = BINARY_CLAUSES;
1130 after.clauses = IRREDUNDANT_CLAUSES;
1131 after.ticks = s->factor_ticks;
1132 delta.variables = after.variables - before.variables;
1133 delta.binary = before.binary - after.binary;
1134 delta.clauses = before.clauses - after.clauses;
1135 delta.ticks = after.ticks - before.ticks;
1136 kissat_very_verbose (solver, "used %f million factorization ticks",
1137 delta.ticks * 1e-6);
1138 kissat_phase (solver, "factorization", GET (factorizations),
1139 "introduced %" PRId64 " extension variables %.0f%%",
1140 delta.variables,
1141 kissat_percent (delta.variables, before.variables));
1142 kissat_phase (solver, "factorization", GET (factorizations),
1143 "removed %" PRId64 " binary clauses %.0f%%", delta.binary,
1144 kissat_percent (delta.binary, before.binary));
1145 kissat_phase (solver, "factorization", GET (factorizations),
1146 "removed %" PRId64 " large clauses %.0f%%", delta.clauses,
1147 kissat_percent (delta.clauses, before.clauses));
1148#endif
1149 if (completed)
1150 solver->limits.factor.marked = s->literals_factor;
1151 STOP (factor);
1152}
#define INC(NAME)
void kissat_enter_dense_mode(kissat *solver, litpairs *irredundant)
Definition dense.c:101
void kissat_resume_sparse_mode(kissat *solver, bool flush_eliminated, litpairs *irredundant)
Definition dense.c:201
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD)
Definition limit.hpp:131
#define GET_OPTION(N)
Definition options.h:295
#define kissat_extremely_verbose(...)
Definition print.h:53
#define kissat_very_verbose(...)
Definition print.h:52
#define kissat_phase(...)
Definition print.h:48
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define IRREDUNDANT_CLAUSES
Definition statistics.h:337
#define BINARY_CLAUSES
Definition statistics.h:340
#define GET(NAME)
Definition statistics.h:416
Here is the call graph for this function: