contrib/mul/mmn/mmn_solver.cxx
Go to the documentation of this file.
00001 #include "mmn_solver.h"
00002 //:
00003 // \file
00004 // \brief Base for classes which solve Markov Random Field problems
00005 // \author Tim Cootes
00006 
00007 #include <vsl/vsl_indent.h>
00008 #include <vsl/vsl_binary_loader.h>
00009 #include <vcl_cassert.h>
00010 
00011 #include <mbl/mbl_parse_block.h>
00012 #include <mbl/mbl_read_props.h>
00013 #include <mbl/mbl_cloneables_factory.h>
00014 
00015 //=======================================================================
00016 // Dflt ctor
00017 //=======================================================================
00018 
00019 mmn_solver::mmn_solver()
00020 {
00021 }
00022 
00023 //=======================================================================
00024 // Destructor
00025 //=======================================================================
00026 
00027 mmn_solver::~mmn_solver()
00028 {
00029 }
00030 
00031 
00032 //: Initialise from a string stream
00033 bool mmn_solver::set_from_stream(vcl_istream &is)
00034 {
00035   // Cycle through string and produce a map of properties
00036   vcl_string s = mbl_parse_block(is);
00037   vcl_istringstream ss(s);
00038   mbl_read_props_type props = mbl_read_props_ws(ss);
00039 
00040   if (props.size()!=0)
00041   {
00042     vcl_cerr<<is_a()<<" does not expect any extra arguments.\n";
00043     mbl_read_props_look_for_unused_props(
00044       "mmn_solver::set_from_stream", props, mbl_read_props_type());
00045   }
00046   return true;
00047 }
00048 
00049 //=======================================================================
00050 // Method: version_no
00051 //=======================================================================
00052 
00053 short mmn_solver::version_no() const
00054 {
00055   return 1;
00056 }
00057 
00058 //=======================================================================
00059 // Method: is_a
00060 //=======================================================================
00061 
00062 vcl_string mmn_solver::is_a() const
00063 {
00064   return vcl_string("mmn_solver");
00065 }
00066 
00067 //: Allows derived class to be loaded by base-class pointer
00068 void vsl_add_to_binary_loader(const mmn_solver& b)
00069 {
00070   vsl_binary_loader<mmn_solver>::instance().add(b);
00071 }
00072 
00073 //: Create a concrete region_model-derived object, from a text specification.
00074 vcl_auto_ptr<mmn_solver> mmn_solver::
00075   create_from_stream(vcl_istream &is)
00076 {
00077   vcl_string name;
00078   is >> name;
00079   vcl_auto_ptr<mmn_solver> pair_cost;
00080   try {
00081     pair_cost = mbl_cloneables_factory<mmn_solver>::get_clone(name);
00082   }
00083   catch (const mbl_exception_no_name_in_factory & e)
00084   {
00085     throw (mbl_exception_parse_error( e.what() ));
00086   }
00087   pair_cost->set_from_stream(is);
00088   return pair_cost;
00089 }
00090 
00091 //=======================================================================
00092 // Associated function: operator<<
00093 //=======================================================================
00094 
00095 void vsl_b_write(vsl_b_ostream& bfs, const mmn_solver& b)
00096 {
00097   b.b_write(bfs);
00098 }
00099 
00100 //=======================================================================
00101 // Associated function: operator>>
00102 //=======================================================================
00103 
00104 void vsl_b_read(vsl_b_istream& bfs, mmn_solver& b)
00105 {
00106   b.b_read(bfs);
00107 }
00108 
00109 //=======================================================================
00110 // Associated function: operator<<
00111 //=======================================================================
00112 
00113 vcl_ostream& operator<<(vcl_ostream& os,const mmn_solver& b)
00114 {
00115   os << b.is_a() << ": ";
00116   vsl_indent_inc(os);
00117   b.print_summary(os);
00118   vsl_indent_dec(os);
00119   return os;
00120 }
00121 
00122 //=======================================================================
00123 // Associated function: operator<<
00124 //=======================================================================
00125 
00126 vcl_ostream& operator<<(vcl_ostream& os,const mmn_solver* b)
00127 {
00128   if (b)
00129     return os << *b;
00130   else
00131     return os << "No mmn_solver defined.";
00132 }