00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "cgenfunct.h"
00025
00026 namespace faudes {
00027
00028
00029 bool cIsControllable(
00030 const cGenerator& rPlantGen,
00031 const vGenerator& rSupCandGen)
00032 {
00033 return IsControllable(rPlantGen, rPlantGen.ControllableEvents(), rSupCandGen);
00034 }
00035
00036
00037
00038
00039 void cSupConNB(
00040 const cGenerator& rPlantGen,
00041 const vGenerator& rSpecGen,
00042 cGenerator& rResGen) {
00043
00044
00045 cGenerator* pResGen = &rResGen;
00046 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
00047 pResGen= rResGen.NewP();
00048 }
00049
00050
00051 SupConNB(rPlantGen, rPlantGen.ControllableEvents(),rSpecGen,*pResGen);
00052
00053
00054 pResGen->SetControllable(rPlantGen.ControllableEvents());
00055
00056
00057 if(pResGen != &rResGen) {
00058 rResGen = *pResGen;
00059 delete pResGen;
00060 }
00061
00062 }
00063
00064
00065
00066 void cSupCon(
00067 const cGenerator& rPlantGen,
00068 const vGenerator& rSpecGen,
00069 cGenerator& rResGen) {
00070
00071
00072 cGenerator* pResGen = &rResGen;
00073 if(&rResGen== &rPlantGen || &rResGen== &rSpecGen) {
00074 pResGen= rResGen.NewP();
00075 }
00076
00077
00078 SupCon(rPlantGen, rPlantGen.ControllableEvents(),rSpecGen,*pResGen);
00079
00080
00081 pResGen->SetControllable(rPlantGen.ControllableEvents());
00082
00083
00084 if(pResGen != &rResGen) {
00085 rResGen = *pResGen;
00086 delete pResGen;
00087 }
00088
00089 }
00090
00091
00092
00093 void cParallel(
00094 const cGenerator& rGen1,
00095 const cGenerator& rGen2,
00096 cGenerator& rResGen)
00097 {
00098
00099
00100 #ifdef FAUDES_CHECKED
00101 EventSet inconsistent =
00102 (rGen1.ControllableEvents()*rGen2.UncontrollableEvents())
00103 +(rGen1.UncontrollableEvents()*rGen2.ControllableEvents());
00104
00105 if(!inconsistent.Empty()) {
00106 std::stringstream errstr;
00107 errstr << "cParallel: inconsistent controllability flags";
00108
00109 }
00110 #endif
00111
00112
00113 cGenerator* pResGen = &rResGen;
00114 if(&rResGen== &rGen1 || &rResGen== &rGen2) {
00115 pResGen= rResGen.NewP();
00116 }
00117
00118
00119 Parallel(rGen1,rGen2,*pResGen);
00120
00121
00122 pResGen->SetControllable(rGen1.ControllableEvents());
00123 pResGen->SetControllable(rGen2.ControllableEvents());
00124
00125
00126 if(pResGen != &rResGen) {
00127 rResGen = *pResGen;
00128 delete pResGen;
00129 }
00130 }
00131
00132
00133
00134 void cProject(
00135 const cGenerator& rGen,
00136 const EventSet& rProjectAlphabet,
00137 cGenerator& rResGen)
00138 {
00139
00140
00141 cGenerator* pResGen = &rResGen;
00142 if(&rResGen== &rGen) {
00143 pResGen= rResGen.NewP();
00144 }
00145
00146
00147 Project(rGen,rProjectAlphabet,*pResGen);
00148
00149
00150 pResGen->SetControllable(rGen.ControllableEvents()*rProjectAlphabet);
00151
00152
00153 if(pResGen != &rResGen) {
00154 rResGen = *pResGen;
00155 delete pResGen;
00156 }
00157 }
00158
00159
00160
00161 void cProjectNonDet(
00162 cGenerator& rGen,
00163 const EventSet& rProjectAlphabet)
00164 {
00165
00166
00167 ProjectNonDet(rGen,rProjectAlphabet);
00168
00169 }
00170
00171
00172
00173
00174 void cInvProject(
00175 cGenerator& rGen,
00176 const cEventSet& rProjectAlphabet)
00177 {
00178
00179
00180 EventSet extra = rProjectAlphabet - rGen.Alphabet();
00181
00182
00183 InvProject(rGen,rProjectAlphabet);
00184
00185
00186 for(EventSet::Iterator eit=extra.Begin(); eit!=extra.End(); ++eit)
00187 rGen.EventAttribute(*eit,rProjectAlphabet.Attribute(*eit));
00188
00189 }
00190
00191
00192
00193 }