FreeLing
4.0
|
00001 00002 // 00003 // FreeLing - Open Source Language Analyzers 00004 // 00005 // Copyright (C) 2014 TALP Research Center 00006 // Universitat Politecnica de Catalunya 00007 // 00008 // This library is free software; you can redistribute it and/or 00009 // modify it under the terms of the GNU Affero General Public 00010 // License as published by the Free Software Foundation; either 00011 // version 3 of the License, or (at your option) any later version. 00012 // 00013 // This library is distributed in the hope that it will be useful, 00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 // Affero General Public License for more details. 00017 // 00018 // You should have received a copy of the GNU Affero General Public 00019 // License along with this library; if not, write to the Free Software 00020 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00021 // 00022 // contact: Lluis Padro (padro@lsi.upc.es) 00023 // TALP Research Center 00024 // despatx C6.212 - Campus Nord UPC 00025 // 08034 Barcelona. SPAIN 00026 // 00028 00029 #ifndef _RELAX 00030 #define _RELAX 00031 00032 #include <list> 00033 #include <vector> 00034 00035 namespace freeling { 00036 00037 00044 00045 class constraint : public std::vector<std::vector<double*> > { 00046 private: 00047 double compatibility; 00048 00049 public: 00051 constraint(int); 00052 00054 void set_compatibility(double); 00055 double get_compatibility() const; 00056 }; 00057 00064 00065 class label { 00066 friend class problem; 00067 friend class relax; 00068 00069 protected: 00071 double weight[2]; 00073 std::list<constraint> constraints; 00074 00075 public: 00077 label(); 00078 double get_weight(int) const; 00079 void set_weight(int, double); 00080 00081 }; 00082 00094 00095 class problem { 00096 friend class relax; 00097 protected: 00099 std::vector<std::vector<label> > vars; 00101 int CURRENT, NEXT; 00102 00103 public: 00105 problem(int); 00106 00108 void add_label(int, double); 00110 void add_constraint (int, int, const std::list<std::list<std::pair<int,int> > > &, double); 00112 std::list<int> best_label(int) const; 00114 bool there_are_changes(double) const; 00116 void next_iteration(); 00117 }; 00118 00119 00120 00127 00128 class relax { 00129 private: 00131 int MaxIter; 00133 double ScaleFactor; 00135 double Epsilon; 00136 00138 double NormalizeSupport(double) const; 00139 00140 public: 00142 relax(int, double, double); 00143 00145 void solve(problem &) const; 00147 void set_scale_factor(double); 00148 }; 00149 00150 } // namespace 00151 00152 #endif