ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cadical_kitten.c File Reference
#include "global.h"
#include "kitten.h"
#include "random.h"
#include "stack.h"
#include <assert.h>
#include <inttypes.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Include dependency graph for cadical_kitten.c:

Go to the source code of this file.

Classes

struct  kink
 
struct  klause
 
struct  statistics
 
struct  kimits
 
struct  cadical_kitten
 

Macros

#define CALLOC(T, P, N)
 
#define DEALLOC(P, N)
 
#define ENLARGE_STACK(S)
 
#define INC(NAME)
 
#define ADD(NAME, DELTA)
 
#define KITTEN_TICKS   (cadical_kitten->statistics.cadical_kitten_ticks)
 
#define INVALID   UINT_MAX
 
#define MAX_VARS   ((1u << 31) - 1)
 
#define CORE_FLAG   (1u)
 
#define LEARNED_FLAG   (2u)
 
#define KATCHES(KIT)
 
#define all_klauses(C)
 
#define all_original_klauses(C)
 
#define all_learned_klauses(C)
 
#define all_kits(KIT)
 
#define BEGIN_KLAUSE(C)
 
#define END_KLAUSE(C)
 
#define all_literals_in_klause(KIT, C)
 
#define all_antecedents(REF, C)
 
#define LOG(...)
 
#define ROG(...)
 
#define LOGLITS(...)
 
#define RESIZE1(T, P)
 
#define RESIZE2(T, P)
 
#define INVALID_API_USAGE(...)
 
#define REQUIRE_INITIALIZED()
 
#define REQUIRE_STATUS(EXPECTED)
 
#define UPDATE_STATUS(STATUS)
 

Typedefs

typedef struct kar kar
 
typedef struct kink kink
 
typedef struct klause klause
 
typedef struct statistics statistics
 
typedef struct kimits kimits
 

Functions

typedef STACK (unsigned)
 
cadical_kittencadical_kitten_init (void)
 
void cadical_kitten_track_antecedents (cadical_kitten *cadical_kitten)
 
void cadical_kitten_randomize_phases (cadical_kitten *cadical_kitten)
 
void cadical_kitten_flip_phases (cadical_kitten *cadical_kitten)
 
void cadical_kitten_no_ticks_limit (cadical_kitten *cadical_kitten)
 
uint64_t cadical_kitten_current_ticks (cadical_kitten *cadical_kitten)
 
void cadical_kitten_set_ticks_limit (cadical_kitten *cadical_kitten, uint64_t delta)
 
void cadical_kitten_no_terminator (cadical_kitten *cadical_kitten)
 
void cadical_kitten_set_terminator (cadical_kitten *cadical_kitten, void *data, int(*terminator)(void *))
 
void cadical_kitten_shuffle_clauses (cadical_kitten *cadical_kitten)
 
unsigned cadical_new_learned_klause (cadical_kitten *cadical_kitten)
 
void cadical_kitten_clear (cadical_kitten *cadical_kitten)
 
void cadical_kitten_release (cadical_kitten *cadical_kitten)
 
void cadical_completely_backtrack_to_root_level (cadical_kitten *cadical_kitten)
 
void cadical_kitten_assume (cadical_kitten *cadical_kitten, unsigned elit)
 
void cadical_kitten_assume_signed (cadical_kitten *cadical_kitten, int elit)
 
void cadical_kitten_clause_with_id_and_exception (cadical_kitten *cadical_kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
 
void citten_clause_with_id_and_exception (cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned except)
 
void citten_clause_with_id_and_equivalence (cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned lit, unsigned other)
 
void cadical_kitten_clause (cadical_kitten *cadical_kitten, size_t size, unsigned *elits)
 
void citten_clause_with_id (cadical_kitten *cadical_kitten, unsigned id, size_t size, int *elits)
 
void cadical_kitten_unit (cadical_kitten *cadical_kitten, unsigned lit)
 
void cadical_kitten_binary (cadical_kitten *cadical_kitten, unsigned a, unsigned b)
 
int cadical_kitten_solve (cadical_kitten *cadical_kitten)
 
int cadical_kitten_status (cadical_kitten *cadical_kitten)
 
unsigned cadical_kitten_compute_clausal_core (cadical_kitten *cadical_kitten, uint64_t *learned_ptr)
 
void cadical_kitten_traverse_core_ids (cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *, unsigned))
 
void cadical_kitten_traverse_core_clauses (cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
 
void cadical_kitten_traverse_core_clauses_with_id (cadical_kitten *cadical_kitten, void *state, void(*traverse)(void *state, unsigned, bool learned, size_t, const unsigned *))
 
void cadical_kitten_trace_core (cadical_kitten *cadical_kitten, void *state, void(*trace)(void *, unsigned, unsigned, bool, size_t, const unsigned *, size_t, const unsigned *))
 
void cadical_kitten_shrink_to_clausal_core (cadical_kitten *cadical_kitten)
 
signed char cadical_kitten_signed_value (cadical_kitten *cadical_kitten, int selit)
 
signed char cadical_kitten_value (cadical_kitten *cadical_kitten, unsigned elit)
 
signed char cadical_kitten_fixed (cadical_kitten *cadical_kitten, unsigned elit)
 
signed char cadical_kitten_fixed_signed (cadical_kitten *cadical_kitten, int elit)
 
bool cadical_kitten_flip_literal (cadical_kitten *cadical_kitten, unsigned elit)
 
bool cadical_kitten_flip_signed_literal (cadical_kitten *cadical_kitten, int elit)
 
bool cadical_kitten_failed (cadical_kitten *cadical_kitten, unsigned elit)
 
void cadical_kitten_add_prime_implicant (cadical_kitten *cadical_kitten, void *state, int side, void(*add_implicant)(void *, int, size_t, const unsigned *))
 
int cadical_kitten_compute_prime_implicant (cadical_kitten *cadical_kitten, void *state, bool(*ignore)(void *, unsigned))
 
int cadical_kitten_flip_and_implicant_for_signed_literal (cadical_kitten *cadical_kitten, int elit)
 

Variables

ABC_NAMESPACE_IMPL_START typedef signed char value
 

Macro Definition Documentation

◆ ADD

#define ADD ( NAME,
DELTA )
Value:
do { \
CADICAL_assert (statistics->NAME <= UINT64_MAX - (DELTA)); \
statistics->NAME += (DELTA); \
} while (0)
statistics statistics

Definition at line 69 of file cadical_kitten.c.

69#define ADD(NAME, DELTA) \
70 do { \
71 statistics *statistics = &cadical_kitten->statistics; \
72 CADICAL_assert (statistics->NAME <= UINT64_MAX - (DELTA)); \
73 statistics->NAME += (DELTA); \
74 } while (0)

◆ all_antecedents

#define all_antecedents ( REF,
C )
Value:
unsigned REF, *REF##_PTR = antecedents (C), \
*REF##_END = REF##_PTR + (C)->aux; \
REF##_PTR != REF##_END && ((REF = *REF##_PTR), true); \
++REF##_PTR

Definition at line 266 of file cadical_kitten.c.

266#define all_antecedents(REF, C) \
267 unsigned REF, *REF##_PTR = antecedents (C), \
268 *REF##_END = REF##_PTR + (C)->aux; \
269 REF##_PTR != REF##_END && ((REF = *REF##_PTR), true); \
270 ++REF##_PTR

◆ all_kits

#define all_kits ( KIT)
Value:
size_t KIT = 0, KIT_##END = cadical_kitten->lits; \
KIT != KIT_##END; \
KIT++

Definition at line 251 of file cadical_kitten.c.

251#define all_kits(KIT) \
252 size_t KIT = 0, KIT_##END = cadical_kitten->lits; \
253 KIT != KIT_##END; \
254 KIT++

◆ all_klauses

#define all_klauses ( C)
Value:
klause *C = begin_klauses (cadical_kitten), *end_##C = end_klauses (cadical_kitten); \
(C) != end_##C; \
(C) = next_klause (cadical_kitten, C)

Definition at line 234 of file cadical_kitten.c.

234#define all_klauses(C) \
235 klause *C = begin_klauses (cadical_kitten), *end_##C = end_klauses (cadical_kitten); \
236 (C) != end_##C; \
237 (C) = next_klause (cadical_kitten, C)

◆ all_learned_klauses

#define all_learned_klauses ( C)
Value:
klause *C = begin_learned_klauses (cadical_kitten), \
*end_##C = end_klauses (cadical_kitten); \
(C) != end_##C; \
(C) = next_klause (cadical_kitten, C)

Definition at line 245 of file cadical_kitten.c.

245#define all_learned_klauses(C) \
246 klause *C = begin_learned_klauses (cadical_kitten), \
247 *end_##C = end_klauses (cadical_kitten); \
248 (C) != end_##C; \
249 (C) = next_klause (cadical_kitten, C)

◆ all_literals_in_klause

#define all_literals_in_klause ( KIT,
C )
Value:
unsigned KIT, *KIT##_PTR = BEGIN_KLAUSE (C), \
*KIT##_END = END_KLAUSE (C); \
KIT##_PTR != KIT##_END && ((KIT = *KIT##_PTR), true); \
++KIT##_PTR
#define END_KLAUSE(C)
#define BEGIN_KLAUSE(C)

Definition at line 260 of file cadical_kitten.c.

260#define all_literals_in_klause(KIT, C) \
261 unsigned KIT, *KIT##_PTR = BEGIN_KLAUSE (C), \
262 *KIT##_END = END_KLAUSE (C); \
263 KIT##_PTR != KIT##_END && ((KIT = *KIT##_PTR), true); \
264 ++KIT##_PTR

◆ all_original_klauses

#define all_original_klauses ( C)
Value:
klause *C = begin_klauses (cadical_kitten), \
*end_##C = end_original_klauses (cadical_kitten); \
(C) != end_##C; \
(C) = next_klause (cadical_kitten, C)

Definition at line 239 of file cadical_kitten.c.

239#define all_original_klauses(C) \
240 klause *C = begin_klauses (cadical_kitten), \
241 *end_##C = end_original_klauses (cadical_kitten); \
242 (C) != end_##C; \
243 (C) = next_klause (cadical_kitten, C)

◆ BEGIN_KLAUSE

#define BEGIN_KLAUSE ( C)
Value:
(C)->lits

Definition at line 256 of file cadical_kitten.c.

◆ CALLOC

#define CALLOC ( T,
P,
N )
Value:
do { \
(P) = (T*)cadical_kitten_calloc (N, sizeof *(P)); \
} while (0)

Definition at line 38 of file cadical_kitten.c.

38#define CALLOC(T, P, N) \
39 do { \
40 (P) = (T*)cadical_kitten_calloc (N, sizeof *(P)); \
41 } while (0)

◆ CORE_FLAG

#define CORE_FLAG   (1u)

Definition at line 81 of file cadical_kitten.c.

◆ DEALLOC

#define DEALLOC ( P,
N )
Value:
free (P)
VOID_HACK free()

Definition at line 42 of file cadical_kitten.c.

◆ END_KLAUSE

#define END_KLAUSE ( C)
Value:
(BEGIN_KLAUSE (C) + (C)->size)

Definition at line 258 of file cadical_kitten.c.

◆ ENLARGE_STACK

#define ENLARGE_STACK ( S)
Value:
do { \
CADICAL_assert (FULL_STACK (S)); \
const size_t SIZE = SIZE_STACK (S); \
const size_t OLD_CAPACITY = CAPACITY_STACK (S); \
const size_t NEW_CAPACITY = OLD_CAPACITY ? 2 * OLD_CAPACITY : 1; \
const size_t BYTES = NEW_CAPACITY * sizeof *(S).begin; \
(S).begin = (unsigned*)realloc ((S).begin, BYTES); \
if (!(S).begin) \
die ("out of memory reallocating '%zu' bytes", BYTES); \
(S).allocated = (S).begin + NEW_CAPACITY; \
(S).end = (S).begin + SIZE; \
} while (0)
#define CAPACITY_STACK(S)
Definition stack.h:20
#define SIZE_STACK(S)
Definition stack.h:19
#define FULL_STACK(S)
Definition stack.h:17
#define SIZE(set)
Definition espresso.h:112
char * realloc()

Definition at line 46 of file cadical_kitten.c.

46#define ENLARGE_STACK(S) \
47 do { \
48 CADICAL_assert (FULL_STACK (S)); \
49 const size_t SIZE = SIZE_STACK (S); \
50 const size_t OLD_CAPACITY = CAPACITY_STACK (S); \
51 const size_t NEW_CAPACITY = OLD_CAPACITY ? 2 * OLD_CAPACITY : 1; \
52 const size_t BYTES = NEW_CAPACITY * sizeof *(S).begin; \
53 (S).begin = (unsigned*)realloc ((S).begin, BYTES); \
54 if (!(S).begin) \
55 die ("out of memory reallocating '%zu' bytes", BYTES); \
56 (S).allocated = (S).begin + NEW_CAPACITY; \
57 (S).end = (S).begin + SIZE; \
58 } while (0)

◆ INC

#define INC ( NAME)
Value:
do { \
CADICAL_assert (statistics->NAME < UINT64_MAX); \
statistics->NAME++; \
} while (0)

Definition at line 62 of file cadical_kitten.c.

62#define INC(NAME) \
63 do { \
64 statistics *statistics = &cadical_kitten->statistics; \
65 CADICAL_assert (statistics->NAME < UINT64_MAX); \
66 statistics->NAME++; \
67 } while (0)

◆ INVALID

#define INVALID   UINT_MAX

Definition at line 78 of file cadical_kitten.c.

◆ INVALID_API_USAGE

#define INVALID_API_USAGE ( ...)
Value:
invalid_api_usage (__func__, __VA_ARGS__)

Definition at line 579 of file cadical_kitten.c.

◆ KATCHES

#define KATCHES ( KIT)
Value:
#define CADICAL_assert(ignore)
Definition global.h:14

Definition at line 232 of file cadical_kitten.c.

◆ KITTEN_TICKS

#define KITTEN_TICKS   (cadical_kitten->statistics.cadical_kitten_ticks)

Definition at line 76 of file cadical_kitten.c.

◆ LEARNED_FLAG

#define LEARNED_FLAG   (2u)

Definition at line 82 of file cadical_kitten.c.

◆ LOG

#define LOG ( ...)
Value:
do { \
} while (0)

Definition at line 368 of file cadical_kitten.c.

368#define LOG(...) \
369 do { \
370 } while (0)

◆ LOGLITS

#define LOGLITS ( ...)
Value:
do { \
} while (0)

Definition at line 374 of file cadical_kitten.c.

374#define LOGLITS(...) \
375 do { \
376 } while (0)

◆ MAX_VARS

#define MAX_VARS   ((1u << 31) - 1)

Definition at line 79 of file cadical_kitten.c.

◆ REQUIRE_INITIALIZED

#define REQUIRE_INITIALIZED ( )
Value:
do { \
INVALID_API_USAGE ("solver argument zero"); \
} while (0)

Definition at line 581 of file cadical_kitten.c.

581#define REQUIRE_INITIALIZED() \
582 do { \
583 if (!cadical_kitten) \
584 INVALID_API_USAGE ("solver argument zero"); \
585 } while (0)

◆ REQUIRE_STATUS

#define REQUIRE_STATUS ( EXPECTED)
Value:
do { \
REQUIRE_INITIALIZED (); \
if (cadical_kitten->status != (EXPECTED)) \
INVALID_API_USAGE ("invalid status '%s' (expected '%s')", \
status_to_string (cadical_kitten->status), \
status_to_string (EXPECTED)); \
} while (0)

Definition at line 587 of file cadical_kitten.c.

587#define REQUIRE_STATUS(EXPECTED) \
588 do { \
589 REQUIRE_INITIALIZED (); \
590 if (cadical_kitten->status != (EXPECTED)) \
591 INVALID_API_USAGE ("invalid status '%s' (expected '%s')", \
592 status_to_string (cadical_kitten->status), \
593 status_to_string (EXPECTED)); \
594 } while (0)

◆ RESIZE1

#define RESIZE1 ( T,
P )
Value:
do { \
void *OLD_PTR = (P); \
CALLOC (T, (P), new_size / 2); \
const size_t BYTES = old_vars * sizeof *(P); \
memcpy ((P), OLD_PTR, BYTES); \
void *NEW_PTR = (P); \
(P) = (T*)OLD_PTR; \
DEALLOC ((P), old_size / 2); \
(P) = (T*)NEW_PTR; \
} while (0)

Definition at line 495 of file cadical_kitten.c.

495#define RESIZE1(T, P) \
496 do { \
497 void *OLD_PTR = (P); \
498 CALLOC (T, (P), new_size / 2); \
499 const size_t BYTES = old_vars * sizeof *(P); \
500 memcpy ((P), OLD_PTR, BYTES); \
501 void *NEW_PTR = (P); \
502 (P) = (T*)OLD_PTR; \
503 DEALLOC ((P), old_size / 2); \
504 (P) = (T*)NEW_PTR; \
505 } while (0)

◆ RESIZE2

#define RESIZE2 ( T,
P )
Value:
do { \
void *OLD_PTR = (P); \
CALLOC (T, (P), new_size); \
const size_t BYTES = old_lits * sizeof *(P); \
memcpy ((P), OLD_PTR, BYTES); \
void *NEW_PTR = (P); \
(P) = (T*)OLD_PTR; \
DEALLOC ((P), old_size); \
(P) = (T*)NEW_PTR; \
} while (0)

Definition at line 507 of file cadical_kitten.c.

507#define RESIZE2(T, P) \
508 do { \
509 void *OLD_PTR = (P); \
510 CALLOC (T, (P), new_size); \
511 const size_t BYTES = old_lits * sizeof *(P); \
512 memcpy ((P), OLD_PTR, BYTES); \
513 void *NEW_PTR = (P); \
514 (P) = (T*)OLD_PTR; \
515 DEALLOC ((P), old_size); \
516 (P) = (T*)NEW_PTR; \
517 } while (0)

◆ ROG

#define ROG ( ...)
Value:
do { \
} while (0)

Definition at line 371 of file cadical_kitten.c.

371#define ROG(...) \
372 do { \
373 } while (0)

◆ UPDATE_STATUS

#define UPDATE_STATUS ( STATUS)
Value:
do { \
if (cadical_kitten->status != (STATUS)) \
LOG ("updating status from '%s' to '%s'", \
status_to_string (cadical_kitten->status), status_to_string (STATUS)); \
else \
LOG ("keeping status at '%s'", status_to_string (STATUS)); \
cadical_kitten->status = (STATUS); \
} while (0)

Definition at line 596 of file cadical_kitten.c.

596#define UPDATE_STATUS(STATUS) \
597 do { \
598 if (cadical_kitten->status != (STATUS)) \
599 LOG ("updating status from '%s' to '%s'", \
600 status_to_string (cadical_kitten->status), status_to_string (STATUS)); \
601 else \
602 LOG ("keeping status at '%s'", status_to_string (STATUS)); \
603 cadical_kitten->status = (STATUS); \
604 } while (0)

Typedef Documentation

◆ kar

typedef struct kar kar

Definition at line 86 of file cadical_kitten.c.

◆ kimits

typedef struct kimits kimits

Definition at line 129 of file cadical_kitten.c.

◆ kink

typedef struct kink kink

Definition at line 87 of file cadical_kitten.c.

◆ klause

typedef struct klause klause

Definition at line 88 of file cadical_kitten.c.

◆ statistics

typedef struct statistics statistics

Definition at line 112 of file cadical_kitten.c.

Function Documentation

◆ cadical_completely_backtrack_to_root_level()

void cadical_completely_backtrack_to_root_level ( cadical_kitten * cadical_kitten)

Definition at line 1149 of file cadical_kitten.c.

1149 {
1150 check_queue (cadical_kitten);
1151 LOG ("completely backtracking to level 0");
1152 value *values = cadical_kitten->values;
1153 unsigneds *trail = &cadical_kitten->trail;
1154 unsigneds *units = &cadical_kitten->units;
1155#ifndef CADICAL_NDEBUG
1156 kar *vars = cadical_kitten->vars;
1157#endif
1158 for (all_stack (unsigned, lit, *trail)) {
1159 CADICAL_assert (vars[lit / 2].level);
1160 unassign (cadical_kitten, values, lit);
1161 }
1162 CLEAR_STACK (*trail);
1163 for (all_stack (unsigned, ref, *units)) {
1164 klause *c = dereference_klause (cadical_kitten, ref);
1165 CADICAL_assert (c->size == 1);
1166 const unsigned unit = c->lits[0];
1167 const value value = values[unit];
1168 if (value <= 0)
1169 continue;
1170 unassign (cadical_kitten, values, unit);
1171 }
1173 cadical_kitten->level = 0;
1174 check_queue (cadical_kitten);
1175}
#define all_stack(T, E, S)
Definition stack.h:94
#define CLEAR_STACK(S)
Definition stack.h:50
#define LOG(...)
ABC_NAMESPACE_IMPL_START typedef signed char value
struct kar kar
int lit
Definition satVec.h:130
unsigned size
unsigned lits[1]
Here is the caller graph for this function:

◆ cadical_kitten_add_prime_implicant()

void cadical_kitten_add_prime_implicant ( cadical_kitten * cadical_kitten,
void * state,
int side,
void(* add_implicant )(void *, int, size_t, const unsigned *) )

Definition at line 2350 of file cadical_kitten.c.

2352 {
2353 REQUIRE_STATUS (11);
2354 // might be possible in some edge cases
2355 unsigneds *prime = &cadical_kitten->prime[side];
2356 unsigneds *prime2 = &cadical_kitten->prime[!side];
2357 CADICAL_assert (!EMPTY_STACK (*prime) || !EMPTY_STACK (*prime2));
2358 CLEAR_STACK (*prime2);
2359
2360 for (all_stack (unsigned, lit, *prime)) {
2361 const unsigned not_lit = lit ^ 1;
2362 const unsigned elit = export_literal (cadical_kitten, not_lit);
2363 PUSH_STACK (*prime2, elit);
2364 }
2365
2366 // adds a clause which will reset cadical_kitten status and backtrack
2367 add_implicant (state, side, SIZE_STACK (*prime2), BEGIN_STACK (*prime2));
2368 CLEAR_STACK (*prime);
2369 CLEAR_STACK (*prime2);
2370}
#define BEGIN_STACK(S)
Definition stack.h:46
#define EMPTY_STACK(S)
Definition stack.h:18
#define PUSH_STACK(S, E)
Definition stack.h:39
#define REQUIRE_STATUS(EXPECTED)
unsigneds prime[2]

◆ cadical_kitten_assume()

void cadical_kitten_assume ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 1732 of file cadical_kitten.c.

1732 {
1735 reset_incremental (cadical_kitten);
1736 const unsigned ilit = import_literal (cadical_kitten, elit);
1737 LOG ("registering assumption %u", ilit);
1739}
#define REQUIRE_INITIALIZED()
unsigneds assumptions
Here is the caller graph for this function:

◆ cadical_kitten_assume_signed()

void cadical_kitten_assume_signed ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 1741 of file cadical_kitten.c.

1741 {
1742 unsigned kelit = int2u (elit);
1744}
void cadical_kitten_assume(cadical_kitten *cadical_kitten, unsigned elit)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_binary()

void cadical_kitten_binary ( cadical_kitten * cadical_kitten,
unsigned a,
unsigned b )

Definition at line 1848 of file cadical_kitten.c.

1848 {
1849 unsigned clause[2] = {a, b};
1851}
void cadical_kitten_clause(cadical_kitten *cadical_kitten, size_t size, unsigned *elits)
Here is the call graph for this function:

◆ cadical_kitten_clause()

void cadical_kitten_clause ( cadical_kitten * cadical_kitten,
size_t size,
unsigned * elits )

Definition at line 1834 of file cadical_kitten.c.

1834 {
1836 INVALID);
1837}
void cadical_kitten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
#define INVALID
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_clause_with_id_and_exception()

void cadical_kitten_clause_with_id_and_exception ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
const unsigned * elits,
unsigned except )

Definition at line 1746 of file cadical_kitten.c.

1749 {
1752 reset_incremental (cadical_kitten);
1754 const unsigned *const end = elits + size;
1755 for (const unsigned *p = elits; p != end; p++) {
1756 const unsigned elit = *p;
1757 if (elit == except)
1758 continue;
1759 const unsigned ilit = import_literal (cadical_kitten, elit);
1760 CADICAL_assert (ilit < cadical_kitten->lits);
1761 const unsigned iidx = ilit / 2;
1762 if (cadical_kitten->marks[iidx])
1763 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1764 elit / 2, elit);
1765 cadical_kitten->marks[iidx] = true;
1767 }
1768 for (unsigned *p = cadical_kitten->klause.begin; p != cadical_kitten->klause.end; p++)
1769 cadical_kitten->marks[*p / 2] = false;
1770 new_original_klause (cadical_kitten, id);
1772}
#define INVALID_API_USAGE(...)
Cube * p
Definition exorList.c:222
unsigned long long size
Definition giaNewBdd.h:39
Here is the caller graph for this function:

◆ cadical_kitten_clear()

void cadical_kitten_clear ( cadical_kitten * cadical_kitten)

Definition at line 899 of file cadical_kitten.c.

899 {
900 LOG ("clear cadical_kitten of size %zu", cadical_kitten->size);
901
905
915
916 for (all_kits (kit))
917 CLEAR_STACK (KATCHES (kit));
918
921
922 const size_t lits = cadical_kitten->size;
923 const unsigned vars = lits / 2;
924
925#ifndef CADICAL_NDEBUG
926 for (unsigned i = 0; i < vars; i++)
928#endif
929
930 memset (cadical_kitten->phases, 0, vars);
931 memset (cadical_kitten->values, 0, lits);
932 memset (cadical_kitten->failed, 0, lits);
933 memset (cadical_kitten->vars, 0, vars);
934
935 clear_cadical_kitten (cadical_kitten);
936}
#define POP_STACK(S)
Definition stack.h:37
#define KATCHES(KIT)
#define all_kits(KIT)
unsigned char * phases
unsigned * import
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_compute_clausal_core()

unsigned cadical_kitten_compute_clausal_core ( cadical_kitten * cadical_kitten,
uint64_t * learned_ptr )

Definition at line 1907 of file cadical_kitten.c.

1908 {
1909 REQUIRE_STATUS (20);
1910
1912 INVALID_API_USAGE ("antecedents not tracked");
1913
1914 LOG ("computing clausal core");
1915
1916 unsigneds *resolved = &cadical_kitten->resolved;
1917 CADICAL_assert (EMPTY_STACK (*resolved));
1918
1919 unsigned original = 0;
1920 uint64_t learned = 0;
1921
1922 unsigned reason_ref = cadical_kitten->inconsistent;
1923
1924 if (reason_ref == INVALID) {
1926 reason_ref = cadical_kitten->failing;
1927 if (reason_ref == INVALID) {
1928 LOG ("assumptions mutually inconsistent");
1929 //goto DONE;
1930 if (learned_ptr)
1931 *learned_ptr = learned;
1932
1933 LOG ("clausal core of %u original clauses", original);
1934 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1937 UPDATE_STATUS (21);
1938
1939 return original;
1940 }
1941 }
1942
1943 PUSH_STACK (*resolved, reason_ref);
1944 unsigneds *core = &cadical_kitten->core;
1945 CADICAL_assert (EMPTY_STACK (*core));
1946
1947 while (!EMPTY_STACK (*resolved)) {
1948 const unsigned c_ref = POP_STACK (*resolved);
1949 if (c_ref == INVALID) {
1950 const unsigned d_ref = POP_STACK (*resolved);
1951 ROG (d_ref, "core[%zu]", SIZE_STACK (*core));
1952 PUSH_STACK (*core, d_ref);
1953 klause *d = dereference_klause (cadical_kitten, d_ref);
1954 CADICAL_assert (!is_core_klause (d));
1955 set_core_klause (d);
1956 if (is_learned_klause (d))
1957 learned++;
1958 else
1959 original++;
1960 } else {
1961 klause *c = dereference_klause (cadical_kitten, c_ref);
1962 if (is_core_klause (c))
1963 continue;
1964 PUSH_STACK (*resolved, c_ref);
1965 PUSH_STACK (*resolved, INVALID);
1966 ROG (c_ref, "analyzing antecedent core");
1967 if (!is_learned_klause (c))
1968 continue;
1969 for (all_antecedents (d_ref, c)) {
1970 klause *d = dereference_klause (cadical_kitten, d_ref);
1971 if (!is_core_klause (d))
1972 PUSH_STACK (*resolved, d_ref);
1973 }
1974 }
1975 }
1976
1977 //DONE:
1978
1979 if (learned_ptr)
1980 *learned_ptr = learned;
1981
1982 LOG ("clausal core of %u original clauses", original);
1983 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1986 UPDATE_STATUS (21);
1987
1988 return original;
1989}
#define all_antecedents(REF, C)
#define ROG(...)
#define UPDATE_STATUS(STATUS)
unsigned inconsistent
uint64_t original
uint64_t learned
Here is the caller graph for this function:

◆ cadical_kitten_compute_prime_implicant()

int cadical_kitten_compute_prime_implicant ( cadical_kitten * cadical_kitten,
void * state,
bool(* ignore )(void *, unsigned) )

Definition at line 2376 of file cadical_kitten.c.

2377 {
2378 REQUIRE_STATUS (10);
2379
2380 value *values = cadical_kitten->values;
2381 kar *vars = cadical_kitten->vars;
2382 unsigneds unassigned;
2383 INIT_STACK (unassigned);
2384 bool limit_hit = 0;
2386 for (int i = 0; i < 2; i++) {
2387 const bool ignoring = i;
2388 for (all_stack (unsigned, lit, cadical_kitten->trail)) {
2390 LOG ("ticks limit %" PRIu64 " hit after %" PRIu64 " ticks",
2392 limit_hit = 1;
2393 break;
2394 }
2395 CADICAL_assert (values[lit] > 0);
2396 const unsigned idx = lit / 2;
2397 const unsigned ref = vars[idx].reason;
2398 CADICAL_assert (vars[idx].level);
2399 klause *c = 0;
2400 if (ref != INVALID)
2401 c = dereference_klause (cadical_kitten, ref);
2402 if (ref == INVALID || is_learned_klause (c) ||
2403 ignore (state, c->aux) == ignoring) {
2404 LOG ("non-prime candidate var %d", idx);
2405 if (prime_propagate (cadical_kitten, idx, state, ignoring, ignore)) {
2406 values[lit] = 0;
2407 values[lit ^ 1] = 0;
2408 PUSH_STACK (unassigned, lit);
2409 } else
2410 CADICAL_assert (values[lit] > 0);
2411 }
2412 }
2413 unsigneds *prime = &cadical_kitten->prime[i];
2414 // push on prime implicant stack.
2415 for (all_kits (lit)) {
2416 if (values[lit] > 0)
2417 PUSH_STACK (*prime, lit);
2418 }
2419 // reassign all literals on
2420 for (all_stack (unsigned, lit, unassigned)) {
2421 CADICAL_assert (!values[lit]);
2422 values[lit] = 1;
2423 values[lit ^ 1] = -1;
2424 }
2425 CLEAR_STACK (unassigned);
2426 }
2427 RELEASE_STACK (unassigned);
2428
2429 if (limit_hit) {
2432 return -1;
2433 }
2434 // the only case when one of the prime implicants is allowed to be empty
2435 // is if ignore returns always true or always false.
2438 UPDATE_STATUS (11);
2439
2441 return res;
2442}
#define RELEASE_STACK(S)
Definition stack.h:71
#define INIT_STACK(S)
Definition stack.h:22
#define KITTEN_TICKS
unsigned short ref
Definition giaNewBdd.h:38
uint64_t ticks
unsigned aux

◆ cadical_kitten_current_ticks()

uint64_t cadical_kitten_current_ticks ( cadical_kitten * cadical_kitten)

Definition at line 686 of file cadical_kitten.c.

686 {
688 const uint64_t current = KITTEN_TICKS;
689 return current;
690}
Here is the caller graph for this function:

◆ cadical_kitten_failed()

bool cadical_kitten_failed ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2275 of file cadical_kitten.c.

2275 {
2276 REQUIRE_STATUS (20);
2277 const unsigned eidx = elit / 2;
2278 if (eidx >= cadical_kitten->evars)
2279 return false;
2280 unsigned iidx = cadical_kitten->import[eidx];
2281 if (!iidx)
2282 return false;
2283 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2284 return cadical_kitten->failed[ilit];
2285}

◆ cadical_kitten_fixed()

signed char cadical_kitten_fixed ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2232 of file cadical_kitten.c.

2232 {
2233 const unsigned eidx = elit / 2;
2234 if (eidx >= cadical_kitten->evars)
2235 return 0;
2236 unsigned iidx = cadical_kitten->import[eidx];
2237 if (!iidx)
2238 return 0;
2239 iidx--;
2240 const unsigned ilit = 2 * iidx + (elit & 1);
2241 signed char res = cadical_kitten->values[ilit];
2242 if (!res)
2243 return 0;
2244 kar *v = cadical_kitten->vars + iidx;
2245 if (v->level)
2246 return 0;
2247 return res;
2248}
Here is the caller graph for this function:

◆ cadical_kitten_fixed_signed()

signed char cadical_kitten_fixed_signed ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 2250 of file cadical_kitten.c.

2250 {
2251 unsigned kelit = int2u (elit);
2252 return cadical_kitten_fixed (cadical_kitten, kelit);
2253}
signed char cadical_kitten_fixed(cadical_kitten *cadical_kitten, unsigned elit)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_flip_and_implicant_for_signed_literal()

int cadical_kitten_flip_and_implicant_for_signed_literal ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 2595 of file cadical_kitten.c.

2596 {
2597 REQUIRE_STATUS (10);
2598 unsigned kelit = int2u (elit);
2600 return -2;
2601 }
2602 const unsigned eidx = kelit / 2;
2603 unsigned iidx = cadical_kitten->import[eidx];
2604 CADICAL_assert (iidx);
2605 const unsigned ilit = 2 * (iidx - 1) + (kelit & 1);
2606 return compute_prime_implicant_for (cadical_kitten, ilit);
2607}
bool cadical_kitten_flip_literal(cadical_kitten *cadical_kitten, unsigned elit)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_flip_literal()

bool cadical_kitten_flip_literal ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2255 of file cadical_kitten.c.

2255 {
2256 REQUIRE_STATUS (10);
2257 const unsigned eidx = elit / 2;
2258 if (eidx >= cadical_kitten->evars)
2259 return false;
2260 unsigned iidx = cadical_kitten->import[eidx];
2261 if (!iidx)
2262 return false;
2263 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2265 return false;
2266 return flip_literal (cadical_kitten, ilit);
2267}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_flip_phases()

void cadical_kitten_flip_phases ( cadical_kitten * cadical_kitten)

Definition at line 659 of file cadical_kitten.c.

659 {
661
662 LOG ("flipping phases");
663
664 unsigned char *phases = cadical_kitten->phases;
665 const unsigned vars = cadical_kitten->size / 2;
666
667 unsigned i = 0;
668 const unsigned rest = vars & ~7u;
669
670 while (i != rest) {
671 uint64_t *p = (uint64_t *) (phases + i);
672 *p ^= 0x0101010101010101;
673 i += 8;
674 }
675
676 while (i != vars)
677 phases[i++] ^= 1;
678}

◆ cadical_kitten_flip_signed_literal()

bool cadical_kitten_flip_signed_literal ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 2269 of file cadical_kitten.c.

2269 {
2270 REQUIRE_STATUS (10);
2271 unsigned kelit = int2u (elit);
2273}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_init()

cadical_kitten * cadical_kitten_init ( void )

Definition at line 606 of file cadical_kitten.c.

606 {
609 initialize_cadical_kitten (cadical_kitten);
610 return cadical_kitten;
611}
#define CALLOC(T, P, N)
Here is the caller graph for this function:

◆ cadical_kitten_no_terminator()

void cadical_kitten_no_terminator ( cadical_kitten * cadical_kitten)

Definition at line 707 of file cadical_kitten.c.

707 {
709 LOG ("removing terminator");
712}
int(* terminator)(void *)

◆ cadical_kitten_no_ticks_limit()

void cadical_kitten_no_ticks_limit ( cadical_kitten * cadical_kitten)

Definition at line 680 of file cadical_kitten.c.

680 {
682 LOG ("forcing no ticks limit");
683 cadical_kitten->limits.ticks = UINT64_MAX;
684}

◆ cadical_kitten_randomize_phases()

void cadical_kitten_randomize_phases ( cadical_kitten * cadical_kitten)

Definition at line 627 of file cadical_kitten.c.

627 {
629
630 LOG ("randomizing phases");
631
632 unsigned char *phases = cadical_kitten->phases;
633 const unsigned vars = cadical_kitten->size / 2;
634
635 uint64_t random = kissat_next_random64 (&cadical_kitten->generator);
636
637 unsigned i = 0;
638 const unsigned rest = vars & ~63u;
639
640 while (i != rest) {
641 uint64_t *p = (uint64_t *) (phases + i);
642 p[0] = (random >> 0) & 0x0101010101010101;
643 p[1] = (random >> 1) & 0x0101010101010101;
644 p[2] = (random >> 2) & 0x0101010101010101;
645 p[3] = (random >> 3) & 0x0101010101010101;
646 p[4] = (random >> 4) & 0x0101010101010101;
647 p[5] = (random >> 5) & 0x0101010101010101;
648 p[6] = (random >> 6) & 0x0101010101010101;
649 p[7] = (random >> 7) & 0x0101010101010101;
650 random = kissat_next_random64 (&cadical_kitten->generator);
651 i += 64;
652 }
653
654 unsigned shift = 0;
655 while (i != vars)
656 phases[i++] = (random >> shift++) & 1;
657}
long random()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_release()

void cadical_kitten_release ( cadical_kitten * cadical_kitten)

Definition at line 938 of file cadical_kitten.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_set_terminator()

void cadical_kitten_set_terminator ( cadical_kitten * cadical_kitten,
void * data,
int(* terminator )(void *) )

Definition at line 714 of file cadical_kitten.c.

715 {
717 LOG ("setting terminator");
718 cadical_kitten->terminator = terminator;
720}
Here is the caller graph for this function:

◆ cadical_kitten_set_ticks_limit()

void cadical_kitten_set_ticks_limit ( cadical_kitten * cadical_kitten,
uint64_t delta )

Definition at line 692 of file cadical_kitten.c.

692 {
694 const uint64_t current = KITTEN_TICKS;
695 uint64_t limit;
696 if (UINT64_MAX - delta <= current) {
697 LOG ("forcing unlimited ticks limit");
698 limit = UINT64_MAX;
699 } else {
700 limit = current + delta;
701 LOG ("new limit of %" PRIu64 " ticks after %" PRIu64, limit, delta);
702 }
703
704 cadical_kitten->limits.ticks = limit;
705}
Here is the caller graph for this function:

◆ cadical_kitten_shrink_to_clausal_core()

void cadical_kitten_shrink_to_clausal_core ( cadical_kitten * cadical_kitten)

Definition at line 2133 of file cadical_kitten.c.

2133 {
2134 REQUIRE_STATUS (21);
2135
2136 LOG ("shrinking formula to core of original clauses");
2137
2139
2142 cadical_kitten->level = 0;
2143
2144 update_search (cadical_kitten, cadical_kitten->queue.last);
2145
2147
2148 for (all_kits (lit))
2150
2152 klause *inconsistent = dereference_klause (cadical_kitten, cadical_kitten->inconsistent);
2153 if (is_learned_klause (inconsistent) || inconsistent->size) {
2154 ROG (cadical_kitten->inconsistent, "resetting inconsistent");
2156 } else
2157 ROG (cadical_kitten->inconsistent, "keeping inconsistent");
2158
2160
2161 klause *begin = begin_klauses (cadical_kitten), *q = begin;
2162 klause const *const end = end_original_klauses (cadical_kitten);
2163#ifdef LOGGING
2164 unsigned original = 0;
2165#endif
2166 for (klause *c = begin, *next; c != end; c = next) {
2167 next = next_klause (cadical_kitten, c);
2168 // CADICAL_assert (!is_learned_klause (c)); not necessarily true
2169 if (is_learned_klause (c))
2170 continue;
2171 if (!is_core_klause (c))
2172 continue;
2173 unset_core_klause (c);
2174 const unsigned dst = (unsigned *) q - (unsigned *) begin;
2175 const unsigned size = c->size;
2176 if (!size) {
2179 } else if (size == 1) {
2181 ROG (dst, "keeping");
2182 } else {
2183 watch_klause (cadical_kitten, c->lits[0], dst);
2184 watch_klause (cadical_kitten, c->lits[1], dst);
2185 }
2186 if (c == q)
2187 q = next;
2188 else {
2189 const size_t bytes = (char *) next - (char *) c;
2190 memmove (q, c, bytes);
2191 q = (klause *) ((char *) q + bytes);
2192 }
2193#ifdef LOGGING
2194 original++;
2195#endif
2196 }
2197 SET_END_OF_STACK (cadical_kitten->klauses, (unsigned *) q);
2199 LOG ("end of original clauses at %zu", cadical_kitten->end_original_ref);
2200 LOG ("%u original clauses left", original);
2201
2203
2204 UPDATE_STATUS (0);
2205}
#define SET_END_OF_STACK(S, P)
Definition stack.h:62
struct cadical_kitten::@204357353010102162247340364316301064170137016325 queue
char * memmove()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_shuffle_clauses()

void cadical_kitten_shuffle_clauses ( cadical_kitten * cadical_kitten)

Definition at line 764 of file cadical_kitten.c.

764 {
765 REQUIRE_STATUS (0);
766 shuffle_queue (cadical_kitten);
767 shuffle_katches (cadical_kitten);
768 shuffle_units (cadical_kitten);
769}
Here is the caller graph for this function:

◆ cadical_kitten_signed_value()

signed char cadical_kitten_signed_value ( cadical_kitten * cadical_kitten,
int selit )

Definition at line 2207 of file cadical_kitten.c.

2207 {
2208 REQUIRE_STATUS (10);
2209 const unsigned elit = int2u (selit);
2210 const unsigned eidx = elit / 2;
2211 if (eidx >= cadical_kitten->evars)
2212 return 0;
2213 unsigned iidx = cadical_kitten->import[eidx];
2214 if (!iidx)
2215 return 0;
2216 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2217 return cadical_kitten->values[ilit];
2218}
Here is the caller graph for this function:

◆ cadical_kitten_solve()

int cadical_kitten_solve ( cadical_kitten * cadical_kitten)

Definition at line 1853 of file cadical_kitten.c.

1853 {
1856 reset_incremental (cadical_kitten);
1857 else // if (cadical_kitten->level)
1859
1860 LOG ("starting solving under %zu assumptions",
1862
1863 INC (cadical_kitten_solved);
1864
1865 int res = propagate_units (cadical_kitten);
1866 while (!res) {
1867 const unsigned conflict = propagate (cadical_kitten);
1870 LOG ("terminator requested termination");
1871 res = -1;
1872 break;
1873 }
1874 if (conflict != INVALID) {
1875 if (cadical_kitten->level)
1876 analyze (cadical_kitten, conflict);
1877 else {
1878 inconsistent (cadical_kitten, conflict);
1879 res = 20;
1880 }
1881 } else
1882 res = decide (cadical_kitten);
1883 }
1884
1885 if (res < 0)
1886 res = 0;
1887
1888 if (!res && !EMPTY_STACK (cadical_kitten->assumptions))
1889 reset_assumptions (cadical_kitten);
1890
1891 UPDATE_STATUS (res);
1892
1893 if (res == 10)
1894 INC (cadical_kitten_sat);
1895 else if (res == 20)
1896 INC (cadical_kitten_unsat);
1897 else
1898 INC (cadical_kitten_unknown);
1899
1900 LOG ("finished solving with result %d", res);
1901
1902 return res;
1903}
#define INC(NAME)
void cadical_completely_backtrack_to_root_level(cadical_kitten *cadical_kitten)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_status()

int cadical_kitten_status ( cadical_kitten * cadical_kitten)

Definition at line 1905 of file cadical_kitten.c.

1905{ return cadical_kitten->status; }
Here is the caller graph for this function:

◆ cadical_kitten_trace_core()

void cadical_kitten_trace_core ( cadical_kitten * cadical_kitten,
void * state,
void(* trace )(void *, unsigned, unsigned, bool, size_t, const unsigned *, size_t, const unsigned *) )

Definition at line 2085 of file cadical_kitten.c.

2088 {
2089 REQUIRE_STATUS (21);
2090
2091 LOG ("tracing clausal core");
2092
2093 unsigned traced = 0;
2094
2095 for (all_stack (unsigned, c_ref, cadical_kitten->core)) {
2096 klause *c = dereference_klause (cadical_kitten, c_ref);
2097 CADICAL_assert (is_core_klause (c));
2098 const bool learned = is_learned_klause (c);
2099 unsigneds *eclause = &cadical_kitten->eclause;
2100 CADICAL_assert (EMPTY_STACK (*eclause));
2101 for (all_literals_in_klause (ilit, c)) {
2102 const unsigned elit = export_literal (cadical_kitten, ilit);
2103 PUSH_STACK (*eclause, elit);
2104 }
2105 const size_t size = SIZE_STACK (*eclause);
2106 const unsigned *elits = eclause->begin;
2107
2108 unsigneds *resolved = &cadical_kitten->resolved;
2109 CADICAL_assert (EMPTY_STACK (*resolved));
2110 if (learned) {
2111 for (all_antecedents (ref, c)) {
2112 PUSH_STACK (*resolved, ref);
2113 }
2114 }
2115 const size_t rsize = SIZE_STACK (*resolved);
2116 const unsigned *rids = resolved->begin;
2117
2118 unsigned cid = reference_klause (cadical_kitten, c);
2119 unsigned ctag = learned ? 0 : c->aux;
2120 ROG (cid, "tracing");
2121 trace (state, cid, ctag, learned, size, elits, rsize, rids);
2122 CLEAR_STACK (*eclause);
2123 CLEAR_STACK (*resolved);
2124 traced++;
2125 }
2126
2127 LOG ("traced %u core clauses", traced);
2128 (void) traced;
2129
2131}
#define all_literals_in_klause(KIT, C)
bool trace
Definition globals.c:36
Here is the caller graph for this function:

◆ cadical_kitten_track_antecedents()

void cadical_kitten_track_antecedents ( cadical_kitten * cadical_kitten)

Definition at line 617 of file cadical_kitten.c.

617 {
618 REQUIRE_STATUS (0);
619
621 INVALID_API_USAGE ("can not start tracking antecedents after learning");
622
623 LOG ("enabling antecedents tracking");
625}
Here is the caller graph for this function:

◆ cadical_kitten_traverse_core_clauses()

void cadical_kitten_traverse_core_clauses ( cadical_kitten * cadical_kitten,
void * state,
void(* traverse )(void *, bool, size_t, const unsigned *) )

Definition at line 2017 of file cadical_kitten.c.

2019 {
2020 REQUIRE_STATUS (21);
2021
2022 LOG ("traversing clausal core");
2023
2024 unsigned traversed = 0;
2025
2026 for (all_stack (unsigned, c_ref, cadical_kitten->core)) {
2027 klause *c = dereference_klause (cadical_kitten, c_ref);
2028 CADICAL_assert (is_core_klause (c));
2029 const bool learned = is_learned_klause (c);
2030 unsigneds *eclause = &cadical_kitten->eclause;
2031 CADICAL_assert (EMPTY_STACK (*eclause));
2032 for (all_literals_in_klause (ilit, c)) {
2033 const unsigned elit = export_literal (cadical_kitten, ilit);
2034 PUSH_STACK (*eclause, elit);
2035 }
2036 const size_t size = SIZE_STACK (*eclause);
2037 const unsigned *elits = eclause->begin;
2038 ROG (reference_klause (cadical_kitten, c), "traversing");
2039 traverse (state, learned, size, elits);
2040 CLEAR_STACK (*eclause);
2041 traversed++;
2042 }
2043
2044 LOG ("traversed %u core clauses", traversed);
2045 (void) traversed;
2046
2048}
Here is the caller graph for this function:

◆ cadical_kitten_traverse_core_clauses_with_id()

void cadical_kitten_traverse_core_clauses_with_id ( cadical_kitten * cadical_kitten,
void * state,
void(* traverse )(void *state, unsigned, bool learned, size_t, const unsigned *) )

Definition at line 2050 of file cadical_kitten.c.

2053 {
2054 REQUIRE_STATUS (21);
2055
2056 LOG ("traversing clausal core");
2057
2058 unsigned traversed = 0;
2059
2060 for (all_stack (unsigned, c_ref, cadical_kitten->core)) {
2061 klause *c = dereference_klause (cadical_kitten, c_ref);
2062 CADICAL_assert (is_core_klause (c));
2063 const bool learned = is_learned_klause (c);
2064 unsigneds *eclause = &cadical_kitten->eclause;
2065 CADICAL_assert (EMPTY_STACK (*eclause));
2066 for (all_literals_in_klause (ilit, c)) {
2067 const unsigned elit = export_literal (cadical_kitten, ilit);
2068 PUSH_STACK (*eclause, elit);
2069 }
2070 const size_t size = SIZE_STACK (*eclause);
2071 const unsigned *elits = eclause->begin;
2072 ROG (reference_klause (cadical_kitten, c), "traversing");
2073 unsigned ctag = learned ? 0 : c->aux;
2074 traverse (state, ctag, learned, size, elits);
2075 CLEAR_STACK (*eclause);
2076 traversed++;
2077 }
2078
2079 LOG ("traversed %u core clauses", traversed);
2080 (void) traversed;
2081
2083}
Here is the caller graph for this function:

◆ cadical_kitten_traverse_core_ids()

void cadical_kitten_traverse_core_ids ( cadical_kitten * cadical_kitten,
void * state,
void(* traverse )(void *, unsigned) )

Definition at line 1991 of file cadical_kitten.c.

1992 {
1993 REQUIRE_STATUS (21);
1994
1995 LOG ("traversing core of original clauses");
1996
1997 unsigned traversed = 0;
1998
1999 for (all_original_klauses (c)) {
2000 // only happens for 'true' incremental calls, i.e. if add happens after
2001 // solve
2002 if (is_learned_klause (c))
2003 continue;
2004 if (!is_core_klause (c))
2005 continue;
2006 ROG (reference_klause (cadical_kitten, c), "traversing");
2007 traverse (state, c->aux);
2008 traversed++;
2009 }
2010
2011 LOG ("traversed %u original core clauses", traversed);
2012 (void) traversed;
2013
2015}
#define all_original_klauses(C)
Here is the caller graph for this function:

◆ cadical_kitten_unit()

void cadical_kitten_unit ( cadical_kitten * cadical_kitten,
unsigned lit )

Definition at line 1844 of file cadical_kitten.c.

1844 {
1846}
Here is the call graph for this function:

◆ cadical_kitten_value()

signed char cadical_kitten_value ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2220 of file cadical_kitten.c.

2220 {
2221 REQUIRE_STATUS (10);
2222 const unsigned eidx = elit / 2;
2223 if (eidx >= cadical_kitten->evars)
2224 return 0;
2225 unsigned iidx = cadical_kitten->import[eidx];
2226 if (!iidx)
2227 return 0;
2228 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2229 return cadical_kitten->values[ilit];
2230}

◆ cadical_new_learned_klause()

unsigned cadical_new_learned_klause ( cadical_kitten * cadical_kitten)

Definition at line 877 of file cadical_kitten.c.

877 {
878 unsigned res = new_reference (cadical_kitten);
879 unsigneds *klauses = &cadical_kitten->klauses;
880 const size_t size = SIZE_STACK (cadical_kitten->klause);
881 CADICAL_assert (size <= UINT_MAX);
882 const size_t aux =
884 CADICAL_assert (aux <= UINT_MAX);
885 PUSH_STACK (*klauses, (unsigned) aux);
886 PUSH_STACK (*klauses, (unsigned) size);
887 PUSH_STACK (*klauses, LEARNED_FLAG);
888 for (all_stack (unsigned, lit, cadical_kitten->klause))
889 PUSH_STACK (*klauses, lit);
890 if (aux)
891 for (all_stack (unsigned, ref, cadical_kitten->resolved))
892 PUSH_STACK (*klauses, ref);
893 connect_new_klause (cadical_kitten, res);
894 cadical_kitten->learned = true;
896 return res;
897}
#define LEARNED_FLAG

◆ citten_clause_with_id()

void citten_clause_with_id ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
int * elits )

Definition at line 1839 of file cadical_kitten.c.

1840 {
1842}
void citten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned except)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ citten_clause_with_id_and_equivalence()

void citten_clause_with_id_and_equivalence ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
const int * elits,
unsigned lit,
unsigned other )

Definition at line 1801 of file cadical_kitten.c.

1803 {
1806 reset_incremental (cadical_kitten);
1808 bool sat = false;
1809 const int *const end = elits + size;
1810 for (const int *p = elits; p != end; p++) {
1811 const unsigned elit = int2u (*p); // this is the conversion
1812 if (elit == (lit ^ 1u) || elit == (other ^ 1u))
1813 continue;
1814 if (elit == lit || elit == other) {
1815 sat = true;
1816 break;
1817 }
1818 const unsigned ilit = import_literal (cadical_kitten, elit);
1819 CADICAL_assert (ilit < cadical_kitten->lits);
1820 const unsigned iidx = ilit / 2;
1821 if (cadical_kitten->marks[iidx])
1822 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1823 elit / 2, elit);
1824 cadical_kitten->marks[iidx] = true;
1826 }
1827 for (unsigned *p = cadical_kitten->klause.begin; p != cadical_kitten->klause.end; p++)
1828 cadical_kitten->marks[*p / 2] = false;
1829 if (!sat)
1830 new_original_klause (cadical_kitten, id);
1832}

◆ citten_clause_with_id_and_exception()

void citten_clause_with_id_and_exception ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
const int * elits,
unsigned except )

Definition at line 1774 of file cadical_kitten.c.

1776 {
1779 reset_incremental (cadical_kitten);
1781 const int *const end = elits + size;
1782 for (const int *p = elits; p != end; p++) {
1783 const unsigned elit = int2u (*p); // this is the conversion
1784 if (elit == except)
1785 continue;
1786 const unsigned ilit = import_literal (cadical_kitten, elit);
1787 CADICAL_assert (ilit < cadical_kitten->lits);
1788 const unsigned iidx = ilit / 2;
1789 if (cadical_kitten->marks[iidx])
1790 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1791 elit / 2, elit);
1792 cadical_kitten->marks[iidx] = true;
1794 }
1795 for (unsigned *p = cadical_kitten->klause.begin; p != cadical_kitten->klause.end; p++)
1796 cadical_kitten->marks[*p / 2] = false;
1797 new_original_klause (cadical_kitten, id);
1799}
Here is the caller graph for this function:

◆ STACK()

typedef STACK ( unsigned )

Definition at line 89 of file cadical_kitten.c.

94 {
95 unsigned level;
96 unsigned reason;
97};

Variable Documentation

◆ value

ABC_NAMESPACE_IMPL_START typedef signed char value

Definition at line 19 of file cadical_kitten.c.