ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vivify.c File Reference
#include "vivify.h"
#include "allocate.h"
#include "backtrack.h"
#include "collect.h"
#include "colors.h"
#include "decide.h"
#include "deduce.h"
#include "inline.h"
#include "print.h"
#include "promote.h"
#include "proprobe.h"
#include "rank.h"
#include "report.h"
#include "sort.h"
#include "terminate.h"
#include "tiers.h"
#include "trail.h"
#include "cover.h"
#include <inttypes.h>
#include <string.h>
Include dependency graph for vivify.c:

Go to the source code of this file.

Classes

struct  countref
 

Macros

#define MORE_OCCURRENCES(A, B)
 
#define COUNTREF_COUNTS   1
 
#define LD_MAX_COUNTREF_SIZE   31
 
#define MAX_COUNTREF_SIZE   ((1u << LD_MAX_COUNTREF_SIZE) - 1)
 
#define WORSE_CANDIDATE(A, B)
 
#define RANK_COUNTREF_BY_INVERSE_SIZE(CR)
 
#define RANK_COUNTREF_BY_VIVIFY(CR)
 
#define RANK_COUNTREF_BY_COUNT(CR)
 

Typedefs

typedef struct countref countref
 
typedef struct vivifier vivifier
 

Functions

typedef STACK (countref)
 
void kissat_vivify (kissat *solver)
 

Macro Definition Documentation

◆ COUNTREF_COUNTS

#define COUNTREF_COUNTS   1

Definition at line 138 of file vivify.c.

◆ LD_MAX_COUNTREF_SIZE

#define LD_MAX_COUNTREF_SIZE   31

Definition at line 139 of file vivify.c.

◆ MAX_COUNTREF_SIZE

#define MAX_COUNTREF_SIZE   ((1u << LD_MAX_COUNTREF_SIZE) - 1)

Definition at line 140 of file vivify.c.

◆ MORE_OCCURRENCES

#define MORE_OCCURRENCES ( A,
B )
Value:
more_occurrences (counts, (A), (B))

Definition at line 32 of file vivify.c.

◆ RANK_COUNTREF_BY_COUNT

#define RANK_COUNTREF_BY_COUNT ( CR)
Value:
((unsigned) ((CR).count[COUNTREF_COUNTS - 1 - i]))
#define COUNTREF_COUNTS
Definition vivify.hpp:20

Definition at line 426 of file vivify.c.

426#define RANK_COUNTREF_BY_COUNT(CR) \
427 ((unsigned) ((CR).count[COUNTREF_COUNTS - 1 - i]))

◆ RANK_COUNTREF_BY_INVERSE_SIZE

#define RANK_COUNTREF_BY_INVERSE_SIZE ( CR)
Value:
((unsigned) (~(CR).size))

Definition at line 424 of file vivify.c.

◆ RANK_COUNTREF_BY_VIVIFY

#define RANK_COUNTREF_BY_VIVIFY ( CR)
Value:
((unsigned) ((CR).vivify))

Definition at line 425 of file vivify.c.

◆ WORSE_CANDIDATE

#define WORSE_CANDIDATE ( A,
B )
Value:
worse_candidate (solver, counts, (A), (B))
#define solver
Definition kitten.c:211

Definition at line 354 of file vivify.c.

Typedef Documentation

◆ countref

typedef struct countref countref

Definition at line 149 of file vivify.c.

◆ vivifier

typedef struct vivifier vivifier

Definition at line 167 of file vivify.c.

Function Documentation

◆ kissat_vivify()

void kissat_vivify ( kissat * solver)

Definition at line 1402 of file vivify.c.

1402 {
1403 if (solver->inconsistent)
1404 return;
1405 KISSAT_assert (!solver->level);
1406 KISSAT_assert (solver->probing);
1407 KISSAT_assert (solver->watching);
1408 if (!GET_OPTION (vivify))
1409 return;
1411 return;
1412 double irr_budget = DELAYING (vivifyirr) ? 0 : GET_OPTION (vivifyirr);
1413 double tier1_budget = GET_OPTION (vivifytier1);
1414 double tier2_budget = GET_OPTION (vivifytier2);
1415 double tier3_buget = GET_OPTION (vivifytier3);
1416 if (!REDUNDANT_CLAUSES)
1417 tier1_budget = tier2_budget = tier3_buget = 0;
1418 double sum = irr_budget + tier1_budget + tier2_budget + tier3_buget;
1419 if (!sum)
1420 return;
1421
1422 START (vivify);
1423 INC (vivifications);
1424#if !defined(KISSAT_NDEBUG) || defined(METRICS)
1425 KISSAT_assert (!solver->vivifying);
1426 solver->vivifying = true;
1427#endif
1428
1429 SET_EFFORT_LIMIT (limit, vivify, probing_ticks);
1430 const uint64_t total = limit - solver->statistics_.probing_ticks;
1431 limit = solver->statistics_.probing_ticks;
1432 unsigned tier1_limit = vivify_tier1_limit (solver);
1433 unsigned tier2_limit = vivify_tier2_limit (solver);
1434 if (tier1_budget && tier2_budget && tier1_limit == tier2_limit) {
1435 tier1_budget += tier2_budget, tier2_budget = 0;
1436 LOG ("vivification tier1 matches tier2 "
1437 "thus using tier2 budget for tier1");
1438 }
1439
1440 {
1442 init_vivifier (solver, &vivifier);
1443 if (tier1_budget) {
1444 limit += (total * tier1_budget) / sum;
1445 vivify_tier1 (&vivifier, limit);
1446 }
1447 if (tier2_budget && !solver->inconsistent &&
1449 limit += (total * tier2_budget) / sum;
1450 vivify_tier2 (&vivifier, limit);
1451 }
1452 if (tier3_buget && !solver->inconsistent &&
1454 limit += (total * tier3_buget) / sum;
1455 vivify_tier3 (&vivifier, limit);
1456 }
1457 if (irr_budget && !solver->inconsistent &&
1459 limit += (total * irr_budget) / sum;
1460 vivify_irredundant (&vivifier, limit);
1461 if (kissat_average (vivifier.vivified, vivifier.tried) < 0.01)
1462 BUMP_DELAY (vivifyirr);
1463 else
1464 REDUCE_DELAY (vivifyirr);
1465 }
1466 release_vivifier (&vivifier);
1467 }
1468
1469#ifndef KISSAT_QUIET
1470 if (solver->statistics_.probing_ticks < limit) {
1471 uint64_t delta = limit - solver->statistics_.probing_ticks;
1472 kissat_phase (solver, "vivify-limit", GET (vivifications),
1473 "has %" PRIu64 " ticks left %.2f%%", delta,
1474 kissat_percent (delta, total));
1475 } else {
1476 uint64_t delta = solver->statistics_.probing_ticks - limit;
1477 kissat_phase (solver, "vivify-limit", GET (vivifications),
1478 "exceeded by %" PRIu64 " ticks %.2f%%", delta,
1479 kissat_percent (delta, total));
1480 }
1481#endif
1482#if !defined(KISSAT_NDEBUG) || defined(METRICS)
1483 KISSAT_assert (solver->vivifying);
1484 solver->vivifying = false;
1485#endif
1486 STOP (vivify);
1487}
#define INC(NAME)
#define LOG(...)
#define BUMP_DELAY(NAME)
Definition kimits.h:183
#define REDUCE_DELAY(NAME)
Definition kimits.h:185
#define DELAYING(NAME)
Definition kimits.h:181
#define KISSAT_assert(ignore)
Definition global.h:13
#define SET_EFFORT_LIMIT(LIMIT, NAME, THRESHHOLD)
Definition limit.hpp:131
#define GET_OPTION(N)
Definition options.h:295
#define kissat_phase(...)
Definition print.h:48
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define GET(NAME)
Definition statistics.h:416
#define REDUNDANT_CLAUSES
Definition statistics.h:339
#define vivify_terminated_3
Definition terminate.h:83
#define TERMINATED(BIT)
Definition terminate.h:42
#define vivify_terminated_5
Definition terminate.h:85
#define vivify_terminated_2
Definition terminate.h:82
#define vivify_terminated_4
Definition terminate.h:84
struct vivifier vivifier
Definition vivify.c:167

◆ STACK()

typedef STACK ( countref )

Definition at line 150 of file vivify.c.

152 {
153 kissat *solver;
154 unsigned *counts;
155 references schedule;
156 size_t scheduled, tried, vivified;
157 countrefs countrefs;
158 unsigneds sorted;
159#ifndef KISSAT_QUIET
160 const char *mode;
161 const char *name;
162 char tag;
163#endif
164 int tier;
165};
char * name
Definition main.h:24
Definition mode.h:11