dlvhex
2.5.0
|
00001 /* dlvhex -- Answer-Set Programming with external interfaces. 00002 * Copyright (C) 2005-2007 Roman Schindlauer 00003 * Copyright (C) 2006-2015 Thomas Krennwallner 00004 * Copyright (C) 2009-2016 Peter Schüller 00005 * Copyright (C) 2011-2016 Christoph Redl 00006 * Copyright (C) 2015-2016 Tobias Kaminski 00007 * Copyright (C) 2015-2016 Antonius Weinzierl 00008 * 00009 * This file is part of dlvhex. 00010 * 00011 * dlvhex is free software; you can redistribute it and/or modify it 00012 * under the terms of the GNU Lesser General Public License as 00013 * published by the Free Software Foundation; either version 2.1 of 00014 * the License, or (at your option) any later version. 00015 * 00016 * dlvhex is distributed in the hope that it will be useful, but 00017 * WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 * Lesser General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU Lesser General Public 00022 * License along with dlvhex; if not, write to the Free Software 00023 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 00024 * 02110-1301 USA. 00025 */ 00026 00034 #ifndef GENUINE_PLAIN_MODEL_GENERATOR_HPP_INCLUDED__09122011 00035 #define GENUINE_PLAIN_MODEL_GENERATOR_HPP_INCLUDED__09122011 00036 00037 #include "dlvhex2/PlatformDefinitions.h" 00038 #include "dlvhex2/fwd.h" 00039 #include "dlvhex2/ID.h" 00040 #include "dlvhex2/BaseModelGenerator.h" 00041 #include "dlvhex2/ComponentGraph.h" 00042 #include "dlvhex2/GenuineSolver.h" 00043 #include "dlvhex2/InternalGroundDASPSolver.h" 00044 #include "dlvhex2/InternalGrounder.h" 00045 00046 DLVHEX_NAMESPACE_BEGIN 00047 00048 class GenuinePlainModelGeneratorFactory; 00049 00050 // 00051 // A model generator does the following: 00052 // * it is constructed by a ModelGeneratorFactory which knows the program 00053 // (and can precompute information for evaluation, 00054 // and may also provide this to the model generator) 00055 // * it is evaluated on a (probably empty) input interpretation 00056 // * this evaluation can be performed online 00057 // * evaluation yields a (probably empty) set of output interpretations 00058 // 00059 00061 class GenuinePlainModelGenerator: 00062 public BaseModelGenerator, 00063 public ostream_printable<GenuinePlainModelGenerator> 00064 { 00065 // types 00066 public: 00067 typedef GenuinePlainModelGeneratorFactory Factory; 00068 00069 // storage 00070 protected: 00072 Factory& factory; 00073 00075 InterpretationConstPtr postprocessedInput; 00077 ASPSolverManager::ResultsPtr currentResults; 00078 00080 GenuineSolverPtr solver; 00081 00082 // members 00083 00084 public: 00090 GenuinePlainModelGenerator(Factory& factory, InterpretationConstPtr input); 00092 virtual ~GenuinePlainModelGenerator(); 00093 00094 // generate and return next model, return null after last model 00095 virtual InterpretationPtr generateNextModel(); 00096 }; 00097 00099 class GenuinePlainModelGeneratorFactory: 00100 public BaseModelGeneratorFactory, 00101 public ostream_printable<GenuinePlainModelGeneratorFactory> 00102 { 00103 // types 00104 public: 00105 friend class GenuinePlainModelGenerator; 00106 typedef ComponentGraph::ComponentInfo ComponentInfo; 00107 00108 // storage 00109 protected: 00111 ASPSolverManager::SoftwareConfigurationPtr externalEvalConfig; 00113 ProgramCtx& ctx; 00115 ComponentInfo ci; // should be a reference, but there is currently a bug in the copy constructor of ComponentGraph: it seems that the component info is shared between different copies of a component graph, hence it is deallocated when one of the copies dies. 00116 00118 std::vector<ID> eatoms; 00119 00123 std::vector<ID> idb; 00127 std::vector<ID> xidb; 00128 00129 // methods 00130 public: 00137 GenuinePlainModelGeneratorFactory( 00138 ProgramCtx& ctx, const ComponentInfo& ci, 00139 ASPSolverManager::SoftwareConfigurationPtr externalEvalConfig); 00141 virtual ~GenuinePlainModelGeneratorFactory() {} 00142 00148 virtual ModelGeneratorPtr createModelGenerator( 00149 InterpretationConstPtr input) 00150 { return ModelGeneratorPtr(new GenuinePlainModelGenerator(*this, input)); } 00151 00154 virtual std::ostream& print(std::ostream& o) const; 00155 }; 00156 00157 DLVHEX_NAMESPACE_END 00158 #endif // PLAIN_MODEL_GENERATOR_HPP_INCLUDED__09112010 00159 00160 // vim:expandtab:ts=4:sw=4: 00161 // mode: C++ 00162 // End: