Skip to content

Commit

Permalink
App: Simplify output customization.
Browse files Browse the repository at this point in the history
  • Loading branch information
BenKaufmann committed Mar 19, 2024
1 parent fa71c06 commit eb0b28d
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 18 deletions.
10 changes: 9 additions & 1 deletion clasp/cli/clasp_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,15 +133,23 @@ class ClaspAppBase : public Potassco::Application, public Clasp::EventHandler {
typedef ClaspFacade::Summary RunSummary;
typedef Potassco::ProgramOptions::PosOption PosOption;
protected:
struct TextOptions {
TextOutput::Format format;
unsigned verbosity;
const char* catAtom;
char ifs;
};
using Potassco::Application::run;
ClaspAppBase();
~ClaspAppBase();
// -------------------------------------------------------------------------------------------
// Functions to be implemented by subclasses
virtual ProblemType getProblemType() = 0;
virtual void run(ClaspFacade& clasp) = 0;
virtual Output* createOutput(ProblemType f);
virtual void storeCommandArgs(const Potassco::ProgramOptions::ParsedValues& values);
virtual Output* createOutput(ProblemType f);
virtual Output* createTextOutput(const TextOptions& options);
virtual Output* createJsonOutput(unsigned verbosity);
// -------------------------------------------------------------------------------------------
// Helper functions that subclasses might call during run
void handleStartOptions(ClaspFacade& clasp);
Expand Down
6 changes: 6 additions & 0 deletions clasp/cli/clasp_output.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,12 @@ class TextOutput : public Output, private StatsVisitor {
//! Prints a comment message.
void comment(uint32 v, const char* fmt, ...) const;
protected:
//! Called on each model to be printed.
/*!
* The default implementation calls printValues().
*/
virtual void printModelValues(const OutputTable& out, const Model& m);

virtual bool visitThreads(Operation op);
virtual bool visitTester(Operation op);

Expand Down
49 changes: 33 additions & 16 deletions src/clasp_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,34 +419,51 @@ Output* ClaspAppBase::createOutput(ProblemType f) {
return 0;
}
if (claspAppOpts_.outf != ClaspAppOptions::out_json || claspAppOpts_.onlyPre) {
TextOutput::Format outFormat = TextOutput::format_asp;
if (f == Problem_t::Sat){ outFormat = TextOutput::format_sat09; }
else if (f == Problem_t::Pb) { outFormat = TextOutput::format_pb09; }
TextOptions options;
options.format = TextOutput::format_asp;
if (f == Problem_t::Sat){ options.format = TextOutput::format_sat09; }
else if (f == Problem_t::Pb) { options.format = TextOutput::format_pb09; }
else if (f == Problem_t::Asp && claspAppOpts_.outf == ClaspAppOptions::out_comp) {
outFormat = TextOutput::format_aspcomp;
options.format = TextOutput::format_aspcomp;
}
out.reset(new TextOutput(verbose(), outFormat, claspAppOpts_.outAtom.c_str(), claspAppOpts_.ifs));
if (claspConfig_.parse.isEnabled(ParserOptions::parse_maxsat) && f == Problem_t::Sat) {
static_cast<TextOutput*>(out.get())->result[TextOutput::res_sat] = "UNKNOWN";
options.verbosity = verbose();
options.catAtom = claspAppOpts_.outAtom.c_str();
options.ifs = claspAppOpts_.ifs;
out.reset(createTextOutput(options));
TextOutput* textOut = dynamic_cast<TextOutput*>(out.get());
if (claspConfig_.parse.isEnabled(ParserOptions::parse_maxsat) && f == Problem_t::Sat && textOut) {
textOut->result[TextOutput::res_sat] = "UNKNOWN";
}
}
else {
out.reset(new JsonOutput(verbose()));
out.reset(createJsonOutput(verbose()));
}
if (claspAppOpts_.quiet[0] != static_cast<uint8>(UCHAR_MAX)) {
out->setModelQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[0]));
}
if (claspAppOpts_.quiet[1] != static_cast<uint8>(UCHAR_MAX)) {
out->setOptQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[1]));
}
if (claspAppOpts_.quiet[2] != static_cast<uint8>(UCHAR_MAX)) {
out->setCallQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[2]));

if (out.get()) {
if (claspAppOpts_.quiet[0] != static_cast<uint8>(UCHAR_MAX)) {
out->setModelQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[0]));
}
if (claspAppOpts_.quiet[1] != static_cast<uint8>(UCHAR_MAX)) {
out->setOptQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[1]));
}
if (claspAppOpts_.quiet[2] != static_cast<uint8>(UCHAR_MAX)) {
out->setCallQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[2]));
}
}
if (claspAppOpts_.hideAux && clasp_.get()) {
clasp_->ctx.output.setFilter('_');
}
return out.release();
}

Output* ClaspAppBase::createTextOutput(const TextOptions& options) {
return new TextOutput(options.verbosity, options.format, options.catAtom, options.ifs);
}

Output* ClaspAppBase::createJsonOutput(unsigned verbosity) {
return new JsonOutput(verbosity);
}

void ClaspAppBase::storeCommandArgs(const Potassco::ProgramOptions::ParsedValues&) {
/* We don't need the values */
}
Expand Down
7 changes: 6 additions & 1 deletion src/clasp_output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -973,11 +973,16 @@ void TextOutput::printMeta(const OutputTable& out, const Model& m) {
printf("\n");
}
}

void TextOutput::printModelValues(const OutputTable& out, const Model& m) {
printValues(out, m);
}

void TextOutput::printModel(const OutputTable& out, const Model& m, PrintLevel x) {
FileLock lock(stdout);
if (x == modelQ()) {
comment(1, "%s: %" PRIu64"\n", !m.up ? "Answer" : "Update", m.num);
printValues(out, m);
printModelValues(out, m);
progress_.clear();
}
if (x == optQ()) {
Expand Down

0 comments on commit eb0b28d

Please sign in to comment.