veripb 3.0.0

VeriPB is a proof checker for verifying pseudo-Boolean certificates of satisfiability, unsatisfiability, and optimality bounds.
Documentation
#![allow(clippy::restriction)]

pub mod args;
pub mod context;
pub mod database;
pub mod deletion_sequence;
pub mod elaborator;
pub mod error;
pub mod misc_tokens;
pub mod occurrence_list;
pub mod order;
pub mod order_context;
pub mod parser;
pub mod prelude;
pub mod proofgoal;
pub mod rules;
pub mod subproof_context;
pub mod utils;
pub mod verifier;

use std::{ffi::OsStr, fs::File};

use ahash::AHashMap;
use args::Args;
use error::VeriPBError;
use memmap2::Mmap;
use parser::{error::ParseError, parser::Parser, utils::Position};
use prelude::*;
use veripb_formula::prelude::*;
use veripb_parser::{
    cnf_parser::parse_cnf_from_file, opb_parser::parse_opb_from_file,
    wcnf_parser::parse_wcnf_from_file,
};

pub fn run_checker(args: Args) -> anyhow::Result<()> {
    let pbp_file = File::open(&args.derivation).unwrap();
    let pbp_mmap = unsafe { Mmap::map(&pbp_file).unwrap() };
    let (formula, variables, formula_labels) = if args.cnf
        || (!args.opb && !args.wcnf && args.formula.extension() == Some(OsStr::new("cnf")))
    {
        let (formula, num_vars) = parse_cnf_from_file(&args.formula)?;
        let mut variables = VarNameManager::with_capacity(num_vars + 1);
        variables.add_by_name("");
        for i in 1..=num_vars {
            variables.add_by_name(&format!("x{i}"));
        }
        (formula, variables, AHashMap::new())
    } else if args.wcnf || (!args.opb && args.formula.extension() == Some(OsStr::new("wcnf"))) {
        let (formula, var_names) = parse_wcnf_from_file(&args.formula)?;
        (formula, var_names, AHashMap::new())
    } else {
        parse_opb_from_file(&args.formula)?
    };

    let context = Context::new(args, variables);
    let mut verifier = Verifier::new(context, formula)?;
    verifier.initialize()?;
    let mut parser = Parser::new(pbp_mmap, &mut verifier, formula_labels);
    match parser.parse() {
        Err(error) => {
            if let VeriPBError::Parse(ParseError {
                pos:
                    Position {
                        pos: 0,
                        col: 1,
                        line: 0,
                    },
                ..
            }) = error
            {
                if verifier.context.args.print_verification_result {
                    println!("Info: Switched to proof version 2.0 (it is recommended to migrate to proof version 3.0).");
                }
                verifier.verify_file_version_2()?
            } else {
                Err(error)?
            }
        }
        result => result?,
    }

    if verifier.context.assumption_used && verifier.context.args.show_warnings {
        println!("Warning: The proof used unchecked assumptions.");
    }
    Ok(())
}