Skip to content

Commit de7a9b7

Browse files
author
Selvam Palanimalai
committed
adding prompt for heavy random sample generation
1 parent bfb8844 commit de7a9b7

3 files changed

Lines changed: 122 additions & 29 deletions

File tree

js/appController.coffee

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ socr.controller = (model, view) ->
3131
percent = Math.ceil((_runsElapsed / _noOfSteps) * 100)
3232
view.updateStatus "update", percent
3333
else
34-
PubSub.publish "random samples generated", {'sampleCount':model.getRSampleCount()}
34+
PubSub.publish "randomSampleGenerationComplete", {'sampleCount':model.getRSampleCount()}
3535
_this.stop()
3636
return
3737

@@ -147,6 +147,7 @@ socr.controller = (model, view) ->
147147
# set the K - value in model.
148148
model.setK()
149149
$(".tooltips").tooltip()
150+
150151
$(".controller-back").on "click", (e) ->
151152
e.preventDefault()
152153
try
@@ -161,7 +162,7 @@ socr.controller = (model, view) ->
161162

162163
$("#runButton").on "click", (e) ->
163164
e.preventDefault()
164-
console.log "Run Started"
165+
console.log "Run Started"
165166
setTimeout socr.controller.run, 500
166167
return
167168

@@ -244,7 +245,7 @@ socr.controller = (model, view) ->
244245
try
245246
model.generateSample() #generate one sample
246247
$(".removable").remove() #remove the previously generated canvas during animation
247-
PubSub.publish "random samples generated"
248+
PubSub.publish "randomSampleGenerationComplete"
248249
catch e
249250
console.log e
250251
view.enableButtons()
@@ -264,18 +265,46 @@ socr.controller = (model, view) ->
264265
@description:It generates X random sample with animation effect showing the generation.
265266
###
266267
run: ->
267-
view.disableButtons() #disabling buttons
268-
view.updateStatus "started"
269-
model.setStopCount $("#countSize").val() #save the stopcount provided by user
270-
#generate samples
271-
_temp = model.getStopCount() / 1000
272-
_noOfSteps = Math.ceil(_temp)
273-
d = Date()
274-
console.log "start" + _runsElapsed + d
275-
_generate()
276-
_id = setInterval(_generate, 0)
277-
return
268+
#this should go through model event.
269+
model.set "stopCount" , $("#countSize").val() #save the stopcount provided by user
270+
271+
compute = ->
272+
PubSub.publish "randomSampleGenerationStarted"
273+
#generate samples
274+
_temp = (model.get "stopCount" )/ 1000
275+
_noOfSteps = Math.ceil(_temp)
276+
d = Date()
277+
console.log "start" + _runsElapsed + d
278+
_generate()
279+
_id = setInterval(_generate, 0)
280+
return
281+
#throw warning if datapoints cross threshold.
282+
All the computation happens in the within the browser in this app.
283+
if model.aboveThreshold()
284+
$("<div></div>").appendTo("body").html("<div><h6>Caution: Your dataset and sample count selection may consume too much memory causing the tab to become unresponsive. Do you wish to continue?</h6></div>").dialog
285+
modal: true
286+
title: "Warning!"
287+
zIndex: 10000
288+
autoOpen: true
289+
width: "auto"
290+
resizable: false
291+
buttons:
292+
Yes: ->
293+
compute()
294+
$(this).dialog "close" #close the confirmation window
295+
return
296+
297+
No: ->
298+
$(this).dialog "close"
299+
return
300+
301+
close: (event, ui) ->
302+
$(this).remove()
303+
return
278304

305+
else
306+
compute()
307+
279308

280309
###
281310
@method: stop()
@@ -284,10 +313,11 @@ socr.controller = (model, view) ->
284313
stop: ->
285314
d = Date()
286315
console.log "end" + _runsElapsed + d
287-
view.updateSlider()
316+
317+
PubSub.publish "randomSampleGenerationStopped"
318+
288319
clearInterval _id #stop the setinterval function
289320
_runsElapsed = 0 #reset the runelapsed count
290-
view.enableButtons() #enable buttons
291321
return
292322

293323

js/appModel.coffee

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@ socr.model = ->
1515
#contains the number of datasets
1616
#
1717
# Why there are keys and values? Its because in some form of data input (like coin toss), the "key" contains the symbolic meaningful reference whereas the "value" contains the mathematical equivalent value.
18-
#
18+
19+
_kvStore = {}
20+
21+
_stopCount = 1000
22+
_count = 0
23+
_n = []
24+
_K = null
25+
_this = this
26+
27+
MEM_THRESHOLD = 40000000
28+
1929

2030
#::::::: PRIVATE METHODS :::::::::::::::
2131
###
@@ -254,11 +264,7 @@ socr.model = ->
254264
catch e
255265
console.log e.stack
256266
socr.tools.zCal.computeP x.zValue, mu, sigma
257-
_stopCount = 1000
258-
_count = 0
259-
_n = []
260-
_K = null
261-
_this = this
267+
262268
n: _n
263269

264270
###
@@ -754,6 +760,7 @@ socr.model = ->
754760
###
755761
getter and setter for variable '_stopCount'
756762
###
763+
###
757764
setStopCount: (y) ->
758765
759766
#alert(y);
@@ -762,7 +769,7 @@ socr.model = ->
762769
763770
getStopCount: ->
764771
_stopCount
765-
772+
###
766773

767774
###
768775
getter and setter for variable '_n'
@@ -820,12 +827,27 @@ socr.model = ->
820827
getter and setter for variable '_count'
821828
###
822829
setRSampleCount: (v) ->
830+
socr.model.set "randomSampleCount", _count
823831
_count = v
824832
true
825833

826-
getRSampleCount: ->
834+
getRSampleCount: ->
827835
_count
828836

837+
get : (key) ->
838+
if (_kvStore[key] isnt undefined)
839+
_kvStore[key]
840+
else
841+
throw new Error key+" doesnt exist in key-value store."
842+
843+
set : (key,value, dontForce)->
844+
if dontForce is true and _kvStore[key] isnt undefined
845+
throw new Error "value for key : "+ key + " is already set"
846+
else
847+
_kvStore[key] = value
848+
true
849+
850+
829851
reset: (type) ->
830852
type = if(typeof type isnt "undefined") then type else "all"
831853
switch type
@@ -853,7 +875,7 @@ socr.model = ->
853875
#setting K and n to 0.
854876
socr.model.setK()
855877
socr.model.setN()
856-
PubSub.publish "application reset"
878+
PubSub.publish "appReset"
857879
return
858880

859881

@@ -878,4 +900,24 @@ socr.model = ->
878900
###
879901
getK: ->
880902
_K
903+
904+
###
905+
@method :aboveThreshold
906+
@return : {boolean}
907+
###
908+
aboveThreshold: ->
909+
_k = 0
910+
_sum = 0
911+
912+
_sampleSize = _count #socr.model.get "randomSampleCount"
913+
_stopCount = socr.model.get "stopCount"
914+
915+
while _k < socr.model.getK()
916+
_dataset = socr.model.getDataset(_k)
917+
_sum += _dataset.length* ( _sampleSize + _stopCount )
918+
_k++
919+
920+
console.log "aboveThreshold : "+_sum
921+
return (_sum > MEM_THRESHOLD)
922+
881923
#return

js/appView.coffee

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,25 @@ socr.view = (model) ->
220220
###
221221
initialize: ->
222222

223-
PubSub.subscribe "application reset",->
223+
PubSub.subscribe "appReset",->
224224
socr.view.reset()
225225

226-
PubSub.subscribe "random samples generated", (msg,data)->
226+
PubSub.subscribe "randomSampleGenerationStopped", (msg,data) ->
227+
socr.view.enableButtons() #enable buttons
228+
socr.view.updateSlider()
229+
230+
PubSub.subscribe "randomSampleGenerationInterrupted", (msg,data) ->
231+
socr.view.enableButtons() #enable buttons
232+
socr.view.updateSlider()
233+
socr.view.updateStatus "interrupted"
234+
socr.view.updateCtrlMessage "Generation interrupted.", "error", 1000
235+
236+
PubSub.subscribe "randomSampleGenerationStarted", (msg,data) ->
237+
socr.view.disableButtons() #disabling buttons
238+
socr.view.updateStatus "started"
239+
240+
241+
PubSub.subscribe "randomSampleGenerationComplete", (msg,data)->
227242
#updating controller view slider
228243
socr.view.updateCtrlMessage "samples generated sucessfully.", "success", 2000
229244
socr.view.updateStatus "finished"
@@ -868,11 +883,13 @@ socr.view = (model) ->
868883
console.log "updateStatus"
869884
return false if action is `undefined`
870885
switch action
886+
871887
when "started"
872888
console.log "started"
873889
html = "<div class=\"progress progress-info progress-striped active\"><div class=\"bar\" style=\"width:0%\"></div></div>"
874890
el = $("#progressBar")
875891
el.html("").removeClass().addClass("span8").css("display", "").html html
892+
876893
when "update"
877894
return false if percent is `undefined`
878895
el = $("div#progressBar > div > div")
@@ -882,9 +899,13 @@ socr.view = (model) ->
882899
console.log "change"
883900
el.css "width", percent + "%"
884901
el.style
902+
885903
when "finished"
886-
console.log "finished"
887-
el = $("#progressBar").html("").css("display", "none")
904+
$("#progressBar").html("").css("display", "none")
905+
906+
when "interrupted"
907+
$("#progressBar").html("").css("display", "none")
908+
888909
return
889910

890911
#

0 commit comments

Comments
 (0)