2023-03-26 19:15:17 +08:00

85 lines
1.6 KiB
C

#ifndef _heap_h_INCLUDED
#define _heap_h_INCLUDED
#include "stack.h"
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#define DISCONTAIN UINT_MAX
#define DISCONTAINED(IDX) ((int)(IDX) < 0)
typedef struct heap heap;
struct heap
{
bool tainted;
unsigned vars;
unsigned size;
unsigneds stack;
double *score;
unsigned *pos;
};
struct kissat;
void kissat_resize_heap (struct kissat *, heap *, unsigned size);
void kissat_release_heap (struct kissat *, heap *);
static inline bool
kissat_heap_contains (heap * heap, unsigned idx)
{
return idx < heap->vars && !DISCONTAINED (heap->pos[idx]);
}
static inline unsigned
kissat_get_heap_pos (const heap * heap, unsigned idx)
{
return idx < heap->vars ? heap->pos[idx] : DISCONTAIN;
}
static inline double
kissat_get_heap_score (const heap * heap, unsigned idx)
{
return idx < heap->vars ? heap->score[idx] : 0.0;
}
static inline bool
kissat_empty_heap (heap * heap)
{
return EMPTY_STACK (heap->stack);
}
static inline size_t
kissat_size_heap (heap * heap)
{
return SIZE_STACK (heap->stack);
}
void kissat_push_heap (struct kissat *, heap *, unsigned);
void kissat_pop_heap (struct kissat *, heap *, unsigned);
void kissat_update_heap (struct kissat *, heap *, unsigned, double);
static inline unsigned
kissat_max_heap (heap * heap)
{
assert (!kissat_empty_heap (heap));
return PEEK_STACK (heap->stack, 0);
}
double kissat_max_score_on_heap (heap *);
void kissat_rescale_heap (struct kissat *, heap * heap, double factor);
#ifndef NDEBUG
void kissat_dump_heap (heap *);
#endif
#ifndef NDEBUG
void kissat_check_heap (heap *);
#else
#define kissat_check_heap(...) do { } while (0)
#endif
#endif