diff --git a/clasp/cli/clasp_app.h b/clasp/cli/clasp_app.h index 28222b2..14ca64c 100644 --- a/clasp/cli/clasp_app.h +++ b/clasp/cli/clasp_app.h @@ -133,6 +133,12 @@ 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(); @@ -140,8 +146,10 @@ class ClaspAppBase : public Potassco::Application, public Clasp::EventHandler { // 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); diff --git a/clasp/cli/clasp_output.h b/clasp/cli/clasp_output.h index 1e4986a..9ea6837 100644 --- a/clasp/cli/clasp_output.h +++ b/clasp/cli/clasp_output.h @@ -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); diff --git a/src/clasp_app.cpp b/src/clasp_app.cpp index e23c501..3b4052b 100644 --- a/src/clasp_app.cpp +++ b/src/clasp_app.cpp @@ -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(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(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(UCHAR_MAX)) { - out->setModelQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[0])); - } - if (claspAppOpts_.quiet[1] != static_cast(UCHAR_MAX)) { - out->setOptQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[1])); - } - if (claspAppOpts_.quiet[2] != static_cast(UCHAR_MAX)) { - out->setCallQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[2])); + + if (out.get()) { + if (claspAppOpts_.quiet[0] != static_cast(UCHAR_MAX)) { + out->setModelQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[0])); + } + if (claspAppOpts_.quiet[1] != static_cast(UCHAR_MAX)) { + out->setOptQuiet((Output::PrintLevel)std::min(uint8(Output::print_no), claspAppOpts_.quiet[1])); + } + if (claspAppOpts_.quiet[2] != static_cast(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 */ } diff --git a/src/clasp_output.cpp b/src/clasp_output.cpp index d572ebc..63a1f10 100644 --- a/src/clasp_output.cpp +++ b/src/clasp_output.cpp @@ -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()) {