dlvhex  2.5.0
testsuite/TestOnlineModelBuilder.cpp
Go to the documentation of this file.
00001 /* dlvhex -- Answer-Set Programming with external interfaces.
00002  * Copyright (C) 2005, 2006, 2007 Roman Schindlauer
00003  * Copyright (C) 2006, 2007, 2008, 2009, 2010 Thomas Krennwallner
00004  * Copyright (C) 2009, 2010 Peter Schüller
00005  * 
00006  * This file is part of dlvhex.
00007  *
00008  * dlvhex is free software; you can redistribute it and/or modify it
00009  * under the terms of the GNU Lesser General Public License as
00010  * published by the Free Software Foundation; either version 2.1 of
00011  * the License, or (at your option) any later version.
00012  *
00013  * dlvhex is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with dlvhex; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
00021  * 02110-1301 USA.
00022  */
00023 
00031 #ifdef HAVE_CONFIG_H
00032 #include "config.h"
00033 #endif // HAVE_CONFIG_H
00034 
00035 #include <iostream>
00036 #include <set>
00037 #include <list>
00038 #include <string>
00039 #include <vector>
00040 #include <cassert>
00041 
00042 #include <boost/foreach.hpp>
00043 //#include <boost/type_traits/remove_const.hpp>
00044 #include <boost/graph/graph_traits.hpp>
00045 #include <boost/graph/adjacency_list.hpp>
00046 #include <boost/property_map/vector_property_map.hpp>
00047 #include <boost/concept/assert.hpp>
00048 #include <boost/concept_check.hpp>
00049 #define BOOST_TEST_MODULE __FILE__
00050 #include <boost/test/unit_test.hpp>
00051 
00052 #include "dlvhex2/Logger.h"
00053 #include "dlvhex2/EvalGraph.h"
00054 #include "dlvhex2/ModelGraph.h"
00055 #include "dlvhex2/ModelGenerator.h"
00056 #include "dlvhex2/OnlineModelBuilder.h"
00057 
00058 #include "fixtureOnlineMB.h"
00059 
00060 LOG_INIT(Logger::ERROR | Logger::WARNING)
00061 
00062 #if 1
00063 #define DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN 
00064 #define DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00065 #warning reactivate the else below if getSuccessorIntersection works!
00066 #else
00067 #define DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN \
00068   CounterVerification<TestEvalGraph> cverification(omb.getEvalGraph(), 2); \
00069   std::vector<unsigned> modelcounts(2,unsigned(0)); \
00070   std::vector<unsigned> modeldepcounts(2,unsigned(0)); \
00071   for(unsigned iteration = 1; iteration <= 2; ++iteration) \
00072   { LOG("test iteration " << iteration);
00073 
00074 #define DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END \
00075     omb.printEvalGraphModelGraph(std::cerr); \
00076     cverification.recordCounters(iteration); \
00077     modelcounts[iteration-1] = omb.getModelGraph().countModels(); \
00078     modeldepcounts[iteration-1] = omb.getModelGraph().countModelDeps(); \
00079   } \
00080   cverification.printCounters(); \
00081   cverification.verifyEqual(1, 2); \
00082   LOG("model counters:"); \
00083   for(unsigned iteration = 0; iteration < 2; ++iteration ) { \
00084     LOG("iteration " << iteration << ": " << modelcounts[iteration] << " models, " << modeldepcounts[iteration] << " dependencies"); \
00085   } \
00086   BOOST_CHECK_EQUAL(modelcounts[0], modelcounts[1]); \
00087   BOOST_CHECK_EQUAL(modeldepcounts[0], modeldepcounts[1]);
00088 #endif
00089 
00090 BOOST_AUTO_TEST_SUITE(root_TestOnlineModelBuilder)
00091 
00092 BOOST_FIXTURE_TEST_CASE(online_model_building_e1_ufinal_input, OnlineModelBuilderE1Fixture)
00093 {
00094   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00095 
00096   BOOST_TEST_MESSAGE("requesting model #1");
00097   OptionalModel mfull = omb.getNextIModel(ufinal);
00098   BOOST_REQUIRE(!!mfull);
00099   {
00100     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mfull.get()).interpretation);
00101     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 4U);
00102     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00103     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00104     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(e)"), 1);
00105     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(b)"), 1);
00106   }
00107 
00108   BOOST_TEST_MESSAGE("requesting model #2");
00109   OptionalModel nfm = omb.getNextIModel(ufinal);
00110   BOOST_REQUIRE(!nfm);
00111 
00112   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00113 }
00114 
00115 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_u2_input, OnlineModelBuilderE2Fixture)
00116 {
00117   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00118 
00119   BOOST_TEST_MESSAGE("requesting model #1");
00120   OptionalModel m3 = omb.getNextIModel(u2);
00121   BOOST_REQUIRE(!!m3);
00122   {
00123     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m3.get()).interpretation);
00124     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00125     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(a)"), 1);
00126   }
00127 
00128   BOOST_TEST_MESSAGE("requesting model #2");
00129   OptionalModel m4 = omb.getNextIModel(u2);
00130   BOOST_REQUIRE(!!m4);
00131   {
00132     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m4.get()).interpretation);
00133     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00134     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(b)"), 1);
00135   }
00136 
00137   BOOST_TEST_MESSAGE("requesting model #3");
00138   OptionalModel nfm = omb.getNextIModel(u2);
00139   BOOST_REQUIRE(!nfm);
00140 
00141   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00142 }
00143 
00144 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_u3_input, OnlineModelBuilderE2Fixture)
00145 {
00146   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00147 
00148   BOOST_TEST_MESSAGE("requesting model #1");
00149   OptionalModel m6 = omb.getNextIModel(u3);
00150   BOOST_REQUIRE(!!m6);
00151   {
00152     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m6.get()).interpretation);
00153     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00154     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(a)"), 1);
00155   }
00156 
00157   BOOST_TEST_MESSAGE("requesting model #2");
00158   OptionalModel m7 = omb.getNextIModel(u3);
00159   BOOST_REQUIRE(!!m7);
00160   {
00161     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m7.get()).interpretation);
00162     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00163     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(b)"), 1);
00164   }
00165 
00166   BOOST_TEST_MESSAGE("requesting model #3");
00167   OptionalModel nfm = omb.getNextIModel(u3);
00168   BOOST_REQUIRE(!nfm);
00169 
00170   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00171 }
00172 
00173 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_u2_output, OnlineModelBuilderE2Fixture)
00174 {
00175   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00176 
00177   BOOST_TEST_MESSAGE("requesting model #1");
00178   OptionalModel m5 = omb.getNextOModel(u2);
00179   BOOST_REQUIRE(!!m5);
00180   {
00181     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m5.get()).interpretation);
00182     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00183     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(p,time)"), 1);
00184   }
00185 
00186   BOOST_TEST_MESSAGE("requesting model #2");
00187   OptionalModel nfm = omb.getNextOModel(u2);
00188   BOOST_REQUIRE(!nfm);
00189 
00190   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00191 }
00192 
00193 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_u3_output, OnlineModelBuilderE2Fixture)
00194 {
00195   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00196 
00197   BOOST_TEST_MESSAGE("requesting model #1");
00198   OptionalModel m8 = omb.getNextOModel(u3);
00199   BOOST_REQUIRE(!!m8);
00200   {
00201     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m8.get()).interpretation);
00202     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00203     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(c)"), 1);
00204   }
00205 
00206   BOOST_TEST_MESSAGE("requesting model #2");
00207   OptionalModel m9 = omb.getNextOModel(u3);
00208   BOOST_REQUIRE(!!m9);
00209   {
00210     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m9.get()).interpretation);
00211     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00212     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(d)"), 1);
00213   }
00214 
00215   BOOST_TEST_MESSAGE("requesting model #3");
00216   OptionalModel m10 = omb.getNextOModel(u3);
00217   BOOST_REQUIRE(!!m10);
00218   {
00219     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m10.get()).interpretation);
00220     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00221     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(e)"), 1);
00222   }
00223 
00224   BOOST_TEST_MESSAGE("requesting model #4");
00225   OptionalModel m11 = omb.getNextOModel(u3);
00226   BOOST_REQUIRE(!!m11);
00227   {
00228     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m11.get()).interpretation);
00229     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00230     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(f)"), 1);
00231   }
00232 
00233   BOOST_TEST_MESSAGE("requesting model #5");
00234   OptionalModel nfm = omb.getNextOModel(u3);
00235   BOOST_REQUIRE(!nfm);
00236 
00237   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00238 }
00239 
00240 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_u4_input, OnlineModelBuilderE2Fixture)
00241 {
00242   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00243 
00244   omb.printEvalGraphModelGraph(std::cerr);
00245   BOOST_TEST_MESSAGE("requesting model #1");
00246   OptionalModel m12 = omb.getNextIModel(u4);
00247   omb.printEvalGraphModelGraph(std::cerr);
00248   BOOST_REQUIRE(!!m12);
00249   {
00250     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m12.get()).interpretation);
00251     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 2U);
00252     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(p,time)"), 1);
00253     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(e)"), 1);
00254   }
00255 
00256   BOOST_TEST_MESSAGE("requesting model #2");
00257   OptionalModel m13 = omb.getNextIModel(u4);
00258   omb.printEvalGraphModelGraph(std::cerr);
00259   BOOST_REQUIRE(!!m13);
00260   {
00261     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m13.get()).interpretation);
00262     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 2U);
00263     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(p,time)"), 1);
00264     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(f)"), 1);
00265   }
00266 
00267   BOOST_TEST_MESSAGE("requesting model #3");
00268   OptionalModel nfm = omb.getNextIModel(u4);
00269   omb.printEvalGraphModelGraph(std::cerr);
00270   BOOST_REQUIRE(!nfm);
00271 
00272   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00273 }
00274 
00275 BOOST_FIXTURE_TEST_CASE(online_model_building_e2mirrored_u4_input, OnlineModelBuilderE2MirroredFixture)
00276 {
00277   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00278 
00279   omb.printEvalGraphModelGraph(std::cerr);
00280   BOOST_TEST_MESSAGE("requesting model #1");
00281   OptionalModel m12 = omb.getNextIModel(u4);
00282   omb.printEvalGraphModelGraph(std::cerr);
00283   BOOST_REQUIRE(!!m12);
00284   {
00285     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m12.get()).interpretation);
00286     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 2U);
00287     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(p,time)"), 1);
00288     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(e)"), 1);
00289   }
00290 
00291   BOOST_TEST_MESSAGE("requesting model #2");
00292   OptionalModel m13 = omb.getNextIModel(u4);
00293   omb.printEvalGraphModelGraph(std::cerr);
00294   BOOST_REQUIRE(!!m13);
00295   {
00296     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m13.get()).interpretation);
00297     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 2U);
00298     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(p,time)"), 1);
00299     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(f)"), 1);
00300   }
00301 
00302   BOOST_TEST_MESSAGE("requesting model #3");
00303   OptionalModel nfm = omb.getNextIModel(u4);
00304   omb.printEvalGraphModelGraph(std::cerr);
00305   BOOST_REQUIRE(!nfm);
00306 
00307   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00308 }
00309 
00310 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_u4_output, OnlineModelBuilderE2Fixture)
00311 {
00312   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00313 
00314   omb.printEvalGraphModelGraph(std::cerr);
00315   BOOST_TEST_MESSAGE("requesting model #1");
00316   OptionalModel m14 = omb.getNextOModel(u4);
00317   omb.printEvalGraphModelGraph(std::cerr);
00318   BOOST_REQUIRE(!!m14);
00319   {
00320     TestInterpretation& ti = *(omb.getModelGraph().propsOf(m14.get()).interpretation);
00321     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 1U);
00322     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00323   }
00324 
00325   BOOST_TEST_MESSAGE("requesting model #2");
00326   OptionalModel nfm = omb.getNextOModel(u4);
00327   omb.printEvalGraphModelGraph(std::cerr);
00328   BOOST_REQUIRE(!nfm);
00329 
00330   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00331 }
00332 
00333 BOOST_FIXTURE_TEST_CASE(online_model_building_e2_ufinal_input, OnlineModelBuilderE2Fixture)
00334 {
00335   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00336 
00337   omb.printEvalGraphModelGraph(std::cerr);
00338   BOOST_TEST_MESSAGE("requesting model #1");
00339   OptionalModel mcomplete = omb.getNextIModel(ufinal);
00340   omb.printEvalGraphModelGraph(std::cerr);
00341   BOOST_REQUIRE(!!mcomplete);
00342   {
00343     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete.get()).interpretation);
00344     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 4U);
00345     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00346     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00347     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(e)"), 1);
00348     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(b)"), 1);
00349   }
00350 
00351   BOOST_TEST_MESSAGE("requesting model #2");
00352   OptionalModel nfm = omb.getNextIModel(ufinal);
00353   omb.printEvalGraphModelGraph(std::cerr);
00354   BOOST_REQUIRE(!nfm);
00355 
00356   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00357 }
00358 
00359 BOOST_FIXTURE_TEST_CASE(online_model_building_e2mirrored_ufinal_input, OnlineModelBuilderE2MirroredFixture)
00360 {
00361   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00362 
00363   omb.printEvalGraphModelGraph(std::cerr);
00364   BOOST_TEST_MESSAGE("requesting model #1");
00365   OptionalModel mcomplete = omb.getNextIModel(ufinal);
00366   omb.printEvalGraphModelGraph(std::cerr);
00367   BOOST_REQUIRE(!!mcomplete);
00368   {
00369     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete.get()).interpretation);
00370     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 4U);
00371     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00372     BOOST_CHECK_EQUAL(ti.getAtoms().count("need(u,time)"), 1);
00373     BOOST_CHECK_EQUAL(ti.getAtoms().count("use(e)"), 1);
00374     BOOST_CHECK_EQUAL(ti.getAtoms().count("plan(b)"), 1);
00375   }
00376 
00377   BOOST_TEST_MESSAGE("requesting model #2");
00378   OptionalModel nfm = omb.getNextIModel(ufinal);
00379   omb.printEvalGraphModelGraph(std::cerr);
00380   BOOST_REQUIRE(!nfm);
00381 
00382   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00383 }
00384 
00385 BOOST_FIXTURE_TEST_CASE(online_model_building_ex1_ufinal_input, OnlineModelBuilderEx1Fixture)
00386 {
00387   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_BEGIN
00388 
00389   BOOST_TEST_MESSAGE("requesting model #1");
00390   OptionalModel mcomplete1 = omb.getNextIModel(ufinal);
00391   omb.printEvalGraphModelGraph(std::cerr);
00392   BOOST_REQUIRE(!!mcomplete1);
00393   {
00394     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete1.get()).interpretation);
00395     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 4U);
00396     BOOST_CHECK_EQUAL(ti.getAtoms().count("a"), 1);
00397     BOOST_CHECK_EQUAL(ti.getAtoms().count("c"), 1);
00398     BOOST_CHECK_EQUAL(ti.getAtoms().count("l"), 1);
00399     BOOST_CHECK_EQUAL(ti.getAtoms().count("m"), 1);
00400   }
00401 
00402   BOOST_TEST_MESSAGE("requesting model #2");
00403   OptionalModel mcomplete2 = omb.getNextIModel(ufinal);
00404   omb.printEvalGraphModelGraph(std::cerr);
00405   BOOST_REQUIRE(!!mcomplete2);
00406   {
00407     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete2.get()).interpretation);
00408     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 4U);
00409     BOOST_CHECK_EQUAL(ti.getAtoms().count("a"), 1);
00410     BOOST_CHECK_EQUAL(ti.getAtoms().count("c"), 1);
00411     BOOST_CHECK_EQUAL(ti.getAtoms().count("l"), 1);
00412     BOOST_CHECK_EQUAL(ti.getAtoms().count("n"), 1);
00413   }
00414 
00415   BOOST_TEST_MESSAGE("requesting model #3");
00416   OptionalModel mcomplete3 = omb.getNextIModel(ufinal);
00417   omb.printEvalGraphModelGraph(std::cerr);
00418   BOOST_REQUIRE(!!mcomplete3);
00419   {
00420     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete3.get()).interpretation);
00421     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 5U);
00422     BOOST_CHECK_EQUAL(ti.getAtoms().count("a"), 1);
00423     BOOST_CHECK_EQUAL(ti.getAtoms().count("d"), 1);
00424     BOOST_CHECK_EQUAL(ti.getAtoms().count("j"), 1);
00425     BOOST_CHECK_EQUAL(ti.getAtoms().count("l"), 1);
00426     BOOST_CHECK_EQUAL(ti.getAtoms().count("m"), 1);
00427   }
00428 
00429   BOOST_TEST_MESSAGE("requesting model #4");
00430   OptionalModel mcomplete4 = omb.getNextIModel(ufinal);
00431   omb.printEvalGraphModelGraph(std::cerr);
00432   BOOST_REQUIRE(!!mcomplete4);
00433   {
00434     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete4.get()).interpretation);
00435     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 5U);
00436     BOOST_CHECK_EQUAL(ti.getAtoms().count("a"), 1);
00437     BOOST_CHECK_EQUAL(ti.getAtoms().count("d"), 1);
00438     BOOST_CHECK_EQUAL(ti.getAtoms().count("j"), 1);
00439     BOOST_CHECK_EQUAL(ti.getAtoms().count("l"), 1);
00440     BOOST_CHECK_EQUAL(ti.getAtoms().count("n"), 1);
00441   }
00442 
00443   BOOST_TEST_MESSAGE("requesting model #5");
00444   OptionalModel mcomplete5 = omb.getNextIModel(ufinal);
00445   omb.printEvalGraphModelGraph(std::cerr);
00446   BOOST_REQUIRE(!!mcomplete5);
00447   {
00448     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete5.get()).interpretation);
00449     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 9U);
00450     BOOST_CHECK_EQUAL(ti.getAtoms().count("b"), 1);
00451     BOOST_CHECK_EQUAL(ti.getAtoms().count("d"), 1);
00452     BOOST_CHECK_EQUAL(ti.getAtoms().count("m"), 1);
00453     BOOST_CHECK_EQUAL(ti.getAtoms().count("f"), 1);
00454     BOOST_CHECK_EQUAL(ti.getAtoms().count("h"), 1);
00455     BOOST_CHECK_EQUAL(ti.getAtoms().count("i"), 1);
00456     BOOST_CHECK_EQUAL(ti.getAtoms().count("j"), 1);
00457     BOOST_CHECK_EQUAL(ti.getAtoms().count("k"), 1);
00458     BOOST_CHECK_EQUAL(ti.getAtoms().count("o"), 1);
00459   }
00460 
00461   BOOST_TEST_MESSAGE("requesting model #6");
00462   OptionalModel mcomplete6 = omb.getNextIModel(ufinal);
00463   omb.printEvalGraphModelGraph(std::cerr);
00464   BOOST_REQUIRE(!!mcomplete6);
00465   {
00466     TestInterpretation& ti = *(omb.getModelGraph().propsOf(mcomplete6.get()).interpretation);
00467     BOOST_CHECK_EQUAL(ti.getAtoms().size(), 8U);
00468     BOOST_CHECK_EQUAL(ti.getAtoms().count("b"), 1);
00469     BOOST_CHECK_EQUAL(ti.getAtoms().count("d"), 1);
00470     BOOST_CHECK_EQUAL(ti.getAtoms().count("n"), 1);
00471     BOOST_CHECK_EQUAL(ti.getAtoms().count("f"), 1);
00472     BOOST_CHECK_EQUAL(ti.getAtoms().count("h"), 1);
00473     BOOST_CHECK_EQUAL(ti.getAtoms().count("i"), 1);
00474     BOOST_CHECK_EQUAL(ti.getAtoms().count("j"), 1);
00475     BOOST_CHECK_EQUAL(ti.getAtoms().count("k"), 1);
00476   }
00477 
00478   BOOST_TEST_MESSAGE("requesting model #7");
00479   OptionalModel nfm = omb.getNextIModel(ufinal);
00480   omb.printEvalGraphModelGraph(std::cerr);
00481   BOOST_REQUIRE(!nfm);
00482 
00483   DO_MODEL_GENERATION_TWICE_CHECK_GENERATORCOUNT_END
00484 }
00485 
00486 BOOST_AUTO_TEST_SUITE_END()