Subversion Repositories public iLand

Rev

Rev 163 | Rev 165 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1
 
105 Werner 2
/** ModelController is a helper class used to
3
  control the flow of operations during a model run.
4
  Really useful???? or a dispatcher???
5
  */
128 Werner 6
 
105 Werner 7
#include "global.h"
8
#include "modelcontroller.h"
128 Werner 9
#include <QObject>
105 Werner 10
 
11
#include "model.h"
128 Werner 12
#include "helper.h"
161 werner 13
#include "expressionwrapper.h"
105 Werner 14
 
15
ModelController::ModelController()
16
{
128 Werner 17
    mModel = NULL;
105 Werner 18
}
128 Werner 19
 
20
ModelController::~ModelController()
21
{
22
    destroy();
23
}
24
 
25
 
145 Werner 26
bool ModelController::canCreate()
128 Werner 27
{
129 Werner 28
    if (mModel)
128 Werner 29
        return false;
30
    return true;
31
}
32
 
145 Werner 33
bool ModelController::canDestroy()
128 Werner 34
{
35
    return mModel != NULL;
36
}
37
 
145 Werner 38
bool ModelController::canRun()
128 Werner 39
{
40
    if (mModel && mModel->isSetup())
41
        return true;
42
    return false;
43
}
44
 
145 Werner 45
bool ModelController::isRunning()
128 Werner 46
{
162 werner 47
 return GlobalSettings::instance()->currentYear()>0;
128 Werner 48
}
49
 
50
 
51
void ModelController::setFileName(QString initFileName)
52
{
53
    mInitFile = initFileName;
54
    try {
55
        GlobalSettings::instance()->loadProjectFile(mInitFile);
56
    } catch(const IException &e) {
57
        QString error_msg = e.toString();
58
        Helper::msg(error_msg);
59
        qDebug() << error_msg;
60
    }
61
}
62
 
63
void ModelController::create()
64
{
65
    if (!canCreate())
66
        return;
67
    try {
68
    mModel = new Model();
69
    mModel->loadProject();
136 Werner 70
 
129 Werner 71
    if (mModel->isSetup())
72
        mModel->beforeRun();
164 werner 73
        GlobalSettings::instance()->clearDebugLists();
128 Werner 74
    } catch(const IException &e) {
75
        QString error_msg = e.toString();
76
        Helper::msg(error_msg);
77
        qDebug() << error_msg;
78
    }
79
}
80
 
81
void ModelController::destroy()
82
{
83
    if (canDestroy()) {
84
        delete mModel;
85
        mModel = 0;
162 werner 86
        GlobalSettings::instance()->setCurrentYear(0);
128 Werner 87
        qDebug() << "ModelController: Model destroyed.";
88
    }
89
}
90
void ModelController::run()
91
{
92
    if (!canRun()) return;
93
    try {
94
        mModel->runYear();
95
    } catch(const IException &e) {
96
        QString error_msg = e.toString();
97
        Helper::msg(error_msg);
98
        qDebug() << error_msg;
99
    }
100
}
101
 
102
void ModelController::runYear()
103
{
104
    if (!canRun()) return;
164 werner 105
    if (GlobalSettings::instance()->settings().paramValue("debug_clear",0.)==1.)
106
        GlobalSettings::instance()->clearDebugLists();  // clear debug data
161 werner 107
 
128 Werner 108
    try {
109
        mModel->runYear();
162 werner 110
        fetchDynamicOutput();
128 Werner 111
    } catch(const IException &e) {
112
        QString error_msg = e.toString();
113
        Helper::msg(error_msg);
114
        qDebug() << error_msg;
115
    }
116
}
117
 
118
 
161 werner 119
//////////////////////////////////////
120
// dynamic outut
121
//////////////////////////////////////
122
//////////////////////////////////////
123
void ModelController::setupDynamicOutput(QString fieldList)
124
{
162 werner 125
    mDynFieldList = fieldList.split(QRegExp("\\s+"), QString::SkipEmptyParts);
126
    mDynFieldList.prepend("count");
127
    mDynFieldList.prepend("year"); // fixed fields.
161 werner 128
    mDynData.clear();
129
    mDynData.append(mDynFieldList.join(";"));
130
}
162 werner 131
 
161 werner 132
QString ModelController::dynamicOutput()
133
{
134
    return mDynData.join("\n");
135
}
136
 
137
const QStringList aggList = QStringList() << "mean" << "sum" << "min" << "max" << "p25" << "p50" << "p75";
138
void ModelController::fetchDynamicOutput()
139
{
140
    if (mDynFieldList.isEmpty())
141
        return;
142
    QStringList var;
143
    QString lastVar = "";
144
    QVector<double> data;
145
    AllTreeIterator at(mModel);
146
    TreeWrapper tw;
147
    int var_index;
148
    StatData stat;
149
    double value;
150
    QStringList line;
151
    foreach (QString field, mDynFieldList) {
163 werner 152
        if (field=="count" || field=="year")
153
            continue;
154
 
161 werner 155
        var = field.split(QRegExp("\\W+"), QString::SkipEmptyParts);
156
        if (var.count()!=2)
157
                throw IException(QString("Invalid variable name for dynamic output:") + field);
158
        if (var.first()!=lastVar) {
159
            // load new field
160
            data.clear();
161
            at.reset();
162
            var_index = tw.variableIndex(var.first());
163
            if (var_index<0) {
164
                throw IException(QString("Invalid variable name for dynamic output:") + var.first());
165
            }
166
            while (Tree *t = at.next()) {
167
                tw.setTree(t);
168
                data.push_back(tw.value(var_index));
169
            }
170
            stat.setData(data);
171
        }
172
        // fetch data
173
        var_index = aggList.indexOf(var[1]);
174
        switch (var_index) {
175
            case 0: value = stat.mean(); break;
176
            case 1: value = stat.sum(); break;
177
            case 2: value = stat.min(); break;
178
            case 3: value = stat.max(); break;
179
            case 4: value = stat.percentile25(); break;
180
            case 5: value = stat.median(); break;
181
            case 6: value = stat.percentile75(); break;
182
            default: throw IException(QString("Invalid aggregate expression for dynamic output: %1\nallowed:%2")
183
                                  .arg(var[1]).arg(aggList.join(" ")));
184
        }
185
        line+=QString::number(value);
186
    }
162 werner 187
    line.prepend( QString::number(data.size()) );
188
    line.prepend( QString::number(GlobalSettings::instance()->currentYear()) );
189
    mDynData.append(line.join(";"));
161 werner 190
}