00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "op_mc.h"
00029
00030 namespace faudes {
00031
00032 bool MutualControllability(const cGenerator& rGen1, const cGenerator& rGen2) {
00033 OP_DF("MutualControllability(" << rGen1.Name() << ", "
00034 << rGen2.Name() << ")");
00035
00036 StateSet forbidden1;
00037 StateSet forbidden2;
00038
00039 return MutualControllability(rGen1, rGen2, forbidden1, forbidden2);
00040 }
00041
00042
00043 bool MutualControllability(const cGenerator& rGen1, const cGenerator& rGen2,
00044 StateSet& rForbidden1, StateSet& rForbidden2) {
00045 OP_DF("MutualControllability(" << rGen1.Name() << ", "
00046 << rGen2.Name() << ", rForbidden1, rForbidden2)");
00047
00048
00049 const EventSet alph12 = rGen1.Alphabet() * rGen2.Alphabet();
00050 OP_DF("MutualControllability: shared events \"" << alph12.ToString()
00051 << "\"");
00052
00053 if (alph12.Empty()) {
00054 OP_DF("MutualControllability: shared alphabet empty. "
00055 << "terminating successful");
00056 return true;
00057 }
00058
00059 const EventSet ualph12 = rGen1.UncontrollableEvents() * rGen2.UncontrollableEvents();
00060 OP_DF("MutualControllability: shared uncontrollable events \""
00061 << ualph12.ToString() << "\"");
00062
00063 if (ualph12.Empty()) {
00064 OP_DF("MutualControllability: shared uncontrollable alphabet empty "
00065 << "terminating successful");
00066 return true;
00067 }
00068
00069 bool result1;
00070 bool result2;
00071 rForbidden1.Clear();
00072 rForbidden2.Clear();
00073
00074 cGenerator g = rGen1.NewCGen();
00075
00076 cProject(rGen2, alph12, g);
00077 InvProject(g, rGen1.Alphabet());
00078
00079
00080 result1 = IsControllable(g, (rGen1.Alphabet() - ualph12), rGen1, rForbidden1);
00081
00082 if (result1 == false) {
00083 OP_DF("MutualControllability(" << rGen1.Name() << ", " << rGen2.Name()
00084 << "): uncontrollable states: " << rForbidden1.ToString());
00085 }
00086
00087 cProject(rGen1, alph12, g);
00088 InvProject(g, rGen2.Alphabet());
00089
00090
00091 result2 = IsControllable(g, (rGen2.Alphabet() - ualph12), rGen2, rForbidden2);
00092
00093 if (result2 == false) {
00094 OP_DF("MutualControllability(" << rGen1.Name() << ", " << rGen2.Name()
00095 << "): uncontrollable states: " << rForbidden2.ToString());
00096 }
00097
00098 if (result1 && result2) {
00099 OP_DF("MutualControllability: fulfilled");
00100 }
00101 else {
00102 OP_DF("MutualControllability: failed");
00103 }
00104
00105 return (result1 && result2);
00106 }
00107
00108 }
00109