Show
Ignore:
Timestamp:
05/06/10 17:42:05 (14 years ago)
Author:
smidl
Message:

traffic agents -- pro BDM > r904

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • applications/doprava/traffic_agent.h

    r842 r927  
    1313using namespace bdm; 
    1414 
     15class BaseTrafficAgent; 
     16 
    1517//! detector of traffic variables 
    16 class Detector{ 
    17         public: 
    18                 string name;             //! detector name 
    19                 int distance;                //! distance from stop-line 
     18class Lane{ 
     19        public: 
     20                Array<string> inputs; 
     21                Array<string> outputs; 
     22                vec alpha; //size of outputs 
     23                string queue; 
     24                string sg; 
    2025 
    2126                //! function loading info from Setting 
    2227                void from_setting(const Setting &set){ 
    23                         UI::get(name,set,"name",UI::compulsory); 
    24                         UI::get(distance,set,"distance",UI::compulsory); 
     28                        UI::get(inputs,set,"inputs",UI::compulsory); 
     29                        UI::get(outputs,set,"outputs",UI::compulsory); 
     30                        UI::get(alpha,set,"alpha",UI::compulsory); 
     31                        UI::get(queue,set,"queue",UI::compulsory); 
     32                        UI::get(sg,set,"sg",UI::compulsory); 
    2533                         
    2634                } 
    2735}; 
    2836 
    29 //! detector fo incomming flow 
    30 class DetectorIn : public Detector{ 
    31         public: 
    32         Array<string> to_sg; // to signal plans 
    33         void from_setting(const Setting &set){ 
    34                 Detector::from_setting(set); 
    35                 UI::get(to_sg, set, "to_sg", UI::compulsory); 
    36         } 
    37 }; 
    38  
    39 //! structure for output detectors 
    40 class RequestOut { 
    41         public: 
    42         string to; // agent 
    43         Array<string> detectors; //detectors 
    44         void from_setting(const Setting &set){ 
    45                 UI::get(detectors,set,"detectors",UI::compulsory); 
    46                 UI::get(to, set, "to", UI::compulsory); 
    47         } 
    48 }; 
    49  
    50  
    51 //! class with physical information about a signal group 
    52 class SignalGroup { 
    53         public: 
    54                 string name;                 //! names of the group 
    55                 Array<Detector> detectors;   //! (possible) detectors 
    56                  
    57                 //! function that loads information from Setting 
    58                 void from_setting(const Setting &set);           
    59 }; 
    60  
    6137//! class that operates on a signal group 
    62 class SignalGroupHandler { 
     38class LaneHandler { 
    6339        protected: 
    64                 //! pointer to physical signal group 
    65                 SignalGroup *sg; 
     40                //! pointer to physical lane 
     41                const Lane &lane; 
     42                //! agent pointer 
     43                BaseTrafficAgent *agent; 
    6644                 
    6745        public: 
    6846                //! actual data from the relevant signal group 
    69                 vec det_data; 
     47                vec inputs; 
     48                //! 
     49                double queue; 
     50                //!  
    7051                //! description of det_data 
    71                 RV rv_det_data; 
     52                RV rv_inputs; 
     53                //! description of det_data 
     54                RV rv_outputs; 
     55                //! description of det_data 
     56                RV rv_queue; 
    7257                //! link from global measured data  
    73                 datalink ds2data; 
    74         public: 
    75                 void connect_sg(SignalGroup &sg0, const string &agent_name){ 
    76                         sg=&sg0; 
    77                         for (int i=0;i<sg->detectors.length();i++){ 
    78                                 rv_det_data.add(RV(agent_name +"_"+ sg->detectors(i).name, 2)); //TODO intensity occupancy 
    79                         } 
    80                          
    81                 } 
     58                datalink agentin2input; 
     59                //! 
     60                datalink output2agentout; 
     61                //! 
     62                int queue_index; 
     63        public: 
     64                LaneHandler(const Lane &lane0): lane(lane0){ 
     65                        for (int i=0;i<lane0.inputs.length();i++){ 
     66                                rv_inputs.add(RV(lane.inputs(i), 2)); 
     67                        } 
     68                        for (int i=0;i<lane0.outputs.length();i++){ 
     69                                rv_outputs.add(RV(lane.outputs(i), 2));  
     70                        } 
     71                        rv_queue.add(RV(lane.queue, 1));  
     72                } 
     73                 
     74                void connect_data(BaseTrafficAgent &agent0); 
    8275                 
    8376                //! arbitrary function that computes the need of the signal group for green light in common units (number of waiting cars?) 
    84                 double expected_load(){ 
    85                         if (det_data.length()>0){ 
    86                                 return det_data(0); // whatever 
    87                         } else { 
    88                                 return 1.0; // mean value 
    89                         } 
    90                 } 
    91 }; 
    92  
    93 class RequestHandler{ 
    94         protected: 
    95                 RequestOut *rq; 
    96         public: 
    97                 RV rv; 
    98         public: 
    99                 void connect_request(RequestOut &rq0, const string &agent_name){ 
    100                         rq=&rq0; 
    101                         for (int i=0;i<rq->detectors.length();i++){ 
    102                                 rv.add(RV(rq->detectors(i), 2)); //TODO intensity occupancy 
    103                         } 
    104                 } 
     77                double expected_output(double green_time); 
    10578}; 
    10679 
     
    11083*/ 
    11184class BaseTrafficAgent : public Participant { 
    112         protected: 
     85        LOG_LEVEL(BaseTrafficAgent,logdata); 
     86        public: 
    11387                //! Signal Groups 
    114                 Array<SignalGroup> sg; 
    115  
    116                 Array<SignalGroupHandler> sgh; 
     88                Array<Lane> lanes; 
     89 
     90                Array<LaneHandler*> lanehs; 
    11791                                                                                 
    11892                //!data from messages 
    119                 vec input_data; 
     93                vec inputs; 
    12094                 
    12195                //! decription of msg_data 
    122                 RV input_rv; 
     96                RV rv_inputs; 
    12397                 
    12498                //! data to broadcast 
    125                 vec output_data; 
     99                vec outputs; 
    126100                 
    127101                //! description of broadcast dataind 
    128                 RV output_rv; 
     102                RV rv_outputs; 
     103                 
     104                vec queues; 
     105                 
     106                //! description of queues 
     107                RV rv_queues; 
    129108                 
    130109                //! datalink from DS to output variables 
    131                 datalink ds2output; 
    132                                          
    133                 //! output recepient 
    134                 Array<RequestOut> requests; 
    135                 Array<RequestHandler> request_handler; 
     110                datalink ds2inputs; 
     111 
     112                //! datalink from DS to output variables 
     113                datalink ds2queues; 
    136114                 
    137115                //! action description 
    138116                RV action_rv; 
    139                  
     117                                 
    140118                datalink_part action2ds; 
    141119                 
     120                Array<string> neighbours; 
     121                 
     122                Array<RV> rv_neighbours_out; 
     123                 
     124                Array<datalink> output2neighbour; 
     125                 
    142126        public: 
    143127                void validate(){ 
     128                        lanehs.set_length(lanes.length()); 
     129                        for (int l=0; l<lanes.length(); l++){ 
     130                                lanehs(l) = new LaneHandler(lanes(l)); 
     131                                 
     132                                rv_inputs.add(lanehs(l)->rv_inputs); 
     133                                rv_outputs.add(lanehs(l)->rv_outputs); 
     134                                rv_queues.add(lanehs(l)->rv_queue); 
     135                        } 
     136                        inputs.set_size(rv_inputs._dsize()); 
     137                        outputs.set_size(rv_outputs._dsize()); 
     138                        queues.set_size(rv_queues._dsize()); 
     139                         
     140                        for (int l=0; l<lanes.length(); l++){ 
     141                                lanehs(l)->connect_data(*this); 
     142                        } 
     143                         
     144                        //for -- rv_outputs --  
     145                        // TODO vybrat rv pro sousedy  
     146                        rv_neighbours_out.set_length(neighbours.length()); 
     147                        output2neighbour.set_length(neighbours.length()); 
     148                         
     149                        for (int i=0; i<neighbours.length(); i++){ 
     150                                for (int r=0; r<rv_outputs.length(); r++){ 
     151                                        int str_pos = rv_outputs.name(r).compare(neighbours(i)); 
     152                                        if (str_pos>neighbours(i).length()){ 
     153                                                rv_neighbours_out(i).add(rv_outputs.subselect(vec_1(r))); 
     154                                        } 
     155                                } 
     156                                // connect datasource 
     157                                output2neighbour(i).set_connection(rv_neighbours_out(i), rv_outputs); 
     158                        } 
     159                         
     160                        // lanehs knows RVS 
    144161                        // write internal checks if all was loaded OK 
    145162                         
    146                         // set action variable == this is a feature of the agent! 
    147                         action_rv = RV(name+"_Tc", 1); // <======= example 
    148163                } 
    149164                void receive(const Setting &msg){ 
     
    151166                        UI::get(what, msg, "what", UI::compulsory); 
    152167                         
    153                         if (what=="data"){ //  
     168                        if (what=="new_stable_state"){ //  
    154169                                // field data  
    155170                                // extract decription of teh received datavector 
    156171                                shared_ptr<RV> rv=UI::build<RV>(msg,"rv",UI::compulsory); 
    157172                                // find if it is needed 
    158                                 ivec ind=rv->dataind(input_rv); // position of rv in in_rv; 
     173                                ivec ind=rv->dataind(rv_inputs); // position of rv in in_rv; 
    159174                                if (ind.length()>0){ //data are interesting 
    160175                                        vec dt; 
    161176                                        UI::get(dt, msg, "value",UI::compulsory); // get data 
    162                                         set_subvector(input_data, ind,  dt); //check size? 
     177                                        set_subvector(inputs, ind,  dt); //check size? 
    163178                                }                                
    164179                        } else { 
    165                                 bdm_warning("Unknown message of type "+what); 
     180                                Participant::receive(msg); 
    166181                        } 
    167182                } 
    168183                void log_register(logger &L, const string &prefix){ 
    169184                        root::log_register ( L, prefix ); 
    170                         logrec->ids.set_size(sg.length()+2); 
    171                         int i; 
    172                         for (i=0;i <sg.length(); i++) { 
    173                                 logrec->ids(i)=logrec->L.add_vector(sgh(i).rv_det_data, ""); 
    174                         } 
    175                         logrec->ids(i)=logrec->L.add_vector(input_rv,"in_"); i++; 
    176                         logrec->ids(i)=logrec->L.add_vector(output_rv,"out_"); 
     185                        if ( log_level[logdata]){ 
     186                                L.add_vector ( log_level, logdata, RV ( 1 ), prefix );   
     187                        } 
    177188                } 
    178189                void log_write() const { 
    179                         int i; 
    180                         for (i=0;i <sg.length(); i++) { 
    181                                 logrec->L.log_vector(logrec->ids(i), sgh(i).det_data); 
    182                         } 
    183                         logrec->L.log_vector(logrec->ids(i),input_data); i++; 
    184                         logrec->L.log_vector(logrec->ids(i),output_data); i++; 
     190                        if (log_level[logdata]){ 
     191                                log_level.store(logdata, inputs); 
     192                        } 
    185193                } 
    186194                 
    187195                void broadcast(Setting& set){ 
    188196                        // broadcast data to all neighbours 
    189                         for (int i=0; i<request_handler.length(); i++){ 
     197                        for (int i=0; i<neighbours.length(); i++){ 
    190198                                Setting &msg =set.add(Setting::TypeGroup); 
    191                                 RequestHandler &R=request_handler(i); 
    192199                                 
     200                                // if... 
    193201                                // copy from create message 
    194202                                // create msg with fields {to=..., what=data, rv=..., value = ...} 
    195                                 UI::save ( requests(i).to, msg, "to"); 
    196                                 UI::save ( (string)"data", msg, "what"); 
    197                                 UI::save ( &R.rv, msg, "rv"); 
    198                                 UI::save(output_data, msg, "value"); 
    199                         } 
     203                                UI::save ( neighbours(i), msg, "to"); 
     204                                UI::save ( (string)"new_stable_state", msg, "what"); 
     205                                UI::save ( &(rv_neighbours_out(i)), msg, "rv"); 
     206                                UI::save( output2neighbour(i).pushdown(outputs), msg, "value"); 
     207                        } 
     208                         
    200209                } 
    201210                void adapt(const vec &glob_dt){ 
    202211                        // copy data from global vector to sSGHandlers 
    203                         for (int i=0; i<sgh.length();i++){ 
    204                                 sgh(i).ds2data.filldown(glob_dt, sgh(i).det_data); 
    205                         } 
     212                        ds2inputs.filldown(glob_dt, inputs); 
    206213                        //copy data fro neighbours 
    207                         ds2output.filldown(glob_dt, output_data); 
     214                        ds2queues.filldown(glob_dt, queues); 
    208215                        // copy sg_length ... and others... 
    209216                } 
    210217                void act(vec &glob_ut){ 
    211                         vec needs(sgh.length()); 
    212                         for (int i=0; i<sgh.length();i++){ 
    213                                 needs(i) = sgh(i).expected_load(); 
    214                         } 
    215218                        vec action; // trivial stuff 
    216219                        action2ds.filldown(action,glob_ut); 
     
    219222                void ds_register(const DS &ds){ 
    220223                        //register ds2output 
    221                         ds2output.set_connection(output_rv, ds._drv()); 
    222                         output_data.set_size(output_rv._dsize()); 
    223                         for (int i=0; i<sgh.length(); i++){ 
    224                                 sgh(i).ds2data.set_connection(sgh(i).rv_det_data, ds._drv()); 
    225                         } 
     224                        ds2inputs.set_connection(rv_inputs, ds._drv()); 
     225                        ds2queues.set_connection(rv_queues, ds._drv()); 
     226                        inputs.set_size(rv_inputs._dsize()); 
    226227                        action2ds.set_connection( ds._urv(), action_rv); 
    227228                }