00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef OMC_ORIENTED_MATROID_H
00028 #define OMC_ORIENTED_MATROID_H
00029
00030 #include "Core.h"
00031 #include "Permutation.h"
00032 #include "Combination.h"
00033 #include <set>
00034
00035 namespace omc
00036 {
00037 class OrientedMatroid
00038 {
00039 public:
00040 enum om_type { empty, alternating };
00041
00042 OrientedMatroid (size_t, size_t);
00043
00044 virtual ~OrientedMatroid () {};
00045
00046 virtual OrientedMatroid* clone () const = 0;
00047
00048
00049 size_t getRank () const;
00050 size_t getNumElements () const;
00051
00052
00053 virtual void relabel (index_t, index_t) = 0;
00054 virtual void relabel (const Permutation &) = 0;
00055
00056
00057 virtual void reorient (index_t) = 0;
00058 virtual void reorient (const std::set<index_t> &) = 0;
00059 virtual void reorient (const Combination &) = 0;
00060
00061
00062 virtual void remove (index_t);
00063 virtual void contract (index_t);
00064
00065
00066 virtual bool operator== (const OrientedMatroid &) const = 0;
00067
00068
00069 bool equivalent (const OrientedMatroid &);
00070
00071 protected:
00072 size_t m_rank, m_numElements;
00073
00074 private:
00075 void shrink (index_t);
00076 };
00077
00078
00080 inline OrientedMatroid::OrientedMatroid (size_t r, size_t n)
00081 : m_rank (r), m_numElements (n)
00082 {}
00083
00085 inline size_t OrientedMatroid::getRank () const {
00086 return m_rank;
00087 }
00088
00090 inline size_t OrientedMatroid::getNumElements () const {
00091 return m_numElements;
00092 }
00093
00095 inline void OrientedMatroid::remove (index_t i) {
00096 shrink (i);
00097 }
00098
00100 inline void OrientedMatroid::contract (index_t i) {
00101 shrink (i);
00102 m_rank--;
00103 }
00104
00105 };
00106
00107 #endif