Free cookie consent management tool by TermsFeed Policy Generator

source: branches/OaaS/HeuristicLab.Services.Optimization.Web/Content/experiment.controller.js @ 9305

Last change on this file since 9305 was 9305, checked in by fschoepp, 11 years ago

#1888:

  • Added an Update / GetExperiment... methods to the controller for updating and querying experiments.
  • The AlgorithmConverter class now properly converts from/to JSON format.
  • Integrated backbone js as MVC provider for JavaScript + jquery.
  • Added experiment.model.js + experiment.view.js + experiment.controller.js containing the MVC impl. for the Experiment pages.
  • Added new methods to the ExperimentController usable by the backbone js model implementation.
  • Added the experiment dialog from HL 3.3.7 (variate experiment parameters). It's capable of variating the algorithm parameters.
File size: 11.9 KB
Line 
1function GeneralController() {
2    this.variationRequestHandler = function (evt) {
3        var self = this;
4        var dialog = new VariationDialog({ model: evt.model });
5        var dialogController = {};
6        _.extend(dialogController, Backbone.Events);
7        dialogController.listenTo(dialog, 'variations-generated', function (variations) {
8            var parent = evt.model.get('parent');
9            for (var i = 0; i < variations.length; i++) {
10                var title = evt.model.get('title');
11                var offset = title.indexOf('(')
12                if (offset != -1) {
13                    title = title.substring(0, offset);
14                }
15                title += '(';
16                for (var j = 0; j < variations[i].length; j++) {
17                    title += variations[i][j].Name + " = " + variations[i][j].Value + "; ";
18                }
19                title += ')';
20                var data = { AlgorithmParameters: variations[i] };
21                if (evt.model.attributes.data.ProblemParameters) {
22                    data.ProblemParameters = evt.model.attributes.data.ProblemParameters;
23                }
24                parent.addNode({ title: title, nodeId: evt.model.get('nodeId'), data: data });
25            }
26            self.model.trigger('change');
27        });
28        dialog.render();
29    },
30    this.experimentFinishedHandler = function (experimentModel, availableExperiments, selectableGroup) {
31        var loadingDialog = new LoadingDialog({ el: $('#loadingDialog') });
32        // start the loading dialog
33        loadingDialog.setLoading(true);
34        loadingDialog.text('Saving experiment ' + experimentModel.get('title') + '...');
35        loadingDialog.render();
36        // send experiment to server
37        experimentModel.save({}, { success: function () {
38            loadingDialog.setLoading(false);
39            loadingDialog.text('Experiment successfully saved!');
40            loadingDialog.render();
41            if (availableExperiments)
42                availableExperiments.fetch({ cache: false, success: function (itm) {
43                    selectableGroup.render();
44                }
45                });
46        }
47        });
48        //loadingDialog.close();
49    }
50}
51
52function ExperimentPageController() {
53    this.refreshExperiments = function () {
54        var availableExperiments = new ExperimentList();
55        availableExperiments.fetch({ cache: false, success: function (itm) {
56            $('#experiments').empty();
57            for (var i = 0; i < availableExperiments.length; i++) {
58                new DraggableView({ model: availableExperiments.models[i], el: $('#experiments') }).render();
59            }
60        }
61        });
62    },
63    this.refreshScenarios = function () {
64        var availableScenarios = new ScenarioList();
65        availableScenarios.fetch({ cache: false, success: function (itm) {
66            var group = new DraggableGroup({ model: availableScenarios, el: $('#algorithms') });
67            group.render();
68        }
69        });
70    },
71    this.create = function () {
72        var self = this;
73        var generalController = new GeneralController();
74        // create all models + required view for the experiment page
75        var model = new ExperimentNode({
76            title: 'Experiment',
77            key: 0,
78            isExperiment: true
79        }, { parse: true });
80        generalController.model = model;
81        var experimentModel = new Experiment({ experiment: model });
82
83        var view = new ExperimentTreeView({ model: model, el: $('#container') });
84        view.render();
85
86        this.refreshScenarios();
87
88        this.refreshExperiments();
89
90        var wizard = new StepWizardView({ el: $('#stepWizard') });
91        wizard.render();
92
93        var detailsView = new ExperimentDetailsTreeView({ model: model, el: $('#container2') });
94        var validationView = new ValidationHintsView({ model: { header: "Validation failed!", text: ""} });
95        var parameterDialog = new ParameterDialog({ model: model, el: $('#parameterDialog') });
96
97        var wizardController = {};
98        _.extend(wizardController, Backbone.Events);
99
100        wizardController.listenTo(model, 'change', function () {
101            // update the details view, when the model changes
102            view.render();
103            detailsView.render();
104        });
105
106
107        wizardController.listenTo(wizard, 'experiment-finished', function () {
108            generalController.experimentFinishedHandler(experimentModel, null, null);
109            self.refreshExperiments();
110            /*// start the loading dialog
111            loadingDialog.setLoading(true);
112            loadingDialog.text('Saving experiment ' + experimentModel.get('title') + '...');
113            loadingDialog.render();
114            // send experiment to server
115            experimentModel.save({}, { success: function () {
116            loadingDialog.setLoading(false);
117            loadingDialog.text('Experiment successfully saved!');
118            loadingDialog.render();
119            self.refreshExperiments();
120            }
121            });*/
122            //loadingDialog.close();
123        });
124
125        wizardController.listenTo(view, 'structure-changed', function (node) {
126            view.render();
127            detailsView.render();
128        });
129
130        wizardController.listenTo(view, 'node-added', function (node) {
131            // get details about the node
132            node.fetch({ success: function (itm) {
133                model.trigger('change', {});
134            }
135            });
136        });
137
138        wizardController.listenTo(detailsView, 'node-clicked', function (node) {
139            // get details about the node
140            var modelNode = ExperimentNode.lookup(node.data.key);
141            if (!modelNode.get('isExperiment')) {
142                parameterDialog.model = modelNode;
143                parameterDialog.render();
144            }
145        });
146
147        wizardController.listenTo(parameterDialog, 'parameters-finished', function (node) {
148            parameterDialog.close();
149        });
150
151        wizardController.listenTo(view, 'variation-request', function (evt) {
152            generalController.variationRequestHandler(evt);
153        });
154
155        var experimentDetailsView = new ExperimentDetailsView({ el: $('#step3'), model: experimentModel });
156    }
157}
158
159
160
161/// ==================== EDIT PAGE =========================
162/// ==================== EDIT PAGE =========================
163/// ==================== EDIT PAGE =========================
164
165function ExperimentEditPageController() {
166    this.refreshScenarios = function () {
167        var availableScenarios = new ScenarioList();
168        availableScenarios.fetch({ cache: false, success: function (itm) {
169            var group = new DraggableGroup({ model: availableScenarios, el: $('#draggableAlgorithms') });
170            group.render();
171            /*$('#algorithms').empty();
172            for (var i = 0; i < availableScenarios.length; i++) {
173            new DraggableView({ model: availableScenarios.models[i], el: $('#algorithms') }).render();
174            }*/
175        }
176        });
177    },
178    this.create = function () {
179        var generalController = new GeneralController();
180
181        var self = this;
182        // create all models + required view for the experiment page
183        var controllerModel = new ControllerModel();
184        var model = new ExperimentNode({
185            title: 'Experiment',
186            key: 0,
187            isExperiment: true
188        }, { parse: true });
189
190        generalController.model = model;
191        var experimentModel = new Experiment({ experiment: model });
192        var experimentDetailsView = new ExperimentDetailsView({ el: $('#step4'), model: experimentModel });
193        experimentDetailsView.render();
194
195        var availableExperiments = new ExperimentList();
196        var selectableGroup = null;
197        var wizardController = {};
198        _.extend(wizardController, Backbone.Events);
199
200        this.refreshScenarios();
201
202        availableExperiments.fetch({ cache: false, success: function (itm) {
203            selectableGroup = new SelectableGroup({ model: availableExperiments, el: $('#experiments') });
204            selectableGroup.render();
205            var draggableExperiments = new DraggableGroup({ model: availableExperiments, el: $('#draggableExperiments') });
206            draggableExperiments.render();
207
208            wizardController.listenTo(selectableGroup, 'node-selected', function (nodeId) {
209                var node = availableExperiments.find(function (itm) { return itm.get('nodeId') == nodeId; });
210                var newNode = new ExperimentNode(node.attributes);
211                experimentModel.set({
212                    experiment: newNode,
213                    title: node.get('title'),
214                    nodeId: node.get('nodeId'),
215                    run: node.get('run'),
216                    repititions: node.get('repititions'),
217                    group: node.get('group')
218                });
219                controllerModel.set({ selectedNode: newNode });
220                detailsView.model = newNode;
221                detailsView.render();
222                view.model = newNode;
223                view.render();
224                experimentDetailsView.render();
225            }
226            );
227        }
228        });
229
230        // create wizard with 4 steps
231        var wizard = new StepWizardView({ el: $('#stepWizard') });
232        wizard.render();
233
234        var view = new ExperimentTreeView({ model: model, el: $('#container') });
235        view.render();
236        var validationView = new ValidationHintsView({ model: { header: "Validation failed!", text: ""} });
237
238        var detailsView = new ExperimentDetailsTreeView({ model: model, el: $('#container2') });
239
240        var parameterDialog = new ParameterDialog({ model: model, el: $('#parameterDialog') });
241        var loadingDialog = new LoadingDialog({ el: $('#loadingDialog') });
242
243        wizardController.listenTo(wizard, 'step-validated', function (validationModel) {
244            // update the details view
245            if (validationModel.stepNumber == 1) {
246                if (controllerModel.get('selectedNode') == null) {
247                    validationView.model["text"] = 'Please select an experiment to continue!';
248                    validationView.render();
249                    validationModel.succeeded = false;
250                }
251            }
252            detailsView.render();
253        });
254
255        wizardController.listenTo(model, 'change', function () {
256            // update the details view, when the model changes
257            view.render();
258            detailsView.render();
259        });
260
261        wizardController.listenTo(view, 'structure-changed', function (node) {
262            view.render();
263        });
264
265        wizardController.listenTo(view, 'node-added', function (node) {
266            // get details about the node
267            //if (!node.get('isExperiment'))
268            node.fetch({ success: function (itm) {
269                model.trigger('change', {});
270            }
271            });
272        });
273
274        wizardController.listenTo(wizard, 'experiment-finished', function () {
275            generalController.experimentFinishedHandler(experimentModel, availableExperiments, selectableGroup);         
276        });
277
278        wizardController.listenTo(detailsView, 'node-clicked', function (node) {
279            // get details about the node
280            var modelNode = ExperimentNode.lookup(node.data.key);
281            if (!modelNode.get('isExperiment')) {
282                parameterDialog.model = modelNode;
283                parameterDialog.render();
284            }
285        });
286
287        wizardController.listenTo(view, 'variation-request', function (evt) {
288            generalController.variationRequestHandler(evt);
289        });
290
291        wizardController.listenTo(parameterDialog, 'parameters-finished', function (node) {
292            parameterDialog.close();
293        });
294    }
295}
296
297
298 
299 
Note: See TracBrowser for help on using the repository browser.