root/vtcross/branches/nikhil/crossmodel2/src/cognitive_engines/CognitiveEngine.cpp @ 560

Revision 560, 9.1 KB (checked in by nikhil, 14 years ago)
Line 
1/*
2 Copyright 2009 Virginia Polytechnic Institute and State University 
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7 
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15*/
16
17/*! This file provides a default implementation for a cognitive engine.  Note
18 * that this implementation is very basic, and is meant to act as a non-abstract
19 * parent class.
20 */
21
22#include <cstdlib>
23#include <cstring>
24#include <stdint.h>
25#include <cmath>
26#include <string>
27#include <iostream>
28
29#include "vtcross/cognitive_engine.h"
30#include "vtcross/common.h"
31#include "vtcross/containers.h"
32#include "vtcross/debug.h"
33#include "vtcross/error.h"
34#include "vtcross/socketcomm.h"
35
36using namespace std;
37
38
39CognitiveEngine::CognitiveEngine()
40{
41    LOG("Creating Cognitive Engine.\n");
42    SML_present = false;
43    commandSocketFD = -1;
44}
45
46
47CognitiveEngine::~CognitiveEngine()
48{
49    delete [] pList;
50    delete [] oList;
51    delete [] uList;
52
53    delete [] radioInfo;
54    delete [] optList;
55}
56
57
58CognitiveEngine::CognitiveEngine(const char *serverName, const char *serverPort, \
59        const int32_t numFields, const bool SML)
60{
61    LOG("Creating Cognitive Engine.\n");
62
63    pList = new Parameter[numFields];
64    oList = new Observable[numFields];
65    uList = new Utility[numFields];
66
67    radioInfo = new Radio_Info;
68    optList = new Opt_List;
69
70    ConnectToRemoteComponent(serverName, serverPort, SML);
71
72}
73
74void
75CognitiveEngine::SendComponentType()
76{
77    SendMessage(commandSocketFD, "response_engine_cognitive");
78    LOG("Cognitive Engine responded to GetRemoteComponentType query.\n");
79}
80
81
82void
83CognitiveEngine::ConnectToRemoteComponent(const char *serverName, \
84        const char *serverPort, const bool SML)
85{
86    commandSocketFD = ClientSocket(serverName, serverPort);
87
88    SML_present = SML;
89
90
91// Considering only Shell to work in this project!!
92
93        LOG("Cognitive Engine connected to shell at %s.\n", serverName);
94
95        RegisterComponent();
96        ReceiveRadioConfiguration();
97        ReceiveExperience();
98
99}
100
101
102void
103CognitiveEngine::WaitForSignal()
104{
105    char buffer[256];
106
107    std::cout << "IN WAITFORSIGNAL METHOD" << std::endl;
108
109    while(true) {
110        memset(buffer, 0, 256);
111       
112        ReadMessage(commandSocketFD, buffer);
113
114        if(strcmp(buffer, "update_performance") == 0) {
115            PerformUpdatePerformance();
116        }
117        else if(strcmp(buffer, "request_optimization") == 0) {
118            PerformRequestOptimization();
119        }
120        else if(strcmp(buffer, "reset_engine_cognitive") == 0) {
121            PerformResetEngineCognitive();
122        }
123        else if(strcmp(buffer, "shutdown_engine_cognitive") == 0) {
124            PerformShutdownEngineCognitive();
125        }
126    }
127}
128
129
130void
131CognitiveEngine::Shutdown()
132{
133        DeregisterComponent();
134    // TODO Need to actually kill this process...
135}
136
137
138void
139CognitiveEngine::Reset()
140{
141    LOG("Resetting Cognitive Engine.\n");
142
143        DeregisterComponent();
144
145    // TODO This function then needs to re-call "ConnectToRemoteComponent" to
146    // finish the reset - otherwise, it is just a shutdown.
147}
148
149
150void
151CognitiveEngine::RegisterComponent()
152{
153    char buffer[256];
154    SendMessage(commandSocketFD, "register_engine_cognitive");
155    LOG("Cognitive Engine:: Registration message sent to shell.\n");
156
157    memset(buffer, 0, 256);
158    ReadMessage(commandSocketFD, buffer);
159
160    // TODO Are we reading an ACK here? If so, why aren't we doing anything with
161    // it?
162}
163
164void
165CognitiveEngine::DeregisterComponent()
166{
167    SendMessage(commandSocketFD, "deregister_engine_cognitive");
168    LOG("Cognitive Engine:: Deregistration message sent.\n");
169
170    shutdown(commandSocketFD, 2);
171    close(commandSocketFD);
172    commandSocketFD = -1;
173    LOG("Cognitive Engine:: Shell socket closed.\n");
174}
175
176
177void
178CognitiveEngine::ReceiveRadioConfiguration()
179{
180    LOG("Cognitive Engine:: Receiving Radio Configuration.\n");
181   
182    char buffer[256];
183 
184    /* Receive Set of Utilities */
185    memset(buffer, 0, 256);
186    ReadMessage(commandSocketFD, buffer);
187    radioInfo->numUtilities = atoi(buffer);
188
189    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
190        memset(buffer, 0, 256);
191        ReadMessage(commandSocketFD, buffer);
192        uList[i].name = std::string(buffer);
193   
194        memset(buffer, 0, 256);
195        ReadMessage(commandSocketFD, buffer);
196        uList[i].units = std::string(buffer);
197
198        memset(buffer, 0, 256);
199        ReadMessage(commandSocketFD, buffer);
200        uList[i].goal = std::string(buffer);
201   
202        memset(buffer, 0, 256);
203        ReadMessage(commandSocketFD, buffer);
204        uList[i].target = atof(buffer);
205    }
206
207    /* Receive Set of Parameters */
208    memset(buffer, 0, 256);
209    ReadMessage(commandSocketFD, buffer);
210    radioInfo->numParameters = atoi(buffer);
211   
212    for(size_t i = 0; i < radioInfo->numParameters; i++) {
213        memset(buffer, 0, 256);
214        ReadMessage(commandSocketFD, buffer);
215        pList[i].name = std::string(buffer);
216   
217        memset(buffer, 0, 256);
218        ReadMessage(commandSocketFD, buffer);
219        pList[i].units = std::string(buffer);
220
221        memset(buffer, 0, 256);
222        ReadMessage(commandSocketFD, buffer);
223        pList[i].min = atof(buffer);
224   
225        memset(buffer, 0, 256);
226        ReadMessage(commandSocketFD, buffer);
227        pList[i].max = atof(buffer);
228   
229        memset(buffer, 0, 256);
230        ReadMessage(commandSocketFD, buffer);
231        pList[i].step = atof(buffer);
232   
233        memset(buffer, 0, 256);
234        ReadMessage(commandSocketFD,buffer);
235        pList[i].numAffects = atoi(buffer);
236   
237        for(size_t j = 0; j < pList[i].numAffects; j++) {
238            memset(buffer, 0, 256);
239            ReadMessage(commandSocketFD,buffer);
240            // TODO for + if{break} = while?
241            for(size_t k = 0; k < radioInfo->numUtilities; k++) {
242                if(uList[k].name == std::string(buffer)) {   
243                    pList[i].affection_list[j].u = &uList[k];   
244                    break;
245                }
246            }
247
248            memset(buffer, 0, 256);
249            ReadMessage(commandSocketFD, buffer);
250            pList[i].affection_list[j].relation = std::string(buffer);   
251        }
252    }   
253
254    /* Receive Set of Observables */
255    memset(buffer, 0, 256);
256    ReadMessage(commandSocketFD, buffer);
257    radioInfo->numObservables = atoi(buffer);
258   
259    for(size_t i = 0; i < radioInfo->numObservables; i++) {
260        memset(buffer, 0, 256);
261        ReadMessage(commandSocketFD, buffer);
262        oList[i].name = std::string(buffer);
263   
264        memset(buffer, 0, 256);
265        ReadMessage(commandSocketFD, buffer);
266        oList[i].numAffects = atoi(buffer);
267   
268        for(size_t j = 0; j < oList[i].numAffects; j++) {
269            memset(buffer, 0, 256);
270            ReadMessage(commandSocketFD, buffer);
271            // TODO for + if{break} = while?
272            for(size_t k = 0; k < radioInfo->numUtilities; k++) {
273                if(uList[k].name == std::string(buffer)){   
274                    oList[i].affection_list[j].u = &uList[k];   
275                    break;
276                }
277            }
278 
279            memset(buffer, 0, 256);
280            ReadMessage(commandSocketFD, buffer);
281            oList[i].affection_list[j].relation = std::string(buffer);   
282        }
283    }
284
285    SendMessage(commandSocketFD, "receive_config_ack");
286}
287
288
289void
290CognitiveEngine::ReceiveExperience()
291{
292    LOG("Cognitive Engine:: Receiving Experience Report.\n");
293    char buffer[256];
294    uint32_t numberExp;
295   
296    /* Receive number of experience entries */
297    memset(buffer, 0, 256);
298    ReadMessage(commandSocketFD, buffer);
299    numberExp = atoi(buffer);
300
301    LOG("Cognitive Engine:: Waiting for %i number of entries.\n", numberExp);
302    SendMessage(commandSocketFD, "receive_exp_ack");
303
304}
305
306
307/***************************************************************************
308 *
309 * Every function below this banner must be overloaded by child classes.
310 *
311 ***************************************************************************/
312
313
314Parameter*
315CognitiveEngine::GetSolution(Observable *observables, Parameter *currentParameters, Utility *utilities)
316{
317    LOG("Cognitive Engine:: Generating solution.\n");
318
319    LOG("CognitiveEngine:: GetSolution not implemented.\n");
320
321    return NULL;
322}
323
324
325void
326CognitiveEngine::ReceiveFeedback(Observable *observables,Parameter *parameters, Utility *utilities)
327{
328    LOG("Cognitive Engine:: Receiving feedback.\n");
329
330    LOG("CognitiveEngine:: ReceiveFeedback not implemented.\n");
331}
332
333
334void
335CognitiveEngine::BuildCognitiveEngine()
336{
337    LOG("Cognitive Engine:: BuildCognitiveEngine not implemented.\n");
338}
339
340
341void
342CognitiveEngine::PerformUpdatePerformance()
343{
344}
345
346
347void
348CognitiveEngine::PerformRequestOptimization()
349{
350}
351
352
353void
354CognitiveEngine::PerformResetEngineCognitive()
355{
356}
357
358
359void
360CognitiveEngine::PerformShutdownEngineCognitive()
361{
362}
363 
Note: See TracBrowser for help on using the browser.