Commit 97cab5ea authored by Yannick Chudy's avatar Yannick Chudy

triggers on explore components

parent 5aa126a6
...@@ -29,7 +29,7 @@ jade: ...@@ -29,7 +29,7 @@ jade:
rundev: rundev:
. venv3/bin/activate; export APP_DEBUG=false; export FLASK_APP=botapadapp.py ;export FLASK_DEBUG=1; flask run . venv3/bin/activate; export APP_DEBUG=false; export FLASK_APP=botapadapp.py ;export FLASK_DEBUG=1; flask run --port 5002
docker-build: docker-build:
......
...@@ -143,66 +143,21 @@ def _weights(weightings): ...@@ -143,66 +143,21 @@ def _weights(weightings):
return _w return _w
def explore_engine(graphdb):
""" Prox engine """
# setup
engine = Engine("graph")
engine.graph.setup(in_name="request", out_name="graph")
## Search
@Composable
def get_graph(query, **kwargs):
return db_graph(graphdb, query)
@Composable
def subgraph(query, cut=100, weighted=True, length=7, mode=ALL, add_loops=False, **kwargs ):
graph = db_graph(graphdb, query)
uuids = { v['uuid'] : v.index for v in graph.vs }
pz = [ q for q in query.get('units', []) ]
pz = [ uuids[p] for p in pz ]
extract = ProxExtract()
vs = []
if len(pz):
for u in pz:
s = extract(graph, pzeros=[u], weighted=weighted,mode=mode, cut=cut, length=length)
vs = vs + list(s.keys())
else :
s = extract(graph, pzeros=[], weighted=weighted,mode=mode, cut=cut, length=length)
vs = list(s.keys())
return _prune(graph.subgraph(vs))
from cello.graphs.transform import VtxAttr def prox_subgraph(graph, uuids, cut=100, weighted=True, length=7, mode=ALL, add_loops=False, **kwargs ):
searchs = [] extract = ProxExtract()
for k,w,l,m,n in [ vs = []
(u"Search", True, 6, ALL ,100 ), ]: if len(uuids):
search = Optionable("GraphSearch") for u in uuids:
search._func = subgraph s = extract(graph, pzeros=[u], weighted=weighted,mode=mode, cut=cut, length=length)
search.add_option("weighted", Boolean(default=w)) vs = vs + list(s.keys())
search.add_option("add_loops", Boolean(default=True, help="add loops on vertices")) else :
search.add_option("mode", Numeric(choices=[ OUT, IN, ALL], default=m, help="edge directions")) s = extract(graph, pzeros=[], weighted=weighted,mode=mode, cut=cut, length=length)
search.add_option("length", Numeric( vtype=int, min=1, default=l)) vs = list(s.keys())
search.add_option("cut", Numeric( vtype=int, min=2, default=n))
return _prune(graph.subgraph(vs))
search |= VtxAttr(color=[(45, 200, 34), ])
search |= VtxAttr(type=1)
search.name = k
searchs.append(search)
sglobal = get_graph | ProxSubgraph()
sglobal.name = "Global"
sglobal.change_option_default("cut", 200);
searchs.append(sglobal)
engine.graph.set( *searchs )
return engine
def expand_subgraph(graph, expand, nodes,length=4, cut=100, weightings=None): def expand_subgraph(graph, expand, nodes,length=4, cut=100, weightings=None):
pz = {} pz = {}
...@@ -280,12 +235,99 @@ def starred(graph, limit=200, prune=True): ...@@ -280,12 +235,99 @@ def starred(graph, limit=200, prune=True):
return graph return graph
def starred_engine(graphdb):
""" Prox engine """
# setup
engine = Engine("graph")
engine.graph.setup(in_name="request", out_name="graph")
## Search
def subgraph(query, limit=200, prune=False):
"""
:param mode:
"""
graph = db_graph(graphdb, query)
return starred(graph, limit=100, prune=True)
graph_search = Optionable("GraphSearch")
graph_search._func = Composable(subgraph)
graph_search.add_option("limit", Numeric( vtype=int, default=200))
graph_search.add_option("prune", Boolean(default=True))
from cello.graphs.transform import VtxAttr
graph_search |= VtxAttr(color=[(45, 200, 34), ])
graph_search |= VtxAttr(type=1)
engine.graph.set(graph_search)
return engine
def explore_engine(graphdb):
""" Prox engine """
# setup
engine = Engine("graph")
engine.graph.setup(in_name="request", out_name="graph")
## Search
@Composable
def get_graph(query, **kwargs):
return db_graph(graphdb, query)
@Composable
def subgraph(query, cut=100, weighted=True, length=7, mode=ALL, add_loops=False, **kwargs ):
graph = db_graph(graphdb, query)
idx = { v['uuid'] : v.index for v in graph.vs }
uuids = [ q for q in query.get('units', []) ]
uuids = [ idx[p] for p in uuids ]
return prox_subgraph(graph, uuids, cut=cut, weighted=weighted, length=length, mode=mode, add_loops=add_loops, **kwargs )
from cello.graphs.transform import VtxAttr
searchs = []
for k,w,l,m,n in [
(u"Search", True, 6, ALL ,100 ), ]:
search = Optionable("GraphSearch")
search._func = subgraph
search.add_option("weighted", Boolean(default=w))
search.add_option("add_loops", Boolean(default=True, help="add loops on vertices"))
search.add_option("mode", Numeric(choices=[ OUT, IN, ALL], default=m, help="edge directions"))
search.add_option("length", Numeric( vtype=int, min=1, default=l))
search.add_option("cut", Numeric( vtype=int, min=2, default=n))
search |= VtxAttr(color=[(45, 200, 34), ])
search |= VtxAttr(type=1)
search.name = k
searchs.append(search)
sglobal = get_graph | ProxSubgraph()
sglobal.name = "Global"
sglobal.change_option_default("cut", 200);
searchs.append(sglobal)
engine.graph.set( *searchs )
return engine
def explore_api(engines, graphdb): def explore_api(engines, graphdb):
#explor_api = explor.explore_api("xplor", graphdb, engines) #explor_api = explor.explore_api("xplor", graphdb, engines)
api = ReliureAPI("xplor",expose_route=False) api = ReliureAPI("xplor",expose_route=False)
# starred
view = EngineView(starred_engine(graphdb))
view.set_input_type(ComplexQuery())
view.add_output("request", ComplexQuery())
view.add_output("graph", export_graph, id_attribute='uuid')
api.register_view(view, url_prefix="starred")
# prox search returns graph only # prox search returns graph only
view = EngineView(explore_engine(graphdb)) view = EngineView(explore_engine(graphdb))
view.set_input_type(ComplexQuery()) view.set_input_type(ComplexQuery())
...@@ -309,6 +351,15 @@ def explore_api(engines, graphdb): ...@@ -309,6 +351,15 @@ def explore_api(engines, graphdb):
api.register_view(view, url_prefix="additive_nodes") api.register_view(view, url_prefix="additive_nodes")
@api.route("/starred/<string:gid>.json", methods=['GET'])
def g_json_dump(gid):
graph = graphdb.get_graph(gid)
g = starred(graph, limit=100, prune=True)
g = export_graph( g, id_attribute='uuid')
return jsonify(g)
@api.route("/<string:gid>.json", methods=['GET']) @api.route("/<string:gid>.json", methods=['GET'])
def _json_dump(gid): def _json_dump(gid):
dumps = lambda g : json.dumps( export_graph(g, id_attribute='uuid') ) dumps = lambda g : json.dumps( export_graph(g, id_attribute='uuid') )
......
...@@ -39,7 +39,7 @@ RUN_GUNICORN = os.environ.get('RUN_GUNICORN', None) == "1" ...@@ -39,7 +39,7 @@ RUN_GUNICORN = os.environ.get('RUN_GUNICORN', None) == "1"
PATH = "./static/images" # images storage PATH = "./static/images" # images storage
STATIC_HOST = os.environ.get('STATIC_HOST', "") STATIC_HOST = os.environ.get('STATIC_HOST', "")
ENGINES_HOST = os.environ.get('ENGINES_HOST', "http://localhost:5000") ENGINES_HOST = os.environ.get('ENGINES_HOST', "http://localhost:5002")
PADAGRAPH_HOST = os.environ.get('PADAGRAPH_HOST', ENGINES_HOST) PADAGRAPH_HOST = os.environ.get('PADAGRAPH_HOST', ENGINES_HOST)
DELETE = os.environ.get('BOTAPAD_DELETE', "nope").lower() == "true" DELETE = os.environ.get('BOTAPAD_DELETE', "nope").lower() == "true"
...@@ -455,7 +455,8 @@ def botimport(repo, padurl, gid, content_type): ...@@ -455,7 +455,8 @@ def botimport(repo, padurl, gid, content_type):
'auto_rotate': int(args.get("auto_rotate", 0 )), 'auto_rotate': int(args.get("auto_rotate", 0 )),
'adaptive_zoom': int(args.get("adaptive_zoom", 1 )), 'adaptive_zoom': int(args.get("adaptive_zoom", 1 )),
'layout' : args.get("layout") if args.get("layout", "2D" ) in ("2D","3D") else "2D",
} }
...@@ -643,17 +644,8 @@ from pdglib.graphdb_ig import engines ...@@ -643,17 +644,8 @@ from pdglib.graphdb_ig import engines
from botapadapi import explore_api, starred from botapadapi import explore_api, starred
from pdgapi.explor import layout_api, clustering_api from pdgapi.explor import layout_api, clustering_api
api = explore_api(engines, graphdb)
@api.route("/starred/<string:gid>.json", methods=['GET'])
def g_json_dump(gid):
graph = graphdb.get_graph(gid)
g = starred(graph, limit=100, prune=True)
g = export_graph( g, id_attribute='uuid')
return jsonify(g)
api = explore_api(engines, graphdb)
api = layout_api(engines, api) api = layout_api(engines, api)
api = clustering_api(engines, api) api = clustering_api(engines, api)
......
...@@ -147,21 +147,21 @@ ...@@ -147,21 +147,21 @@
// panel tabs // panel tabs
setupUI(){ setupUI(){
var app = this.app;
// reset query button // reset query button
$('#btnreset').click( () => { $('#btnreset').click( () => {
this.app.models.clustering.reset({}) app.models.clustering.reset({})
this.app.models.userquery.reset(); app.models.userquery.reset();
this.app.models.graph.es.set_selected([]); app.models.graph.es.set_selected([]);
this.app.models.graph.vs.set_selected([]); app.models.graph.vs.set_selected([]);
this.app.models.graph.reset({vs:[], es:[]}); app.models.graph.reset({vs:[], es:[]});
}); });
$('#btn_plusdix').click(()=> { $('#btn_plusdix').click(()=> {
Backbone.trigger('engine:expand_prox', { expand: [], weights:[] }) Backbone.trigger('engine:expand_prox', { expand: [], weights:[] })
}); });
$('#btn_global').click(()=> { $('#btn_global').click(()=> {
this.app.trigger('engine:explore', 'Global') app.trigger('engine:explore', 'Global')
}); });
$('#btn_rotate').click(()=> { $('#btn_rotate').click(()=> {
var gviz = this.app.gviz var gviz = this.app.gviz
...@@ -176,13 +176,18 @@ ...@@ -176,13 +176,18 @@
$('#btn_2d3d').click(()=> { $('#btn_2d3d').click(()=> {
var t = $('#btn_2d3d span.active').text(); var t = $('#btn_2d3d span.active').text();
t = t == "2D" ? "3D" : "2D"; t = t == "2D" ? "3D" : "2D";
this.app.trigger('engine:layout', t + '_Force_directed') app.trigger('engine:layout', t + '_Force_directed')
$('#btn_2d3d span').toggleClass('active') $('#btn_2d3d span').toggleClass('active')
$('#btn_2d3d span').toggleClass('small') $('#btn_2d3d span').toggleClass('small')
}); });
}, if (this.options.layout == "3D")$('#btn_2d3d').click(); // force 3d with option 'layout':'3D'
attached() {
console.log('botapad-app attached') var _window_resized = function(){
if (app.gviz) app.gviz.resize_rendering();
}
$(window).on('resize', _window_resized );
_window_resized();
}, },
startapp(routes, data, sync, options) { startapp(routes, data, sync, options) {
...@@ -339,13 +344,7 @@ ...@@ -339,13 +344,7 @@
document.addEventListener("gviz_attached", function(){ document.addEventListener("gviz_attached", function(){
console.log("gviz_is now attached ") console.log("gviz_is now attached ")
}); });
var _window_resized = function(){
if (app.gviz) app.gviz.resize_rendering();
}
$(window).on('resize', _window_resized );
_window_resized();
} }
}); });
} // routes: } // routes:
......
/*! 07-02-2019 */ /*! 09-02-2019 */
!function(a,b){"function"==typeof define&&define.amd?define(["underscore","backbone"],function(c,d){return b(a,c,d)}):a.Cello=b(a,_,Backbone)}(this,function(a,b,c){function d(a,b){return Math.floor(Math.random()*(b-a+1))+a}var e={desc:"",version:.2,license:"!! TODO !!",DEBUG:!1};e.log=function(){console.log("INFO",arguments)},e.debug=function(){e.DEBUG&&console.log("DEBUG",arguments)},e.assert=function(a,c){if(!a){var d="Assertion failed";throw b.isArray(c)&&(d=c.join("\n")),c&&(d=c),new Error(d)}},e.get=function(a,c,d){default_getter=function(){return e.assert(b(a).has("attributes")),e.assert(b(a.attributes).has(c)),a.attributes[c]},a.__defineGetter__(c,d||default_getter)},e.set=function(a,c,d){var f=function(d){e.assert(b(a).has("attributes"));var f=d;b(a).has("attributes")&&(b(a.attributes).has(c)&&(f=a.attributes[c]),a.attributes[c]=d,f!=d&&(a.trigger("change",a),a.trigger("change:"+c,a,d)))};a.__defineSetter__(c,d||f)},e.getset=function(a,b,c,d){e.get(a,b,c),e.set(a,b,d)},e.FlagableCollection=function(a){a.model.active_flags||[];b.each(a.model.active_flags,function(b){e.FlagMethod(a,b)}),a.by_flag=function(b){return a.filter(function(a){return a.has_flag(b)})},a._check_models_param=function(a){return a=b.isUndefined(a)?this.models:a,a=b.isNull(a)?[]:a,a=b.isArray(a)?a:[a]},a.set_flag=function(c,d){d=a._check_models_param(d);var e=a.by_flag(c),f=b.sortBy(d,f);b.isEqual(e,d)===!1&&a.add_flag(c,d,!0)},a.add_flag=function(c,d,e,f){var e=void 0!==e&&e,g=a.by_flag(c);if(d=a._check_models_param(d),(0!=g.length||0!=d.length)&&b.isObject(d)){var h=b.union(d,e?[]:g),i=b.difference(g,h);b.difference(h,g);a.remove_flag(c,i,f),b.each(d,function(a){a.add_flag(c,f)})}},a.remove_flag=function(c,d,e){d=a._check_models_param(d),b.each(d,function(a){a.remove_flag(c,e)})}},e.Flagable=function(a){a.get("flags")||a.set("flags",[]),e.get(a,"flags"),a.add_flag=function(a,c){this.has_flag(a)||(this.set("flags",b.union(this.flags,[a]),{silent:!0}),c&&c.silent||(this.trigger("addflag",a,this),this.trigger("addflag:"+a,this)))},a.remove_flag=function(a,c){this.has_flag(a)&&(this.set("flags",b.without(this.flags,a),{silent:!0}),c&&c.silent||(this.trigger("rmflag",a,this),this.trigger("rmflag:"+a,this)))},a.has_flag=function(a){return this.flags||console.log(this),this.flags.indexOf(a)>=0}},e.FlagMethod=function(a,b){var c="add_"+b,d="set_"+b;e.assert(void 0===a[c]),e.assert(void 0===a[d]),a[d]=function(c){a.set_flag(b,c,!0)},a[c]=function(c,d){a.add_flag(b,c,d)}},e.SortableCollection=function(a,d,f,g){e.assert(b.isString(f)),e.assert(b.isObject(d)),a.sortables=new c.Collection([],{model:e.Sortable}),e.FlagableCollection(a.sortables),b(d).each(function(b){a.sortables.add(new e.Sortable(b))}),a.listenTo(a.sortables,"change:selected change:reversed",function(b){a.comparator=b.get_comparator(),a.sort()}),console.log(a.sortables);var h=a.sortables.findWhere({field:f});return e.assert(h,"invalid default_key ("+f+")"),h.select(),a.sort_reverse&&h.reverse(),a.comparator=h.get_comparator(),a},e.Sortable=c.Model.extend({defaults:{field:"",type:"",label:null},comparators:{alpha:function(a){var b=function(b,c){return b.get(a).localeCompare(c.get(a))};return b},numeric:function(a){var b=function(b,c){return b.get(a)-c.get(a)==0?0:b.get(a)-c.get(a)>0?1:-1};return b}},initialize:function(a,c){e.Flagable(this),e.get(this,"field"),e.get(this,"type"),e.get(this,"selected",function(){return this.has_flag("selected")}),e.get(this,"reversed",function(){return this.has_flag("reversed")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){this.collection.trigger("change:selected",this),this.collection.trigger("change")}),this.listenTo(this,"addflag:reversed rmflag:reversed",function(){this.collection.trigger("change:reversed",this),this.collection.trigger("change")}),b.has(a,"label")&&a.label||this.set("label",a.field);this.get_comparator();return this},get_comparator:function(){var a=this.type,c=null;if(b.isFunction(a))c=a(this.field);else{if(!b.has(this.comparators,a))throw Error("comparator not found ! (type: '"+a+"')");c=this.comparators[a](this.field)}if(this.reversed){var d=c;c=function(a,b){return d(b,a)}}return c},select:function(){this.selected||(b(this.collection.by_flag("selected")).each(function(a){a.remove_flag("selected"),a.reversed&&a.remove_flag("reversed")}),this.add_flag("selected"))},reverse:function(){this.reversed||this.add_flag("reversed")},toggle_reverse:function(){this.reversed?this.remove_flag("reversed"):this.add_flag("reversed")}},{active_flags:["selected","reversed"]}),e.DocList=c.Collection.extend({model:e.Doc,initialize:function(a,c){b(this).bindAll("_set_sort_key","_set_sort_reverse","_set_sortables","_get_sort_key","_get_sort_reverse","_get_sortables"),c=c||{},e.get(this,"selected",function(){return this.has_flag("selected")});var d=c.sort_key||"title",f=c.sort_reverse||!1,g=c.sortables||[];this.model&&(e.FlagableCollection(this),e.SortableCollection(this,g,d,f))},_set_sort_key:function(a){var b=this.sort_key;this._sort_key=a,b!=this.sort_key&&(this.trigger("change"),this.trigger("change:sort_key"))},_get_sort_key:function(){return this._sort_key},_set_sort_reverse:function(a){var b=this.sort_reverse;this._sort_reverse=a,b!=this.sort_reverse&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sort_reverse:function(){return this._sort_reverse},_set_sortables:function(a){var b=this.sortables;this._sortables=a,b!=this.sortables&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sortables:function(){return this._sortables},select:function(a){a.select(),this.trigger("change:selected")},clear_selection:function(){this.set_selected(null),options&&options.silent||this.trigger("change:selected"),this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")}}),e.Doc=c.Model.extend({defaults:{docnum:null,selected:!1,clusters:null},idAttribute:"docnum",initialize:function(a,b){e.get(this,"docnum"),e.get(this,"selected",function(){return this.has_flag("selected")}),e.getset(this,"clusters"),this.clusters={},e.Flagable(this),e.assert(null!==this.docnum,"Document should have a docnum")},select:function(){this.add_flag("selected")},toggle_select:function(){this.selected?this.remove_flag("selected"):this.add_flag("selected")}},{active_flags:["selected"]}),e.QueryModel=c.Model.extend({defaults:{cellist:null,query:"",loaded:!1},loaded_query:null,initialize:function(a,c){b.bindAll(this,"set_query","play_completed","query_updated"),e.get(this,"cellist"),e.get(this,"loaded"),e.get(this,"query"),e.set(this,"query",this.set_query),this.listenTo(this.cellist,"play:complete",this.play_completed),this.on("change:query",this.query_updated)},set_query:function(a){a=a.trim(),console.log("set_query",a),this.set("query",a)},query_updated:function(){this.query!==this.loaded_query?this.set("loaded",!1):this.set("loaded",!0)},play_completed:function(a){a.results.query!=this.query&&(this.query=a.results.query),this.loaded_query=this.query,this.set("loaded",!0)},validate:function(){return!0},play:function(){this.cellist.play()},export_for_engine:function(){return this.query}}),e.Option=c.Model.extend({defaults:{value:void 0,name:null,otype:{}},idAttribute:"name",initialize:function(a,c){var d=this;b.bindAll(this,"validate"),e.get(this,"name"),e.get(this,"otype"),e.get(this,"value"),e.set(this,"value",function(a){var b=d.validate(a);d.value!=b&&d.set("value",b)}),e.assert(null!==this.name,"Option should have a name"),e.assert(null!==a.otype,"(Option: "+this.name+") otype should not be 'null'")},is_default:function(){return b.isEqual(this.value,this.otype.default)},cast:function(a){var b=function(a){return a};return"float"===this.otype.vtype&&(b=parseFloat),"int"===this.otype.vtype&&(b=parseInt),"Boolean"===this.otype.type&&(b=function(a){return[1,!0,"true","True","TRUE","1","yes"].indexOf(a)>=0}),b(a)},parse:function(a){var c=this;return this.otype&&("float"!==this.otype.vtype&&"int"!==this.otype.vtype||(this.otype.multi?(a=a.replace(/\s/g,"").split(",").filter(function(a){return a.length}).map(function(a){return c.cast(a)}),b.isNaN(a)&&(a="")):(a=c.cast(a),b.isNaN(a)&&(a="")))),a},_validate_one:function(a){var c=this.otype.choices;if(c&&b.indexOf(c,a)<0)throw new Error("invalid option value");return a},is_multi:function(){return this.otype.multi},validate:function(a){var c=this;if(this.is_multi()){var d=[];b.each(a,function(a){d.push(c._validate_one(a))}),a=d}else a=this._validate_one(a);return a}}),e.Options=c.Collection.extend({model:e.Option}),e.Component=c.Model.extend({idAttribute:"name",defaults:{name:null,selected:!1,doc:"",options:new e.Options},initialize:function(){e.get(this,"name"),e.get(this,"options"),e.get(this,"selected"),this.listenTo(this.options,"reset",this.optionsChanged),this.listenTo(this.options,"change",this.optionsChanged),e.assert(null!==this.name,"Component should have a name")},get_option:function(a){return this.options.where({name:a})[0]},set_option:function(a,b){var c=this.get_option(a);c.value=b},parse:function(a,b){return a.options=new e.Options(a.options,{parse:!0}),a.default&&(a.selected=!0),a},optionsChanged:function(a){this.trigger("change",this,a),this.trigger("change:options",this,a)},changed_options:function(){var a=[];return b.each(this.options.models,function(b){b.is_default()||a.push(b)}),a},as_dict:function(a){void 0!==a&&null!=a||(a=!1);var c={name:this.name},d=a?this.changed_options():this.options.models;return d.length>0&&(c.options={},b.each(d,function(a){c.options[a.name]=a.value})),c},set_state:function(a){var c=this;b.each(a,function(a,b){c.set_option(b,a)})}}),e.Components=c.Collection.extend({model:e.Component}),e.Block=c.Model.extend({defaults:{name:"",components:new e.Components,required:!0,multiple:!1,args:null,returns:null},initialize:function(a){e.get(this,"components"),e.get(this,"selected",this._get_selected),e.get(this,"name"),e.get(this,"required"),e.get(this,"multiple"),e.get(this,"args"),e.get(this,"returns"),e.assert(null!==this.name,"Block should have a name"),e.assert(b.isNull(this.args)||b.isArray(this.args),"'args' should be null or an Array"),null===this.returns&&this.set("returns",this.name),this.listenTo(this.components,"reset",this.componentsChanged),this.listenTo(this.components,"change",this.componentsChanged),this.selection_default=b.map(this.selected,function(a){return a.name})},componentsChanged:function(a){this.trigger("change",this,a),this.trigger("change:components",this,a)},parse:function(a,b){return a.components=new e.Components(a.components,{parse:!0}),a},reset:function(){this.components.reset()},get_component:function(a){return b.find(this.components.models,function(b){return b.name==a})},_get_selected:function(){return this.components.where({selected:!0})},select:function(a){a.selected?this.required||(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected")):(this.multiple||b.each(this.selected,function(a){a.set("selected",!1)}),a.set("selected",!0),this.trigger("change"),this.trigger("change:selected"))},unselect:function(a){a.selected&&(!this.required||this.multiple&&this.selected.length>1)&&(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected"))},clear_selection:function(){var a=this;b.each(this.selected,function(b){a.unselect(b)})},validate:function(){},get_state:function(a){void 0!==a&&null!=a||(a=!1);var c=[],d=this.selected,e=b.isEqual(b.map(d,function(a){return a.name}),this.selection_default);for(var f in d){var g=d[f],h=g.as_dict(a);a&&e&&!b.has(h,"options")||c.push(g.as_dict(a))}return c},set_state:function(a){var c=this;b.each(a,function(a){var b=a.name,d=a.options,e=c.get_component(b);e.set_state(d),c.select(e)})}}),e.Blocks=c.Collection.extend({model:e.Block}),e.Engine=c.Model.extend({defaults:{blocks:new e.Blocks,args:null,returns:null,needed_inputs:[]},initialize:function(a,b){var c=a.url;this.input_models={},this.url=c,this.play_url=c,e.get(this,"blocks"),e.get(this,"args"),e.get(this,"returns"),e.get(this,"needed_inputs"),this.listenTo(this.blocks,"change reset",this.blockChanged)},get_block:function(a){return b.find(this.blocks.models,function(b){return b.get("name")==a})},blockChanged:function(a){this._update_needed_inputs(),this.trigger("change",this,a),this.trigger("change:blocks",this,a)},_update_needed_inputs:function(){var a=[],b=[],c=this.blocks.models;for(var d in c){var e=c[d];if(e.selected.length>0){for(var f in e.args){var g=e.args[f];b.indexOf(g)<0&&a.indexOf(g)&&a.push(g)}b.push(e.returns)}}this.set({needed_inputs:a},{silent:!0})},parse:function(a,b){return console.log("Engine parse",a,b),this.data=a,a.blocks=new e.Blocks(a.blocks,{parse:!0}),a},reset:function(a){a=this.parse(a),this.set(a)},get_state:function(a){void 0!==a&&null!=a||(a=!1);var b={},c=this.blocks.models;for(var d in c){var e=c[d],f=e.get_state(a);f.length>0&&(b[e.name]=f)}return b},set_state:function(a){var c=this;b.each(a,function(a,b){var d=c.get_block(b);d.set_state(a)})},get_state_str:function(a){var b=this.get_state(a),c=$.param(b);return c},set_state_str:function(a){var b=e.utils.deparam(a);this.set_state(b)},register_input:function(a,b){this.input_models[a]=b},play:function(a){var d=this,f=this.get_state(),g={};b.each(this.input_models,function(a,b,c){g[b]=a.export_for_engine()});var g=b.extend(g,a),h=b.extend({},g,{options:f});e.log("play",h),d.trigger("play:loading",g,f);var h=JSON.stringify(h);c.ajax({url:d.play_url,method:"post",contentType:"application/json",data:h,success:function(b,c,e){b.meta&&b.meta.errors&&b.meta.errors.length>0?d.trigger("play:error",b,e):(console.log("play:success",b,a,f),d.trigger("play:success",b,a,f),d.trigger("play:complete",b,a,f))},error:function(a,b,c){d.trigger("play:error",{},a),d.trigger("play:complete",{},a)}})}});var f=c.Model.extend({IN:1,OUT:2,ALL:4,defaults:{gid:null,directed:!1,bipartite:!1},idAttribute:"gid",initialize:function(a,b){var d=this;if(this.edge_list={},this.nodetype_model=a.nodetype_model||h,this.nodetypes=new p([],{model:this.nodetype_model}),this.edgetype_model=a.edgetype_model||j,this.edgetypes=new p([],{model:this.edgetype_model}),this.properties||(this.properties=new c.Model),this.meta||(this.meta=new c.Model),e.get(this,"label",function(){return this.properties.get("name")}),this.urlRoot=a.urlRoot,this.urlRoot){var f=function(a){d.nodetypes.url=d.url()+"/nodetypes",d.nodetypes.reset(),d.nodetypes.fetch({remove:!1}),d.edgetypes.url=d.url()+"/edgetypes",d.edgetypes.reset(),d.edgetypes.fetch({remove:!1})};this.on("change:gid",f),this.nodetypes.on("add",function(a){a.urlRoot=d.url()+"/nodetype"}),this.edgetypes.on("add",function(a){a.urlRoot=d.url()+"/edgetype"})}this.vertex_model=a.vertex_model||l,this.vs=new e.Vertices([],{graph:this,model:this.vertex_model}),this.vs.reset([],{collection:this.vs});var g=function(a){a&&(a.collection=d.vs,void 0===a.id&&(a.id=d.vs.size()),a.id in d.edge_list||(d.edge_list[a.id]=[]))},i=function(a){var b=d.es.filter(function(b){return b.get("source")==a.id||b.get("target")==a.id});d.es.remove(b),delete d.edge_list[a.id]};this.vs.on("add",g),this.vs.on("remove",i),this.edge_model=a.edge_model||m,this.es=new e.Edges([],{graph:this,model:this.edge_model}),this.es.reset([],{collection:this.es});var k=function(a){a.collection=d.es,d.edge_list[a.get("source")].push(a),d.edge_list[a.get("target")].push(a)},n=function(a){d.edge_list[a.get("source")].splice(d.edge_list[a.get("source")].indexOf(a),1),d.edge_list[a.get("target")].splice(d.edge_list[a.get("target")].indexOf(a),1)};this.es.on("add",k),this.es.on("remove",n),e.FlagableCollection(this.vs),e.FlagableCollection(this.es),a.data&&this.reset(a.data)},url:function(){return this.urlRoot+this.id},parse:function(a,b){this.reset(a[this.id],b)},reset:function(a,c){e.debug("parse graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{merge:!0,remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{merge:!0,remove:!1,parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),c=c?b.clone(c):{},a.vs&&a.es&&(this.edge_list={},this.es.reset([],c),this.vs.reset([],c),c={parse:!0},this.vs.set(a.vs,c),this.es.set(a.es,c)),this.trigger("reset")},merge:function(a,b){e.debug("merge graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{remove:!1,parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),this.vs.add(a.vs,{parse:!0}),this.es.add(a.es,{parse:!0}),this.trigger("merge")},get_edge_type:function(a){var b=this.edgetypes.get(a);if(b)return b},get_node_type:function(a){var b=this.nodetypes.get(a);if(b)return b},summary:function(){return{attrs:this.attributes,vcount:this.vcount(),ecount:this.ecount(),density:this.density(),v_attrs:this.attributes.v_attrs,e_attrs:this.attributes.e_attrs}},str:function(){var a=b.template("v:<%=vcount%>, e:<%=ecount%>,density:<%=density%>,\nv attrs:<%=v_attrs%>, \ne attrs:<%=e_attrs%>, ");return a(this.summary())},add_vertex:function(a){this.vs.add(a)},vcount:function(){return this.vs.length},add_edge:function(a){this.es.add(a)},is_loop:function(a){var c=function(a){return a.source===a.target};return b.map(a,c)},ecount:function(){return this.es.length},incident:function(a,c,d){var e=this,f=[],g=a.id,h=void 0===c?this.ALL:c,i=void 0===d||d;return h==e.ALL?f=b.filter(e.edge_list[g],function(a){return!!i||!a.is_loop()}):h==e.IN?f=b.filter(e.edge_list[g],function(a){return!(a.source.id!=g||!i&&a.is_loop())}):h==e.OUT&&(f=b.filter(e.edge_list[g],function(a){return!(a.target.id!=g||!i&&a.is_loop())})),f},degree:function(a,b,c){return this.incident(a,b,c).length},neighbors:function(a,c,d){var e=this.incident(a,c,d),f=b(e).map(function(b){return b.source!=a?b.source:b.target});return f},strength:function(a,c,d){var e=this.incident(a,c,d),f=function(a,b){return a+b.weight};return b.reduce(e,f,0)},select:function(a){var c={degree:1,strength:1},d=function(d){for(var e in a){var f,g=a[e],h=e.split(":"),i=h[0],j=2==h.length?h[1]:"eq";if("_"==i.substring(0,1)?(method=i.slice(1),method in c&&(f=d[method]())):f=d.get(i),"eq"==j){if(b.isEqual(f,g)===!1)return!1}else if("ne"==j){if(f==g)return!1}else if("lt"==j){if(f<g==!1)return!1}else if("gt"==j){if(f>g==!1)return!1}else if("le"==j){if(f<=g==!1)return!1}else if("ge"==j){if(f>=g==!1)return!1}else if("in"==j){if(b.indexOf(g,f)===-1)return!1}else if("notin"==j&&b.indexOf(g,f)!==-1)return!1}return!0};return b.filter(this.vs.models,d)},random_vertex:function(){var a=this.es.at(d(0,this.es.size()-1));return Math.random()>.5?a.source:a.target},density:function(){return 2*this.es.length/(this.vs.length*(this.vs.length-1))},adjacency:function(){var a=[],c=0,d=function(){return 0};for(c=this.vcount(),i=0;i<c;i++)a.push(b.range(c).map(d));for(c=this.ecount(),i=0;i<c;i++){var e=this.es[i];a[e.source][e.target]=e.weight}this.adjacency=a}}),g=c.Model.extend({idAttribute:"uuid",defaults:{name:"",count:0,description:"",type_attributes:{},properties:new e.Options,material:{}},get_property:function(a){return this.properties.where({name:a})[0]},add_property:function(a,b){},delete_property:function(a,b){},parse:function(a,b){var c=[];for(k in a.properties)c.push({name:k,otype:a.properties[k]});return{type_attributes:a.type_attributes,properties:new e.Options(c,{parse:!0}),name:a.name,description:a.description||"",uuid:a.uuid}},toString:function(){return this.get("name")},toJSON:function(a){var c=b.pick(this.attributes,"name","description","uuid","type_attributes"),d=this.get("properties").models,e={};for(var f in d){var g=d[f];""!=g.get("name")&&(e[g.get("name")]=g.get("otype"))}return c.properties=e,c}}),h=g.extend({initialize:function(a,b){e.get(this,"count"),e.get(this,"name"),e.get(this,"properties"),e.get(this,"type_attributes",function(){return this.get("type_attributes")}),e.get(this,"label",function(){var a=this.get("name");return void 0===a?"":a});var d=this;this.on("sync",function(a,b,d){c.trigger("nodetype:save",this,b,d)}),this.listenTo(this.attributes.properties,"change",function(){d.trigger("change:properties",d.attributes.properties)})},parse_label:function(){var a=this.label,b={};return b.label=a,b.family=a.indexOf("/")>=0?a.substring(0,a.indexOf("/")):"",b.name=a.indexOf("/")>0?a.substring(a.indexOf("/")):a,b}}),j=g.extend({initialize:function(a,b){e.get(this,"name"),e.get(this,"count"),e.get(this,"type_attributes",function(){return this.get("type_attributes")}),e.get(this,"properties"),e.get(this,"label",function(){var a=this.get("name");return void 0===a?"":a}),this.on("sync",function(a,b,d){c.trigger("edgetype:save",this,b,d)})}}),l=c.Model.extend({idAttribute:"uuid",defaults:{uuid:"",nodetype:"",label:"",color:[0,0,0],coords:[0,0,0]},initialize:function(a,d){var f=this;e.get(this,"graph",function(){return null!=f.collection?f.collection.graph:null}),e.get(this,"type",function(){return this.nodetype}),e.get(this,"nodetype",function(){return f.graph?f.graph.get_node_type(f.get("nodetype")):null}),e.get(this,"properties",function(){return f.get("properties")}),this.properties||this.set("properties",new c.Model),e.get(this,"label",function(){var a=f.properties.get("label");return void 0===a?"":a}),e.get(this,"formatted_label",this.format_label),this.clusters={},e.getset(f,"color"),this.on("sync",function(a,b,d){c.trigger("node:save",f,b,d)}),this.on("change:cl_color",function(a){a.set("color",a.get("cl_color"))}),this.on("change",function(a){a._neighbors=null}),e.Flagable(this),b.bindAll(this,"degree","format_label","neighbors","strength")},getHexColor:function(){return 0},format_label:function(a){var b=this.label;return a&&(b=b.substring(0,a)),[{form:b,css:".normal-font"}]},degree:function(a,b){return this.graph.degree(this,a,b)},strength:function(a,b){return this.graph.strength(this,a,b)},incident:function(a,b){return this.graph.incident(this,a,b)},neighbors:function(a,b){return this.graph.neighbors(this,a,b)}},{active_flags:[]}),m=c.Model.extend({idAttribute:"uuid",defaults:{},constructor:function(){c.Model.apply(this,arguments);var a=this;e.get(this,"graph",function(){return null!=a.collection?a.collection.graph:null}),e.get(this,"type",function(){return a.edgetype}),e.get(this,"edgetype",function(){return a.graph?a.graph.get_edge_type(a.get("edgetype")):null}),e.get(this,"source",function(){return a.graph?a.graph.vs.get(a.get("source")):null}),e.get(this,"target",function(){return a.graph?a.graph.vs.get(a.get("target")):null}),e.get(this,"weight",function(){return a.graph?a.properties.get("weight"):1}),e.get(this,"sym",this.sym),e.get(this,"properties",function(){return a.get("properties")}),e.get(this,"label",function(){var b=a.properties.get("label");return null!=b&&0!=b.length||!a.edgetype?b:a.edgetype.name}),this.properties||this.set("properties",new c.Model),e.Flagable(this),this.on("sync",function(a,b,d){c.trigger("edge:save",a,b,d)})},str:function(){var a=function(a,b){return b+": "+a};return"("+this.get("s")+","+this.get("t")+") "+this.source.label+"-->"+this.target.label+","+b.map(this.attributes,a).join(", ")},tuple:function(){},sym:function(){return b(this.collection.models).findWhere({source:this.target,target:this.source})},is_loop:function(){return this.source.id==this.target.id}},{active_flags:[]}),n=c.Collection.extend({model:l,initialize:function(a,b){_this=this,b&&(this.graph=b.graph)},copy_attr:function(a,c,d){b.map(this.graph.vs.select({}),function(b){b.set(c,b.get(a),d)})},select:function(a){return this.graph.select(a)}}),o=c.Collection.extend({model:m,initialize:function(a,b){this.graph=b.graph},between:function(a,b,c){if(a&&b)return this.models.filter(function(d){return c?d.source==a&d.target==b:(d.source==a|d.source==b)&(d.target==a|d.target==b)})}}),p=c.Collection.extend({model:g,parse:function(a){return"nodetypes"in a?a.nodetypes:"edgetypes"in a?a.edgetypes:void 0}});e.Graph=f,e.Type=g,e.Vertices=n,e.Vertex=l,e.Edges=o,e.Edge=m,e.EdgeType=j,e.NodeType=h,e.ClusterLabel=c.Model.extend({idAttribute:"id",defaults:{label:"",score:1,role:"*",size:12,clusters:null},initialize:function(){e.get(this,"label"),e.get(this,"role"),e.get(this,"score"),e.getset(this,"clusters"),this.clusters={},b.bindAll(this,"_format_label"),e.get(this,"formatted_label",this._format_label),e.Flagable(this)},_format_label:function(){return[{form:this.get("label"),css:"normal"}]}},{active_flags:[]}),e.Cluster=c.Model.extend({defaults:{members:{},labels:[],misc:!1,selected:!1,color:[200,200,200]},initialize:function(a,c){var d=this;b.bindAll(d,"_compute_membership","_compute_colors"),e.get(this,"members"),e.getset(this,"labels"),e.get(this,"misc"),e.getset(this,"color"),e.get(this,"selected",function(){return d.has_flag("selected")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){d.collection.trigger("change:selected")}),e.Flagable(this)},is_misc:function(){return this.misc},select:function(a){a?this.collection.set_selected([this]):this.add_flag("selected")},toggle_select:function(a){var b=this.collection.selected.length;this.selected?a&&b>=2?this.collection.set_selected([this]):this.remove_flag("selected"):this.select(a)},some_selected:function(){return this.selected||this.collection.by_flag("selected")},_compute_membership:function(){var a=this,c=this.collection.clustering.cid;b(a.members).each(function(b){b.each(function(b){var d={cluster:a};b.clusters[c]?b.clusters[c].push(d):b.clusters[c]=[d],b.trigger("change:clusters"),b.trigger("change:clusters:"+c)})})},_compute_colors_old:function(){var a=this.collection.length,b=this.collection.clustering.get("color_value"),c=this.collection.clustering.get("color_saturation"),d=this.collection.indexOf(this),f=[99,99,99];this.misc===!1&&(f=e.utils.hsvToRgb(d/a*360|0,c,b)),this.color=f},_compute_colors:function(a){if(this.misc===!0)return void(this.color=[99,99,99]);var c=(this.collection.length,this.collection.clustering.get("color_value")),d=this.collection.clustering.get("color_saturation"),f=(this.collection.indexOf(this),[0,0,0]),g=f,h=0,i={};this.members.vs.each(function(a){var b=a.get("cl_color");s_last_node_cl_color=b.toString(),i[s_last_node_cl_color]?i[s_last_node_cl_color]++:i[s_last_node_cl_color]=1,i[s_last_node_cl_color]>h&&(h=i[s_last_node_cl_color],g=b)}),cluster_color=g;for(var j=0;b.isEqual(cluster_color,f)|a.indexOf(cluster_color.toString())!=-1;)cluster_color=e.utils.hsvToRgb(1*j*222.23%360|0,d,c),j++;a.push(cluster_color.toString()),this.color=cluster_color}},{active_flags:["selected"]}),e.ClustersList=c.Collection.extend({model:e.Cluster,initialize:function(a,b){_this=this,e.get(this,"selected",function(){return this.by_flag("selected")}),e.assert(b.clustering,"options.clustering is needed"),this.clustering=b.clustering,this.on("add remove reset",function(){var a=[];this.each(function(b){b._compute_membership(),b._compute_colors(a)})}),this.listenTo(this.clustering,"change:color_saturation change:color_value",function(){var a=[];this.each(function(b){b._compute_colors(a)})})},some_selected:function(){return this.by_flag("selected").length>0},select:function(a,b){a.select(b),this.trigger("change:selected",a)},clear_selection:function(a){this.set_selected(null),a&&a.silent||this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")},has_misc:function(){var a=function(a){return a.is_misc()};return b.some(this.models,a)},cluster:function(a){return this.at(a)}}),e.Clustering=c.Model.extend({defaults:{clusters:null,members:{},color_value:80,color_saturation:40},ClusterLabelModel:e.ClusterLabel,ClusterModel:e.Cluster,ClustersCollection:e.ClustersList,initialize:function(a,b){a=a||{},e.getset(this,"members"),e.getset(this,"clusters"),e.getset(this,"color_value"),e.getset(this,"color_saturation"),this.ClusterLabelModel=a.ClusterLabelModel||this.ClusterLabelModel,this.ClusterModel=a.ClusterModel||this.ClusterModel,this.ClustersCollection=a.ClustersCollection||this.ClustersCollection;var c={clustering:this,model:this.ClusterModel},d=new this.ClustersCollection([],c);this.set("clusters",d),e.FlagableCollection(this.clusters)},reset:function(a,c){var d=this,e=b(a).clone();c&&c.members&&b.extend(this.members,c.members);var f=this.members;b.map(e.clusters,function(a){a.misc=!1}),e.misc>-1&&(e.clusters[e.misc].misc=!0),cluster_models=[],b.each(e.clusters,function(a){cluster_members={},b.each(f,function(c,d){source_clone=c.source.clone(),source_filtered=source_clone.filter(function(d){return b(a[c.id_field]).contains(d.id)}),source_clone.reset(source_filtered,{silent:!0}),cluster_members[d]=source_clone}),cluster_models.push(new d.ClusterModel({members:cluster_members,misc:a.misc}))}),this.clusters.reset(cluster_models),this.trigger("reset")},set_labels:function(a,b){this.clusters.each(function(b,c){b.labels=a.labels[c]})}}),e.utils={},e.utils.asEvents=function(a){var b;return{on:function(c,d){if(b)throw new Error("this is one off wrapper");a.addEventListener(c,d,!1),b=[c,d]},off:function(){a.removeEventListener.apply(a,b)}}};var q=function(a){return a="0"+a.toString(16),a.substring(a.length-2)};return e.utils.css_color=function(a){var c="#000000";return a&&(c="#"+b.map(a,q).join("")),c},e.utils.css_gradient=function(a,b){return"-webkit-linear-gradient("+e.utils.css_color(a)+","+e.utils.css_color(b)+")"},e.utils.color_darker=function(a){var b=e.utils.rgbToHsv(a[0],a[1],a[2]);return e.utils.hsvToRgb(b[0],b[1],60)},e.utils.hsvToRgb=function(a,b,c){b/=100,c/=100;var d=Math.floor(a/60%6),e=a/60-d,f=c*(1-b),g=c*(1-e*b),h=c*(1-(1-e)*b),i=[];switch(d){case 0:i=[c,h,f];break;case 1:i=[g,c,f];break;case 2:i=[f,c,h];break;case 3:i=[f,g,c];break;case 4:i=[h,f,c];break;case 5:i=[c,f,g]}var j=Math.min(255,256*i[0]|0),k=Math.min(255,256*i[1]|0),l=Math.min(255,256*i[2]|0);return[j,k,l]},e.utils.rgbToHsv=function(a,b,c){var d,e,f=a/255,g=b/255,h=c/255,i=Math.min(Math.min(f,g),h),j=Math.max(Math.max(f,g),h),k=j;return j==i?e=0:j==f?e=60*((g-h)/(j-i))%360:j==g?e=60*((h-f)/(j-i))+120:j==h&&(e=60*((f-g)/(j-i))+240),e<0&&(e+=360),d=0===j?0:1-i/j,[0|e,100*d|0,100*k|0]},e.utils.addCSSRule=function(a,b,c){for(var d,e,f=0;f<document.styleSheets.length;f++){d=document.styleSheets[f],e=d.cssRules||d.rules;for(var g=a.toLowerCase(),h=0,i=e.length;h<i;h++)if(e[h].selectorText&&e[h].selectorText.toLowerCase()==g){if(null!==c)return void(e[h].style[b]=c);d.deleteRule?d.deleteRule(h):d.removeRule?d.removeRule(h):e[h].style.cssText=""}}d=document.styleSheets[0]||{},d.insertRule?(e=d.cssRules||d.rules,d.insertRule(a+"{ "+b+":"+c+"; }",e.length)):d.addRule&&d.addRule(a,b+":"+c+";",0)},e.utils.deparam=function(a,b){var c={},d={true:!0,false:!1,null:null};return $.each(a.replace(/\+/g," ").split("&"),function(a,e){var f,g=e.split("="),h=decodeURIComponent(g[0]),i=c,j=0,k=h.split("]["),l=k.length-1;if(/\[/.test(k[0])&&/\]$/.test(k[l])?(k[l]=k[l].replace(/\]$/,""),k=k.shift().split("[").concat(k),l=k.length-1):l=0,2===g.length)if(f=decodeURIComponent(g[1]),b&&(f=f&&!isNaN(f)?+f:"undefined"===f?void 0:void 0!==d[f]?d[f]:f),l)for(;j<=l;j++)h=""===k[j]?i.length:k[j],i=i[h]=j<l?i[h]||(k[j+1]&&isNaN(k[j+1])?{}:[]):f;else $.isArray(c[h])?c[h].push(f):void 0!==c[h]?c[h]=[c[h],f]:c[h]=f;else h&&(c[h]=b?void 0:"")}),c},e.utils.piwikTrackCurrentUrl=function(){b.isUndefined(window._paq)||"function"!=typeof window._paq.push||(window._paq.push(["setCustomUrl",window.location.href]),window._paq.push(["trackPageView"]))},e}); !function(a,b){"function"==typeof define&&define.amd?define(["underscore","backbone"],function(c,d){return b(a,c,d)}):a.Cello=b(a,_,Backbone)}(this,function(a,b,c){function d(a,b){return Math.floor(Math.random()*(b-a+1))+a}var e={desc:"",version:.2,license:"!! TODO !!",DEBUG:!1};e.log=function(){console.log("INFO",arguments)},e.debug=function(){e.DEBUG&&console.log("DEBUG",arguments)},e.assert=function(a,c){if(!a){var d="Assertion failed";throw b.isArray(c)&&(d=c.join("\n")),c&&(d=c),new Error(d)}},e.get=function(a,c,d){default_getter=function(){return e.assert(b(a).has("attributes")),e.assert(b(a.attributes).has(c)),a.attributes[c]},a.__defineGetter__(c,d||default_getter)},e.set=function(a,c,d){var f=function(d){e.assert(b(a).has("attributes"));var f=d;b(a).has("attributes")&&(b(a.attributes).has(c)&&(f=a.attributes[c]),a.attributes[c]=d,f!=d&&(a.trigger("change",a),a.trigger("change:"+c,a,d)))};a.__defineSetter__(c,d||f)},e.getset=function(a,b,c,d){e.get(a,b,c),e.set(a,b,d)},e.FlagableCollection=function(a){a.model.active_flags||[];b.each(a.model.active_flags,function(b){e.FlagMethod(a,b)}),a.by_flag=function(b){return a.filter(function(a){return a.has_flag(b)})},a._check_models_param=function(a){return a=b.isUndefined(a)?this.models:a,a=b.isNull(a)?[]:a,a=b.isArray(a)?a:[a]},a.set_flag=function(c,d){d=a._check_models_param(d);var e=a.by_flag(c),f=b.sortBy(d,f);b.isEqual(e,d)===!1&&a.add_flag(c,d,!0)},a.add_flag=function(c,d,e,f){var e=void 0!==e&&e,g=a.by_flag(c);if(d=a._check_models_param(d),(0!=g.length||0!=d.length)&&b.isObject(d)){var h=b.union(d,e?[]:g),i=b.difference(g,h);b.difference(h,g);a.remove_flag(c,i,f),b.each(d,function(a){a.add_flag(c,f)})}},a.remove_flag=function(c,d,e){d=a._check_models_param(d),b.each(d,function(a){a.remove_flag(c,e)})}},e.Flagable=function(a){a.get("flags")||a.set("flags",[]),e.get(a,"flags"),a.add_flag=function(a,c){this.has_flag(a)||(this.set("flags",b.union(this.flags,[a]),{silent:!0}),c&&c.silent||(this.trigger("addflag",a,this),this.trigger("addflag:"+a,this)))},a.remove_flag=function(a,c){this.has_flag(a)&&(this.set("flags",b.without(this.flags,a),{silent:!0}),c&&c.silent||(this.trigger("rmflag",a,this),this.trigger("rmflag:"+a,this)))},a.has_flag=function(a){return this.flags||console.log(this),this.flags.indexOf(a)>=0}},e.FlagMethod=function(a,b){var c="add_"+b,d="set_"+b;e.assert(void 0===a[c]),e.assert(void 0===a[d]),a[d]=function(c){a.set_flag(b,c,!0)},a[c]=function(c,d){a.add_flag(b,c,d)}},e.SortableCollection=function(a,d,f,g){e.assert(b.isString(f)),e.assert(b.isObject(d)),a.sortables=new c.Collection([],{model:e.Sortable}),e.FlagableCollection(a.sortables),b(d).each(function(b){a.sortables.add(new e.Sortable(b))}),a.listenTo(a.sortables,"change:selected change:reversed",function(b){a.comparator=b.get_comparator(),a.sort()}),console.log(a.sortables);var h=a.sortables.findWhere({field:f});return e.assert(h,"invalid default_key ("+f+")"),h.select(),a.sort_reverse&&h.reverse(),a.comparator=h.get_comparator(),a},e.Sortable=c.Model.extend({defaults:{field:"",type:"",label:null},comparators:{alpha:function(a){var b=function(b,c){return b.get(a).localeCompare(c.get(a))};return b},numeric:function(a){var b=function(b,c){return b.get(a)-c.get(a)==0?0:b.get(a)-c.get(a)>0?1:-1};return b}},initialize:function(a,c){e.Flagable(this),e.get(this,"field"),e.get(this,"type"),e.get(this,"selected",function(){return this.has_flag("selected")}),e.get(this,"reversed",function(){return this.has_flag("reversed")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){this.collection.trigger("change:selected",this),this.collection.trigger("change")}),this.listenTo(this,"addflag:reversed rmflag:reversed",function(){this.collection.trigger("change:reversed",this),this.collection.trigger("change")}),b.has(a,"label")&&a.label||this.set("label",a.field);this.get_comparator();return this},get_comparator:function(){var a=this.type,c=null;if(b.isFunction(a))c=a(this.field);else{if(!b.has(this.comparators,a))throw Error("comparator not found ! (type: '"+a+"')");c=this.comparators[a](this.field)}if(this.reversed){var d=c;c=function(a,b){return d(b,a)}}return c},select:function(){this.selected||(b(this.collection.by_flag("selected")).each(function(a){a.remove_flag("selected"),a.reversed&&a.remove_flag("reversed")}),this.add_flag("selected"))},reverse:function(){this.reversed||this.add_flag("reversed")},toggle_reverse:function(){this.reversed?this.remove_flag("reversed"):this.add_flag("reversed")}},{active_flags:["selected","reversed"]}),e.DocList=c.Collection.extend({model:e.Doc,initialize:function(a,c){b(this).bindAll("_set_sort_key","_set_sort_reverse","_set_sortables","_get_sort_key","_get_sort_reverse","_get_sortables"),c=c||{},e.get(this,"selected",function(){return this.has_flag("selected")});var d=c.sort_key||"title",f=c.sort_reverse||!1,g=c.sortables||[];this.model&&(e.FlagableCollection(this),e.SortableCollection(this,g,d,f))},_set_sort_key:function(a){var b=this.sort_key;this._sort_key=a,b!=this.sort_key&&(this.trigger("change"),this.trigger("change:sort_key"))},_get_sort_key:function(){return this._sort_key},_set_sort_reverse:function(a){var b=this.sort_reverse;this._sort_reverse=a,b!=this.sort_reverse&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sort_reverse:function(){return this._sort_reverse},_set_sortables:function(a){var b=this.sortables;this._sortables=a,b!=this.sortables&&(this.trigger("change"),this.trigger("change:sort_reverse"))},_get_sortables:function(){return this._sortables},select:function(a){a.select(),this.trigger("change:selected")},clear_selection:function(){this.set_selected(null),options&&options.silent||this.trigger("change:selected"),this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")}}),e.Doc=c.Model.extend({defaults:{docnum:null,selected:!1,clusters:null},idAttribute:"docnum",initialize:function(a,b){e.get(this,"docnum"),e.get(this,"selected",function(){return this.has_flag("selected")}),e.getset(this,"clusters"),this.clusters={},e.Flagable(this),e.assert(null!==this.docnum,"Document should have a docnum")},select:function(){this.add_flag("selected")},toggle_select:function(){this.selected?this.remove_flag("selected"):this.add_flag("selected")}},{active_flags:["selected"]}),e.QueryModel=c.Model.extend({defaults:{cellist:null,query:"",loaded:!1},loaded_query:null,initialize:function(a,c){b.bindAll(this,"set_query","play_completed","query_updated"),e.get(this,"cellist"),e.get(this,"loaded"),e.get(this,"query"),e.set(this,"query",this.set_query),this.listenTo(this.cellist,"play:complete",this.play_completed),this.on("change:query",this.query_updated)},set_query:function(a){a=a.trim(),console.log("set_query",a),this.set("query",a)},query_updated:function(){this.query!==this.loaded_query?this.set("loaded",!1):this.set("loaded",!0)},play_completed:function(a){a.results.query!=this.query&&(this.query=a.results.query),this.loaded_query=this.query,this.set("loaded",!0)},validate:function(){return!0},play:function(){this.cellist.play()},export_for_engine:function(){return this.query}}),e.Option=c.Model.extend({defaults:{value:void 0,name:null,otype:{}},idAttribute:"name",initialize:function(a,c){var d=this;b.bindAll(this,"validate"),e.get(this,"name"),e.get(this,"otype"),e.get(this,"value"),e.set(this,"value",function(a){var b=d.validate(a);d.value!=b&&d.set("value",b)}),e.assert(null!==this.name,"Option should have a name"),e.assert(null!==a.otype,"(Option: "+this.name+") otype should not be 'null'")},is_default:function(){return b.isEqual(this.value,this.otype.default)},cast:function(a){var b=function(a){return a};return"float"===this.otype.vtype&&(b=parseFloat),"int"===this.otype.vtype&&(b=parseInt),"Boolean"===this.otype.type&&(b=function(a){return[1,!0,"true","True","TRUE","1","yes"].indexOf(a)>=0}),b(a)},parse:function(a){var c=this;return this.otype&&("float"!==this.otype.vtype&&"int"!==this.otype.vtype||(this.otype.multi?(a=a.replace(/\s/g,"").split(",").filter(function(a){return a.length}).map(function(a){return c.cast(a)}),b.isNaN(a)&&(a="")):(a=c.cast(a),b.isNaN(a)&&(a="")))),a},_validate_one:function(a){var c=this.otype.choices;if(c&&b.indexOf(c,a)<0)throw new Error("invalid option value");return a},is_multi:function(){return this.otype.multi},validate:function(a){var c=this;if(this.is_multi()){var d=[];b.each(a,function(a){d.push(c._validate_one(a))}),a=d}else a=this._validate_one(a);return a}}),e.Options=c.Collection.extend({model:e.Option}),e.Component=c.Model.extend({idAttribute:"name",defaults:{name:null,selected:!1,doc:"",options:new e.Options},initialize:function(){e.get(this,"name"),e.get(this,"options"),e.get(this,"selected"),this.listenTo(this.options,"reset",this.optionsChanged),this.listenTo(this.options,"change",this.optionsChanged),e.assert(null!==this.name,"Component should have a name")},get_option:function(a){return this.options.where({name:a})[0]},set_option:function(a,b){var c=this.get_option(a);c.value=b},parse:function(a,b){return a.options=new e.Options(a.options,{parse:!0}),a.default&&(a.selected=!0),a},optionsChanged:function(a){this.trigger("change",this,a),this.trigger("change:options",this,a)},changed_options:function(){var a=[];return b.each(this.options.models,function(b){b.is_default()||a.push(b)}),a},as_dict:function(a){void 0!==a&&null!=a||(a=!1);var c={name:this.name},d=a?this.changed_options():this.options.models;return d.length>0&&(c.options={},b.each(d,function(a){c.options[a.name]=a.value})),c},set_state:function(a){var c=this;b.each(a,function(a,b){c.set_option(b,a)})}}),e.Components=c.Collection.extend({model:e.Component}),e.Block=c.Model.extend({defaults:{name:"",components:new e.Components,required:!0,multiple:!1,args:null,returns:null},initialize:function(a){e.get(this,"components"),e.get(this,"selected",this._get_selected),e.get(this,"name"),e.get(this,"required"),e.get(this,"multiple"),e.get(this,"args"),e.get(this,"returns"),e.assert(null!==this.name,"Block should have a name"),e.assert(b.isNull(this.args)||b.isArray(this.args),"'args' should be null or an Array"),null===this.returns&&this.set("returns",this.name),this.listenTo(this.components,"reset",this.componentsChanged),this.listenTo(this.components,"change",this.componentsChanged),this.selection_default=b.map(this.selected,function(a){return a.name})},componentsChanged:function(a){this.trigger("change",this,a),this.trigger("change:components",this,a)},parse:function(a,b){return a.components=new e.Components(a.components,{parse:!0}),a},reset:function(){this.components.reset()},get_component:function(a){return b.find(this.components.models,function(b){return b.name==a})},_get_selected:function(){return this.components.where({selected:!0})},select:function(a){a.selected?this.required||(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected")):(this.multiple||b.each(this.selected,function(a){a.set("selected",!1)}),a.set("selected",!0),this.trigger("change"),this.trigger("change:selected"))},unselect:function(a){a.selected&&(!this.required||this.multiple&&this.selected.length>1)&&(a.set("selected",!1),this.trigger("change"),this.trigger("change:selected"))},clear_selection:function(){var a=this;b.each(this.selected,function(b){a.unselect(b)})},validate:function(){},get_state:function(a){void 0!==a&&null!=a||(a=!1);var c=[],d=this.selected,e=b.isEqual(b.map(d,function(a){return a.name}),this.selection_default);for(var f in d){var g=d[f],h=g.as_dict(a);a&&e&&!b.has(h,"options")||c.push(g.as_dict(a))}return c},set_state:function(a){var c=this;b.each(a,function(a){var b=a.name,d=a.options,e=c.get_component(b);e.set_state(d),c.select(e)})}}),e.Blocks=c.Collection.extend({model:e.Block}),e.Engine=c.Model.extend({defaults:{blocks:new e.Blocks,args:null,returns:null,needed_inputs:[]},initialize:function(a,b){var c=a.url;this.input_models={},this.url=c,this.play_url=c,e.get(this,"blocks"),e.get(this,"args"),e.get(this,"returns"),e.get(this,"needed_inputs"),this.listenTo(this.blocks,"change reset",this.blockChanged)},get_block:function(a){return b.find(this.blocks.models,function(b){return b.get("name")==a})},blockChanged:function(a){this._update_needed_inputs(),this.trigger("change",this,a),this.trigger("change:blocks",this,a)},_update_needed_inputs:function(){var a=[],b=[],c=this.blocks.models;for(var d in c){var e=c[d];if(e.selected.length>0){for(var f in e.args){var g=e.args[f];b.indexOf(g)<0&&a.indexOf(g)&&a.push(g)}b.push(e.returns)}}this.set({needed_inputs:a},{silent:!0})},parse:function(a,b){return console.log("Engine parse",a,b),this.data=a,a.blocks=new e.Blocks(a.blocks,{parse:!0}),a},reset:function(a){a=this.parse(a),this.set(a)},get_state:function(a){void 0!==a&&null!=a||(a=!1);var b={},c=this.blocks.models;for(var d in c){var e=c[d],f=e.get_state(a);f.length>0&&(b[e.name]=f)}return b},set_state:function(a){var c=this;b.each(a,function(a,b){var d=c.get_block(b);d.set_state(a)})},get_state_str:function(a){var b=this.get_state(a),c=$.param(b);return c},set_state_str:function(a){var b=e.utils.deparam(a);this.set_state(b)},register_input:function(a,b){this.input_models[a]=b},play:function(a){var d=this,f=this.get_state(),g={};b.each(this.input_models,function(a,b,c){g[b]=a.export_for_engine()});var g=b.extend(g,a),h=b.extend({},g,{options:f});e.log("play",h),d.trigger("play:loading",g,f);var h=JSON.stringify(h);c.ajax({url:d.play_url,method:"post",contentType:"application/json",data:h,success:function(b,c,e){b.meta&&b.meta.errors&&b.meta.errors.length>0?d.trigger("play:error",b,e):(console.log("play:success",b,a,f),d.trigger("play:success",b,a,f),d.trigger("play:complete",b,a,f))},error:function(a,b,c){d.trigger("play:error",{},a),d.trigger("play:complete",{},a)}})}});var f=c.Model.extend({IN:1,OUT:2,ALL:4,defaults:{gid:null,directed:!1,bipartite:!1},idAttribute:"gid",initialize:function(a,b){var d=this;if(this.edge_list={},this.nodetype_model=a.nodetype_model||h,this.nodetypes=new p([],{model:this.nodetype_model}),this.edgetype_model=a.edgetype_model||j,this.edgetypes=new p([],{model:this.edgetype_model}),this.properties||(this.properties=new c.Model),this.meta||(this.meta=new c.Model),e.get(this,"label",function(){return this.properties.get("name")}),this.urlRoot=a.urlRoot,this.urlRoot){var f=function(a){d.nodetypes.url=d.url()+"/nodetypes",d.nodetypes.reset(),d.nodetypes.fetch({remove:!1}),d.edgetypes.url=d.url()+"/edgetypes",d.edgetypes.reset(),d.edgetypes.fetch({remove:!1})};this.on("change:gid",f),this.nodetypes.on("add",function(a){a.urlRoot=d.url()+"/nodetype"}),this.edgetypes.on("add",function(a){a.urlRoot=d.url()+"/edgetype"})}this.vertex_model=a.vertex_model||l,this.vs=new e.Vertices([],{graph:this,model:this.vertex_model}),this.vs.reset([],{collection:this.vs});var g=function(a){a&&(a.collection=d.vs,void 0===a.id&&(a.id=d.vs.size()),a.id in d.edge_list||(d.edge_list[a.id]=[]))},i=function(a){var b=d.es.filter(function(b){return b.get("source")==a.id||b.get("target")==a.id});d.es.remove(b),delete d.edge_list[a.id]};this.vs.on("add",g),this.vs.on("remove",i),this.edge_model=a.edge_model||m,this.es=new e.Edges([],{graph:this,model:this.edge_model}),this.es.reset([],{collection:this.es});var k=function(a){a.collection=d.es,d.edge_list[a.get("source")].push(a),d.edge_list[a.get("target")].push(a)},n=function(a){d.edge_list[a.get("source")].splice(d.edge_list[a.get("source")].indexOf(a),1),d.edge_list[a.get("target")].splice(d.edge_list[a.get("target")].indexOf(a),1)};this.es.on("add",k),this.es.on("remove",n),e.FlagableCollection(this.vs),e.FlagableCollection(this.es),a.data&&this.reset(a.data)},url:function(){return this.urlRoot+this.id},parse:function(a,b){this.reset(a[this.id],b)},reset:function(a,c){e.debug("parse graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{merge:!0,remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{merge:!0,remove:!1,parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),c=c?b.clone(c):{},a.vs&&a.es&&(this.edge_list={},this.es.reset([],c),this.vs.reset([],c),c={parse:!0},this.vs.set(a.vs,c),this.es.set(a.es,c)),this.trigger("reset")},merge:function(a,b){e.debug("merge graph",a),a.nodetypes&&this.nodetypes.set({nodetypes:a.nodetypes},{remove:!1,parse:!0}),a.edgetypes&&this.edgetypes.set({edgetypes:a.edgetypes},{remove:!1,parse:!0}),a.meta&&this.meta.set(a.meta,{parse:!0}),a.properties&&this.properties.set(a.properties,{parse:!0}),this.vs.add(a.vs,{parse:!0}),this.es.add(a.es,{parse:!0}),this.trigger("merge")},get_edge_type:function(a){var b=this.edgetypes.get(a);if(b)return b},get_node_type:function(a){var b=this.nodetypes.get(a);if(b)return b},summary:function(){return{attrs:this.attributes,vcount:this.vcount(),ecount:this.ecount(),density:this.density(),v_attrs:this.attributes.v_attrs,e_attrs:this.attributes.e_attrs}},str:function(){var a=b.template("v:<%=vcount%>, e:<%=ecount%>,density:<%=density%>,\nv attrs:<%=v_attrs%>, \ne attrs:<%=e_attrs%>, ");return a(this.summary())},add_vertex:function(a){this.vs.add(a)},vcount:function(){return this.vs.length},add_edge:function(a){this.es.add(a)},is_loop:function(a){var c=function(a){return a.source===a.target};return b.map(a,c)},ecount:function(){return this.es.length},incident:function(a,c,d){var e=this,f=[],g=a.id,h=void 0===c?this.ALL:c,i=void 0===d||d;return h==e.ALL?f=b.filter(e.edge_list[g],function(a){return!!i||!a.is_loop()}):h==e.IN?f=b.filter(e.edge_list[g],function(a){return!(a.source.id!=g||!i&&a.is_loop())}):h==e.OUT&&(f=b.filter(e.edge_list[g],function(a){return!(a.target.id!=g||!i&&a.is_loop())})),f},degree:function(a,b,c){return this.incident(a,b,c).length},neighbors:function(a,c,d){var e=this.incident(a,c,d),f=b(e).map(function(b){return b.source!=a?b.source:b.target});return f},strength:function(a,c,d){var e=this.incident(a,c,d),f=function(a,b){return a+b.weight};return b.reduce(e,f,0)},select:function(a){var c={degree:1,strength:1},d=function(d){for(var e in a){var f,g=a[e],h=e.split(":"),i=h[0],j=2==h.length?h[1]:"eq";if("_"==i.substring(0,1)?(method=i.slice(1),method in c&&(f=d[method]())):f=d.get(i),"eq"==j){if(b.isEqual(f,g)===!1)return!1}else if("ne"==j){if(f==g)return!1}else if("lt"==j){if(f<g==!1)return!1}else if("gt"==j){if(f>g==!1)return!1}else if("le"==j){if(f<=g==!1)return!1}else if("ge"==j){if(f>=g==!1)return!1}else if("in"==j){if(b.indexOf(g,f)===-1)return!1}else if("notin"==j&&b.indexOf(g,f)!==-1)return!1}return!0};return b.filter(this.vs.models,d)},random_vertex:function(){var a=this.es.at(d(0,this.es.size()-1));return Math.random()>.5?a.source:a.target},density:function(){return 2*this.es.length/(this.vs.length*(this.vs.length-1))},adjacency:function(){var a=[],c=0,d=function(){return 0};for(c=this.vcount(),i=0;i<c;i++)a.push(b.range(c).map(d));for(c=this.ecount(),i=0;i<c;i++){var e=this.es[i];a[e.source][e.target]=e.weight}this.adjacency=a}}),g=c.Model.extend({idAttribute:"uuid",defaults:{name:"",count:0,description:"",type_attributes:{},properties:new e.Options,material:{}},get_property:function(a){return this.properties.where({name:a})[0]},add_property:function(a,b){},delete_property:function(a,b){},parse:function(a,b){var c=[];for(k in a.properties)c.push({name:k,otype:a.properties[k]});return{type_attributes:a.type_attributes,properties:new e.Options(c,{parse:!0}),name:a.name,description:a.description||"",uuid:a.uuid}},toString:function(){return this.get("name")},toJSON:function(a){var c=b.pick(this.attributes,"name","description","uuid","type_attributes"),d=this.get("properties").models,e={};for(var f in d){var g=d[f];""!=g.get("name")&&(e[g.get("name")]=g.get("otype"))}return c.properties=e,c}}),h=g.extend({initialize:function(a,b){e.get(this,"count"),e.get(this,"name"),e.get(this,"properties"),e.get(this,"type_attributes",function(){return this.get("type_attributes")}),e.get(this,"label",function(){var a=this.get("name");return void 0===a?"":a});var d=this;this.on("sync",function(a,b,d){c.trigger("nodetype:save",this,b,d)}),this.listenTo(this.attributes.properties,"change",function(){d.trigger("change:properties",d.attributes.properties)})},parse_label:function(){var a=this.label,b={};return b.label=a,b.family=a.indexOf("/")>=0?a.substring(0,a.indexOf("/")):"",b.name=a.indexOf("/")>0?a.substring(a.indexOf("/")):a,b}}),j=g.extend({initialize:function(a,b){e.get(this,"name"),e.get(this,"count"),e.get(this,"type_attributes",function(){return this.get("type_attributes")}),e.get(this,"properties"),e.get(this,"label",function(){var a=this.get("name");return void 0===a?"":a}),this.on("sync",function(a,b,d){c.trigger("edgetype:save",this,b,d)})}}),l=c.Model.extend({idAttribute:"uuid",defaults:{uuid:"",nodetype:"",label:"",color:[0,0,0],coords:[0,0,0]},initialize:function(a,d){var f=this;e.get(this,"graph",function(){return null!=f.collection?f.collection.graph:null}),e.get(this,"type",function(){return this.nodetype}),e.get(this,"nodetype",function(){return f.graph?f.graph.get_node_type(f.get("nodetype")):null}),e.get(this,"properties",function(){return f.get("properties")}),this.properties||this.set("properties",new c.Model),e.get(this,"label",function(){var a=f.properties.get("label");return void 0===a?"":a}),e.get(this,"formatted_label",this.format_label),this.clusters={},e.getset(f,"color"),this.on("sync",function(a,b,d){c.trigger("node:save",f,b,d)}),this.on("change:cl_color",function(a){a.set("color",a.get("cl_color"))}),this.on("change",function(a){a._neighbors=null}),e.Flagable(this),b.bindAll(this,"degree","format_label","neighbors","strength")},getHexColor:function(){return 0},format_label:function(a){var b=this.label;return a&&(b=b.substring(0,a)),[{form:b,css:".normal-font"}]},degree:function(a,b){return this.graph.degree(this,a,b)},strength:function(a,b){return this.graph.strength(this,a,b)},incident:function(a,b){return this.graph.incident(this,a,b)},neighbors:function(a,b){return this.graph.neighbors(this,a,b)}},{active_flags:[]}),m=c.Model.extend({idAttribute:"uuid",defaults:{},constructor:function(){c.Model.apply(this,arguments);var a=this;e.get(this,"graph",function(){return null!=a.collection?a.collection.graph:null}),e.get(this,"type",function(){return a.edgetype}),e.get(this,"edgetype",function(){return a.graph?a.graph.get_edge_type(a.get("edgetype")):null}),e.get(this,"source",function(){return a.graph?a.graph.vs.get(a.get("source")):null}),e.get(this,"target",function(){return a.graph?a.graph.vs.get(a.get("target")):null}),e.get(this,"weight",function(){return a.graph?a.properties.get("weight"):1}),e.get(this,"sym",this.sym),e.get(this,"properties",function(){return a.get("properties")}),e.get(this,"label",function(){var b=a.properties.get("label");return null!=b&&0!=b.length||!a.edgetype?b:a.edgetype.name}),this.properties||this.set("properties",new c.Model),e.Flagable(this),this.on("sync",function(a,b,d){c.trigger("edge:save",a,b,d)})},str:function(){var a=function(a,b){return b+": "+a};return"("+this.get("s")+","+this.get("t")+") "+this.source.label+"-->"+this.target.label+","+b.map(this.attributes,a).join(", ")},tuple:function(){},sym:function(){return b(this.collection.models).findWhere({source:this.target,target:this.source})},is_loop:function(){return this.source.id==this.target.id}},{active_flags:[]}),n=c.Collection.extend({model:l,initialize:function(a,b){_this=this,b&&(this.graph=b.graph)},copy_attr:function(a,c,d){b.map(this.graph.vs.select({}),function(b){b.set(c,b.get(a),d)})},select:function(a){return this.graph.select(a)}}),o=c.Collection.extend({model:m,initialize:function(a,b){this.graph=b.graph},between:function(a,b,c){if(a&&b)return this.models.filter(function(d){return c?d.source==a&d.target==b:(d.source==a|d.source==b)&(d.target==a|d.target==b)})}}),p=c.Collection.extend({model:g,parse:function(a){return"nodetypes"in a?a.nodetypes:"edgetypes"in a?a.edgetypes:void 0}});e.Graph=f,e.Type=g,e.Vertices=n,e.Vertex=l,e.Edges=o,e.Edge=m,e.EdgeType=j,e.NodeType=h,e.ClusterLabel=c.Model.extend({idAttribute:"id",defaults:{label:"",score:1,role:"*",size:12,clusters:null},initialize:function(){e.get(this,"label"),e.get(this,"role"),e.get(this,"score"),e.getset(this,"clusters"),this.clusters={},b.bindAll(this,"_format_label"),e.get(this,"formatted_label",this._format_label),e.Flagable(this)},_format_label:function(){return[{form:this.get("label"),css:"normal"}]}},{active_flags:[]}),e.Cluster=c.Model.extend({defaults:{members:{},labels:[],misc:!1,selected:!1,color:[200,200,200]},initialize:function(a,c){var d=this;b.bindAll(d,"_compute_membership","_compute_colors"),e.get(this,"members"),e.getset(this,"labels"),e.get(this,"misc"),e.getset(this,"color"),e.get(this,"selected",function(){return d.has_flag("selected")}),this.listenTo(this,"addflag:selected rmflag:selected",function(){d.collection.trigger("change:selected")}),e.Flagable(this)},is_misc:function(){return this.misc},select:function(a){a?this.collection.set_selected([this]):this.add_flag("selected")},toggle_select:function(a){var b=this.collection.selected.length;this.selected?a&&b>=2?this.collection.set_selected([this]):this.remove_flag("selected"):this.select(a)},some_selected:function(){return this.selected||this.collection.by_flag("selected")},_compute_membership:function(){var a=this,c=this.collection.clustering.cid;b(a.members).each(function(b){b.each(function(b){var d={cluster:a};b.clusters[c]?b.clusters[c].push(d):b.clusters[c]=[d],b.trigger("change:clusters"),b.trigger("change:clusters:"+c)})})},_compute_colors_old:function(){var a=this.collection.length,b=this.collection.clustering.get("color_value"),c=this.collection.clustering.get("color_saturation"),d=this.collection.indexOf(this),f=[99,99,99];this.misc===!1&&(f=e.utils.hsvToRgb(d/a*360|0,c,b)),this.color=f},_compute_colors:function(a){if(this.misc===!0)return void(this.color=[99,99,99]);var c=(this.collection.length,this.collection.clustering.get("color_value")),d=this.collection.clustering.get("color_saturation"),f=(this.collection.indexOf(this),[0,0,0]),g=f,h=0,i={};this.members.vs.each(function(a){var b=a.get("cl_color");s_last_node_cl_color=b.toString(),i[s_last_node_cl_color]?i[s_last_node_cl_color]++:i[s_last_node_cl_color]=1,i[s_last_node_cl_color]>h&&(h=i[s_last_node_cl_color],g=b)}),cluster_color=g;for(var j=0;b.isEqual(cluster_color,f)|a.indexOf(cluster_color.toString())!=-1;)cluster_color=e.utils.hsvToRgb(1*j*222.23%360|0,d,c),j++;a.push(cluster_color.toString()),this.color=cluster_color}},{active_flags:["selected"]}),e.ClustersList=c.Collection.extend({model:e.Cluster,initialize:function(a,b){_this=this,e.get(this,"selected",function(){return this.by_flag("selected")}),e.assert(b.clustering,"options.clustering is needed"),this.clustering=b.clustering,this.on("add remove reset",function(){var a=[];this.each(function(b){b._compute_membership(),b._compute_colors(a)})}),this.listenTo(this.clustering,"change:color_saturation change:color_value",function(){var a=[];this.each(function(b){b._compute_colors(a)})})},some_selected:function(){return this.by_flag("selected").length>0},select:function(a,b){a.select(b),this.trigger("change:selected",a)},clear_selection:function(a){this.set_selected(null),a&&a.silent||this.trigger("change:selected")},unselect:function(a){a.remove_flag("selected"),this.trigger("change:selected")},has_misc:function(){var a=function(a){return a.is_misc()};return b.some(this.models,a)},cluster:function(a){return this.at(a)}}),e.Clustering=c.Model.extend({defaults:{clusters:null,members:{},color_value:80,color_saturation:40},ClusterLabelModel:e.ClusterLabel,ClusterModel:e.Cluster,ClustersCollection:e.ClustersList,initialize:function(a,b){a=a||{},e.getset(this,"members"),e.getset(this,"clusters"),e.getset(this,"color_value"),e.getset(this,"color_saturation"),this.ClusterLabelModel=a.ClusterLabelModel||this.ClusterLabelModel,this.ClusterModel=a.ClusterModel||this.ClusterModel,this.ClustersCollection=a.ClustersCollection||this.ClustersCollection;var c={clustering:this,model:this.ClusterModel},d=new this.ClustersCollection([],c);this.set("clusters",d),e.FlagableCollection(this.clusters)},reset:function(a,c){var d=this,e=b(a).clone();c&&c.members&&b.extend(this.members,c.members);var f=this.members;b.map(e.clusters,function(a){a.misc=!1}),e.misc>-1&&(e.clusters[e.misc].misc=!0),cluster_models=[],b.each(e.clusters,function(a){cluster_members={},b.each(f,function(c,d){source_clone=c.source.clone(),source_filtered=source_clone.filter(function(d){return b(a[c.id_field]).contains(d.id)}),source_clone.reset(source_filtered,{silent:!0}),cluster_members[d]=source_clone}),cluster_models.push(new d.ClusterModel({members:cluster_members,misc:a.misc}))}),this.clusters.reset(cluster_models),this.trigger("reset")},set_labels:function(a,b){this.clusters.each(function(b,c){b.labels=a.labels[c]})}}),e.utils={},e.utils.asEvents=function(a){var b;return{on:function(c,d){if(b)throw new Error("this is one off wrapper");a.addEventListener(c,d,!1),b=[c,d]},off:function(){a.removeEventListener.apply(a,b)}}};var q=function(a){return a="0"+a.toString(16),a.substring(a.length-2)};return e.utils.css_color=function(a){var c="#000000";return a&&(c="#"+b.map(a,q).join("")),c},e.utils.css_gradient=function(a,b){return"-webkit-linear-gradient("+e.utils.css_color(a)+","+e.utils.css_color(b)+")"},e.utils.color_darker=function(a){var b=e.utils.rgbToHsv(a[0],a[1],a[2]);return e.utils.hsvToRgb(b[0],b[1],60)},e.utils.hsvToRgb=function(a,b,c){b/=100,c/=100;var d=Math.floor(a/60%6),e=a/60-d,f=c*(1-b),g=c*(1-e*b),h=c*(1-(1-e)*b),i=[];switch(d){case 0:i=[c,h,f];break;case 1:i=[g,c,f];break;case 2:i=[f,c,h];break;case 3:i=[f,g,c];break;case 4:i=[h,f,c];break;case 5:i=[c,f,g]}var j=Math.min(255,256*i[0]|0),k=Math.min(255,256*i[1]|0),l=Math.min(255,256*i[2]|0);return[j,k,l]},e.utils.rgbToHsv=function(a,b,c){var d,e,f=a/255,g=b/255,h=c/255,i=Math.min(Math.min(f,g),h),j=Math.max(Math.max(f,g),h),k=j;return j==i?e=0:j==f?e=60*((g-h)/(j-i))%360:j==g?e=60*((h-f)/(j-i))+120:j==h&&(e=60*((f-g)/(j-i))+240),e<0&&(e+=360),d=0===j?0:1-i/j,[0|e,100*d|0,100*k|0]},e.utils.addCSSRule=function(a,b,c){for(var d,e,f=0;f<document.styleSheets.length;f++){d=document.styleSheets[f],e=d.cssRules||d.rules;for(var g=a.toLowerCase(),h=0,i=e.length;h<i;h++)if(e[h].selectorText&&e[h].selectorText.toLowerCase()==g){if(null!==c)return void(e[h].style[b]=c);d.deleteRule?d.deleteRule(h):d.removeRule?d.removeRule(h):e[h].style.cssText=""}}d=document.styleSheets[0]||{},d.insertRule?(e=d.cssRules||d.rules,d.insertRule(a+"{ "+b+":"+c+"; }",e.length)):d.addRule&&d.addRule(a,b+":"+c+";",0)},e.utils.deparam=function(a,b){var c={},d={true:!0,false:!1,null:null};return $.each(a.replace(/\+/g," ").split("&"),function(a,e){var f,g=e.split("="),h=decodeURIComponent(g[0]),i=c,j=0,k=h.split("]["),l=k.length-1;if(/\[/.test(k[0])&&/\]$/.test(k[l])?(k[l]=k[l].replace(/\]$/,""),k=k.shift().split("[").concat(k),l=k.length-1):l=0,2===g.length)if(f=decodeURIComponent(g[1]),b&&(f=f&&!isNaN(f)?+f:"undefined"===f?void 0:void 0!==d[f]?d[f]:f),l)for(;j<=l;j++)h=""===k[j]?i.length:k[j],i=i[h]=j<l?i[h]||(k[j+1]&&isNaN(k[j+1])?{}:[]):f;else $.isArray(c[h])?c[h].push(f):void 0!==c[h]?c[h]=[c[h],f]:c[h]=f;else h&&(c[h]=b?void 0:"")}),c},e.utils.piwikTrackCurrentUrl=function(){b.isUndefined(window._paq)||"function"!=typeof window._paq.push||(window._paq.push(["setCustomUrl",window.location.href]),window._paq.push(["trackPageView"]))},e});
\ No newline at end of file
...@@ -1104,10 +1104,22 @@ App.Base = Backbone.View.extend({ ...@@ -1104,10 +1104,22 @@ App.Base = Backbone.View.extend({
var explore = Engine({url: routes.explore.url}); var explore = Engine({url: routes.explore.url});
explore.register_input("request", app.models.query); explore.register_input("request", app.models.query);
app.listenTo( Backbone,"engine:explore", function(params){ app.listenTo( Backbone,"engine:explore", function(name, params){
app.models.query.reset_from_models(params)
if ( !explore.blocks.length) return;
console.log('engine:layout', name);
var comps = explore.blocks.at(0).components;
comps.each( function(e){ e.set('selected', false) } );
var comp = comps.get(name);
if (! comp) comp = comps.at(0);
comp.set('selected', true);
app.models.query.reset_from_models(params)
explore.play(); explore.play();
}); });
app.listenTo(explore, 'play:success', app.explore_reset); app.listenTo(explore, 'play:success', app.explore_reset);
app.engines.explore = explore; app.engines.explore = explore;
......
/*! 07-02-2019 */ /*! 09-02-2019 */
define(["underscore","backbone","mousetrap","cello","gviz","materials","moment","numeric","pdgconst"],function(a,b,c,d,e,f,g,h,i){function j(b,c,d){d&&d.length?d+=" ":d="",a.each(c,function(c){if(a.isString(c))y.push("\n"+c);else{var e=d+c[0];l(e,c[1],c[2],b)}})}function l(a,b,d,e){e=void 0===e?document:e,c().bind(a,d),y.push("'"+a+"' : "+b)}function m(a,c,d){var e=["# Graph edition",["e","edits selected node",function(){var a=c.vs.by_flag("selected");1==a.length&&b.trigger("edit:node",a[0])}]];j(a,e,d)}function n(a,c,d){var e=[["enter","Expands node relations",function(){var a=c.vs.by_flag("selected");if(1==a.length){var d={graph:c.id,expand:[a[0].id],weights:[]};b.trigger("engine:expand_prox",d)}}],["shift+enter","Explore",function(){var a=c.vs.by_flag("selected");if(1==a.length){var d={graph:c.id,query:a[0].id};b.trigger("engine:explore",d)}}],["backspace","Removes node from view",function(){var a=c.vs.by_flag("selected");1==a.length&&b.trigger(i.remove_node,a[0])}]];j(a,e,d)}function o(a,b){j(a.$el,z(a),b)}function p(){l("h","Displays help",function(){var a=y.join("\n");console.log(a)})}function q(a){return a.reduce(function(a,b){return a>b?a:b})}function r(a){return a.reduce(function(a,b){return a<b?a:b})}function s(a){a.id&&$("#img"+a.id).remove()}function t(a){if(a.id&&a.properties.get("image")){var b=a.properties.get("image");"svg"==b.substring(b.length-3)?$.ajax({url:b,dataType:"text",success:function(c){var d=new Image;d.onload=function(){var c=document.getElementById("gviz_imgs_cache_canvas");c.width=400,c.height=400,c.getContext("2d").drawImage(d,0,0,400,400),b=c.toDataURL("image/png"),$("#gviz_model_imgs").append("<img id='img"+a.id+"' src='"+b+"'/>")},d.src="data:image/svg+xml;charset=utf-8,"+c}}):$("#gviz_model_imgs").append("<img id='img"+a.id+"' src='"+b+"'/>")}}function u(a){a.id&&a.properties&&a.properties.changed&&a.properties.changed.image&&(s(a),t(a))}function v(a,b){var c=a.vs;if(c.length&&!(!b|!("results"in b)|!("layout"in b.results))){var d=b.results.layout.coords,e=[],f=[],g={},h=0;for(var i in d){var j=d[i];j.push(0),f.push(j.slice(0,3)),c.get(i).get("coords")?e.push(c.get(i).get("coords").slice(0,3)):e.push(j.slice(0,3)),g[i]=h,h++}Q_new=A.rotate_graph(e,f);for(var i in d){var k=c.get(i);k.set("coords",Q_new[g[i]])}var l=c.map(function(a){return a.degree()}),m=q(l),n=r(l);c.each(function(a){var b=a.degree();a.set("_size",m>n?(b-n)/(m-n):1)})}}var w=!0;d.DEBUG=w,w||(console.log=function(){});var x={};x.User=b.Model.extend({defaults:{username:"",logged:!1,login_url:"../account/login",logout_url:"../account/logout"},login:function(a){var c=this;$.ajax({url:this.get("login_url"),type:"POST",data:JSON.stringify(a),contentType:"application/json; charset=utf-8",dataType:"json",success:function(a){console.log("success",a),c.set(a),a.logged&&""!=a.username&&(b.trigger("user:logged_in",c.attributes),console.log("triggered",c.attributes))},error:function(){c.trigger("user:loginError")}})},logout:function(){var a=this;$.ajax({url:this.get("logout_url"),type:"POST",data:JSON.stringify({}),contentType:"application/json; charset=utf-8",dataType:"json",success:function(c){a.set(c),b.trigger("user:logged_out",a.attributes),console.log("triggered","user:logged_out",a.attributes)},error:function(){a.trigger("user:logoutError")}})}}),x.Cluster=d.Cluster.extend({initialize:function(a,b){var c=this;x.Cluster.__super__.initialize.apply(this,arguments),this.on("change:color",function(){c.members.vs.each(function(a){a.set("cl_color",c.color)})})},_unselect:function(){this.members.vs.each(function(a){a.remove_flag("cluster")});var b=this.collection.without(this);a(b).each(function(b){b.members.vs.each(function(b){b.remove_flag("cluster-faded"),a.each(b.incident(),function(a){a.remove_flag("es-cluster-faded")})})})}}),x.Vertex=d.Vertex.extend({classname:"Models.Vertex",defaults:{uuid:null,nodetype:null,properties:new b.Model,cl_color:[0,0,0],color:[0,0,0]},url:function(){return this.graph.url()+"/node"+(this.id?"/"+this.id:"")},star:function(){this.set_starred(!0)},unstar:function(){this.set_starred(!1)},set_starred:function(a){var b=this.url()+(a?"/star":"/unstar");$.ajax({url:b,type:"POST",data:JSON.stringify({start:0}),contentType:"application/json; charset=utf-8",dataType:"json",success:function(a){},error:function(){}})},format_label:function(a){var b=".form",c=this.label;return a&&(c=c.substring(0,a)),[{form:c,css:b}]},to_str:function(){return this.label},validate:function(a,b){var c=[];if(a.nodetype||c.push({field:"nodetype",header:"Nodetype",message:"a nodetype is required"}),Object.keys(a.properties.attributes).length||c.push({field:"properties",header:"Properties",message:"a node should have a property"}),c.length)return c},parse:function(a,c){return a.properties&&(a.properties=new b.Model(a.properties,{parse:!0})),a},get_properties:function(){var a=this,b={};return this.nodetype.get("properties").each(function(c){var d=c.get("name");"uuid"!=d&&(b[d]=a.properties.get(d))}),b},fetch_neighbors:function(a,b){var c=this,d=this.url();return this._neighbors?void b(this._neighbors):void $.ajax({url:d+"/neighbors",type:"POST",data:JSON.stringify({start:0,mode:this.mode}),contentType:"application/json; charset=utf-8",dataType:"json",success:function(a){var d={};if(a.neighbors){for(var e in a.neighbors){var f=a.neighbors[e],g=f[0].uuid;d[g]=f}var h=[];for(var i in d)h.push(d[i]);c._neighbors=h}b(c._neighbors)}})},toCard:function(){return{uuid:this.id,label:this.label,nodetype:this.nodetype.get("name")}},toJSON:function(a){return{uuid:this.get("uuid"),nodetype:this.get("nodetype"),properties:this.get_properties()}}},{active_flags:["intersected","faded","selected"]}),x.EdgeType=d.EdgeType.extend({parse_label:function(){var a=this.label,b={};return b.label=a,b.family=a.indexOf("/")>=0?a.substring(0,a.indexOf("/")):"",b.name=a.indexOf("/")>0?a.substring(a.indexOf("/")+1):a,b}}),x.Edge=d.Edge.extend({url:function(){return this.graph.url()+"/edge"+(this.id?"/"+this.id:"")},get_properties:function(){var a=this,b={};return this.edgetype.get("properties").each(function(c){var d=c.get("name");"uuid"!=d&&(b[d]=a.properties.get(d))}),b},validate:function(a,b){var c=[];if(a.source||c.push({field:"source",header:"Source",message:"a source is required"}),a.target||c.push({field:"target",header:"Target",message:"a target is required"}),a.edgetype||c.push({field:"edgetype",header:"Edgetype",message:"a edgetype is required"}),c.length)return c},parse:function(a,c){return a.properties&&(a.properties=new b.Model(a.properties,{parse:!0})),a},toJSON:function(a){return{uuid:this.id,edgetype:this.edgetype.id,source:this.get("source"),target:this.get("target"),properties:this.get_properties()}}},{active_flags:["intersected","faded","selected"]}),x.UuidEdgeListQuery=b.Model.extend({defaults:{graph:null},export_for_engine:function(){var b=a.map(this.get("graph").es.models,function(a){return a.get("uuid")});return{format:"uuid_edgelist",graph:this.get("graph").get("gid"),edgelist:b}}}),x.IndexEdgeListQuery=b.Model.extend({defaults:{graph:null},export_for_engine:function(){var b=this.get("graph"),c=a.chain(b.vs.models).filter(function(a){return 0==a.has_flag("disabled")}).map(function(a){return a.get("uuid")}).value(),d=a.chain(c).map(function(a,b){return[a,b]}).object().value(),e=a.chain(b.es.models).filter(function(a){return 0==a.has_flag("disabled")}).map(function(a,b){return[d[a.source.id],d[a.target.id]]}).value(),f=a.chain(b.es.models).filter(function(a){return 0==a.has_flag("disabled")}).map(function(a,b){var c=a.properties.get("weight",1);return c?parseFloat(c):1}).value();return{format:"index_edgelist",graph:this.get("graph").get("gid"),nodelist:c,edgelist:e,weights:f,directed:!0}}}),x.ExpandNodesQuery=b.Model.extend({defaults:{graph:null,nodes:[],expand:[],weights:[]},export_for_engine:function(){var b=a.map(this.get("graph").vs.models,function(a){return a.get("uuid")});return{graph:this.get("graph").get("gid"),nodes:b,expand:this.get("expand"),weights:this.get("weights")}}}),x.ClustersLabelsQuery=b.Model.extend({defaults:{graph:null,clustering:[]},export_for_engine:function(){var a=this.get("clustering"),b=a.clusters.models,c=b.map(function(a){var b=a.members.vs.models.map(function(a){return a.id});return b});return{graph:this.get("graph").get("gid"),clusters:c}}}),x.AdditiveNodesQuery=b.Model.extend({defaults:{graph:null,uuids:[]},export_for_engine:function(){var b=a.map(this.get("graph").vs.models,function(a){return a.get("uuid")});return{graph:this.get("graph").get("gid"),nodes:b,add:this.get("uuids")}}}),x.QueryUnit=b.Model.extend({defaults:{query:"",valid:!1},initialize:function(a,b){this.on("change",this.validate)},set_from_str:function(a){this.set("query",a)},to_string:function(){return this.get("query")},toJSON:function(){return{query:this.get("query")}},validate:function(){}}),QueryUnits=b.Collection.extend({model:x.QueryUnit,graph:"",reset_from_models:function(b){a.isArray(b)===!1&&(b=[b]);var c=[],d=this.model;a.each(b,function(b){attrs=a.pick(b,"query");var e=new d(attrs);c.push(e)}),this.reset(c)},reset_from_str:function(b){console.log("query : "+b);var c=this.model,d=[],e=b.split(",");a.each(e,function(a){var b=new c;b.set_from_str(a),d.push(b)}),this.reset(d)},reset_random:function(){var a=this,b=this.model;$.ajax({url:this.random_url,dataType:"json",success:function(c){var d=new b(c);a.reset_from_models([d])}})},to_string:function(){return this.models.map(function(a){return a.to_string()}).join("; ")},validate:function(){return this.length>0},export_for_engine:function(){return{graph:this.graph,units:this.toJSON()}}});var y=[],z=function(a){return["* Labels ",["l","toggles node/edge label display",function(){a.show_text=!a.show_text,a.renderer.DISPLAY_EDGE_LABEL=!a.renderer.DISPLAY_EDGE_LABEL,a.request_animation()}],["+","increase vertex size",function(){a.increase_vertex_size()}],["-","decrease vertex size",function(){a.decrease_vertex_size()}],[",","increase font label size",function(){a.user_font_size=Math.min(25,a.user_font_size+1),a.request_animation()}],[";","decrease font label size",function(){a.user_font_size=Math.max(-5,a.user_font_size-1),a.request_animation()}],"* Nodes/edges ",["n","toggle node display",function(){a.show_nodes=!a.show_nodes,a.request_animation()}],["e","toggle edge display",function(){a.show_edges=!a.show_edges,a.request_animation()}],["i","toggle node image display",function(){a.show_images=!a.show_images,a.request_animation(),console.log("toggle image display",a.show_images)}],"* Rendering ",["r","toggles autorotate",function(){a.controls.AUTO_ROTATE=!a.controls.AUTO_ROTATE,a.request_animation()}],["d","increases autorotate speed",function(){a.controls.autoRotateSpeed=1.5*a.controls.autoRotateSpeed}],["s","decreases autorotate speed",function(){a.controls.autoRotateSpeed=a.controls.autoRotateSpeed/1.5}],["e","toggle end arrow display",function(){a.renderer.DISPLAY_EDGE=!a.renderer.DISPLAY_EDGE,a.request_animation()}],["a","toggle init arrows display",function(){a.DISPLAY_ARROW_END=!a.DISPLAY_ARROW_END,a.DISPLAY_ARROW_INIT=!a.DISPLAY_ARROW_INIT,a.request_animation()}],["f","toggle fog display",function(){a.ENABLE_FOG=!a.ENABLE_FOG,a.request_animation()}],["w","toggle coords transition",function(){a.changeCoordSpeed=a.changeCoordSpeed>10?10:500}]]},A={rotate_graph:function(a,b){try{var c=numeric.dot(numeric.transpose(a),b),d=numeric.svd(c),e=numeric.transpose(d.U),f=d.V,g=numeric.det(numeric.dot(f,e)),h=(0!=g)*(1-2*(g<0));h=1;var i=[[1,0,0],[0,1,0],[0,0,h]],j=numeric.dot(numeric.dot(f,i),e),k=numeric.dot(b,j);numeric.norm2(numeric.sub(a,b)),numeric.norm2(numeric.sub(a,k));return k}catch(a){return console.log("rotate_graph",a),b}}},B={};return B.Models=x,B.Base=b.View.extend({DEBUG:!1,initialize:function(b){this.DEBUG=b.debug||this.DEBUG,this.root_url=b.root_url||"/";var c=function(b){return b&&a.isString(b)?{url:b}:"url"in b?b:null};this.routes={};for(k in b.routes)this.routes[k]=c(b.routes[k]);this.complete_url=this.routes.complete_url,this.login_url=b.login_url,this.logout_url=b.logout_url,this.random_url=b.random_url,this.fullscreen=!1,this.$el=void 0===b.$el?document:b.$el,this.ALLOW_AUTO_COMPUTE=!0,this._auto_compute_delay=!1,this.Models=x,this.models=a.clone({}),this.engines=a.clone({})},create_user_model:function(){var a=this,c=new x.User;c.listenTo(b,"user:logout",c.logout),c.listenTo(b,"user:login",c.login),a.models.user=c},create_query_model:function(){var a=this;a.models.query=new QueryUnits([],{})},create_graph_model:function(c){var e=this;c=a.extend({vertex_model:x.Vertex,edge_model:x.Edge,edgetype_model:x.EdgeType},c?c:{});var f=new d.Graph(c);e.models.graph=f,e.listenTo(f.es,"remove",a.bind(e.auto_compute,e)),e.listenTo(f.vs,"add",e.auto_compute,e),e.listenTo(f.vs,"add",t),e.listenTo(f.vs,"change",u),e.listenTo(f.vs,"remove",function(a){s(a),f.vs.set_selected([])}),e.listenTo(b,i.unselect_nodes,function(){f.vs.set_selected([])}),e.listenTo(b,i.unselect_edges,function(){f.es.set_selected([])}),e.listenTo(b,i.select_node,function(a){a.id&&f.vs.get(a.id)&&(b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges),f.vs.set_selected(a))}),e.listenTo(b,i.select_edge,function(a,c){b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges)}),e.listenTo(b,i.remove_all,function(){e.set_auto_compute(!1),f.vs.set([]),f.es.set([]),e.set_auto_compute(!0)}),e.listenTo(b,i.remove_node,function(a){e.set_auto_compute(!1),a&&(f.vs.set_selected([]),f.vs.remove(a)),e.set_auto_compute(!0),e.trigger("engine:auto_compute",e.models.graph)}),e.listenTo(b,i.remove_edge,function(a){e.set_auto_compute(!1),a&&(f.es.set_selected([]),f.es.remove(a)),e.set_auto_compute(!0),e.trigger("engine:auto_compute",e.models.graph)}),this.listenTo(b,"request-graph-clear",function(a){b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges),e.set_auto_compute(!1),f.vs.set([]),e.set_auto_compute(!0)})},create_clustering_model:function(){var a=this;a.models.clustering=new d.Clustering({ClusterModel:x.Cluster,color_saturation:71,color_value:80})},create_engines:function(){var c=this,e=c.routes,f=function(a){var e=new d.Engine(a);return c.listenTo(e,"play:loading",function(){b.trigger("play:loading",e)}),c.listenTo(e,"play:error",function(){b.trigger("play:complete",e)}),c.listenTo(e,"play:success",function(){b.trigger("play:complete",e)}),e};if(e.explore){var g=f({url:e.explore.url});g.register_input("request",c.models.query),c.listenTo(b,"engine:explore",function(a){c.models.query.reset_from_models(a),g.play()}),c.listenTo(g,"play:success",c.explore_reset),c.engines.explore=g}if(e.starred){var h=f({url:e.starred.url});h.register_input("request",c.models.query),c.listenTo(b,"engine:starred",function(a){c.models.query.reset_from_models(a),h.play()}),c.listenTo(h,"play:success",c.explore_reset),c.engines.starred=h}if(e.additive_nodes){var i=new x.AdditiveNodesQuery({graph:c.models.graph});c.engines.additive_nodes=f({url:e.additive_nodes.url}),c.engines.additive_nodes.register_input("request",i),c.listenTo(b,"engine:additive_nodes",c.additive_nodes),c.listenTo(c.engines.additive_nodes,"play:success",c.merge_graph)}if(e.expand_px){var j=new x.ExpandNodesQuery({graph:c.models.graph});c.engines.expand_prox=f({url:e.expand_px.url}),c.engines.expand_prox.register_input("request",j),c.listenTo(b,"engine:expand_prox",function(a){console.log("engine:expand_prox",a),j.set("expand",a.expand),j.set("weights",a.weights),c.engines.expand_prox.play()}),c.listenTo(c.engines.expand_prox,"play:success",c.expand_graph)}if(e.layout){var k=f({url:e.layout.url});k.register_input("request",new x.IndexEdgeListQuery({graph:c.models.graph})),c.on("engine:layout",function(a){if(k.blocks.length){console.log("engine:layout",a);var b=k.blocks.at(0).components;b.each(function(a){a.set("selected",!1)});var c=b.get(a);c||(c=b.at(0)),c.set("selected",!0),k.play()}});var l=(c.models.graph,function(a,c,d){v(c,d),a._additive_nodes_delayed=!1,b.trigger("engine:request_animation")});c.listenTo(k,"play:success",a.partial(l,c,c.models.graph)),c.engines.layout=k}if(e.clustering){var m=f({url:e.clustering.url});m.register_input("request",new x.IndexEdgeListQuery({graph:c.models.graph})),c.on("engine:clustering",function(a){console.log("engine:clustering",a);var b=m.blocks;if(b.length){var c=b.at(0).components;c.each(function(a){a.set("selected",!1)});var d=c.get(a);d||(d=c.at(0)),d.set("selected",!0),m.play()}}),c.listenTo(m,"play:success",c.apply_clustering),c.engines.clustering=m}for(var n in e)if(!c.engines[n]){var o=f({url:e[n].url});c.engines[n]=o}c.listenTo(b,"play:error",c.engine_play_error),c.on("engine:auto_compute",c.auto_compute)},fetch_engines:function(b){var c=this,d={complete:b,count:a.size(c.engines)},e=function(a){if(d.count-=1,console.log(" engine_fetched ",d.count),0==d.count)if(d.complete)d.complete(c);else{var b=new Event("app_engines_fetched",{bubbles:!0,cancelable:!1});document.dispatchEvent(b)}};c.engines.layout&&c.engines.layout.fetch({success:function(b,d,f,g){if(a.size(d.blocks)){var h=d.blocks.at(0),i=h.components.models,k=[],l=["# Layouts"],m=0;for(var n in i){m++;var o=""+m,p=i[n].id+"|";p=p.substring(0,p.indexOf("|"));var q=""+i[n].id,r=function(a){return function(){c.trigger("engine:layout",a)}};l.push([o,p,r(q)]),k.push({name:p,value:q,model:i[n]})}j(this.$el,l,"!"),c.setLayouts(k),e()}}}),c.engines.clustering&&c.engines.clustering.fetch({success:function(b,d,f,g){if(a.size(d.blocks)){var h=d.blocks.at(0),i=h.components.models,k=[],l=["# Community detection"],m=0;for(var n in i){m++;var o=""+m,p=i[n].id+"|";p=p.substring(0,p.indexOf("|"));var q=i[n].id,r=function(a){return function(){c.trigger("engine:clustering",a)}};l.push([o,p,r(q)]),k.push({name:p,value:q,model:i[n]})}j(this.$el,l,":"),c.setClusterings(k),e()}}});for(var f in c.engines)console.log(" FETCH ENGINES "+f),"clustering"!=f&&"layout"!=f&&c.engines[f].fetch({success:e})},auto_compute:function(){if(this.ALLOW_AUTO_COMPUTE&&!this._auto_compute_delay){var a=this.models.graph;a&&a.vs&&a.vs.length&&(this.engines.clustering&&this.engines.clustering.play(),this.engines.layout&&this.engines.layout.play())}},noop:function(){},additive_nodes:function(b,c){if(this._additive_nodes_uuids=a.union(this._additive_nodes_uuids,b),!this._additive_nodes_delay){this._additive_nodes_delayed=!0;var d=this.engines.additive_nodes;console.log("engine:additive_nodes",this._additive_nodes_uuids,c),d.input_models.request.set("uuids",this._additive_nodes_uuids),d.play(c),this._additive_nodes_uuids=[]}},explore_reset:function(a){b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges);var c=this;c.response=a,console.log("explore_reset",a.results),c.set_auto_compute(!1),a.results.graph&&(c.models.graph.reset(a.results.graph),c.models.graph.set("gid",a.results.graph.properties.name),c.models.graph.vs.each(function(a){a.add_flag("form")})),c.set_auto_compute(!0),c.auto_compute()},expand_graph:function(c){if(console.log("expand_graph",c.results),!(!c|!("results"in c))){var d=this.models.graph,e=[],f=a.pairs(c.results.scores);f.sort(function(a,b){return a[1]<b[1]?1:-1});for(var g in f){var h=f[g][0],i=f[g][1];if(null==d.vs.get(h)){if(e.length>=10&&i<1)break;console.log("expand_graph adding vertex : "+h,i),e.push(h)}}e.length&&b.trigger("engine:additive_nodes",e)}},clusters_labels:function(a,b){this.models.clustering.set_labels(a.results,b)},merge_graph:function(a,b){!a|!("results"in a)|!("graph"in a.results)||(this.set_auto_compute(!1),b||(b={}),b&&b.reset?this.models.graph.reset(a.results.graph):this.models.graph.merge(a.results.graph),this.models.graph.vs.each(function(a){a.add_flag("form")}),b.callback&&b.callback(),this.set_auto_compute(!0),this.auto_compute())},apply_clustering:function(c){if(!c|!("results"in c)|!("clusters"in c.results))return void b.trigger("engine:error",{message:"No response or no results in response",response:c});this.models.clustering.reset(c.results.clusters,{members:{vs:{source:this.models.graph.vs,id_field:"vids"}}}),this.models.clustering.clusters.each(function(a){a.listenTo(b,"unselect_clusters",function(){a.remove_flag("selected")})});for(var d in this.models.clustering.clusters.models){var e=this.models.clustering.clusters.at(d),f=e.members.vs.models,g="000"+d,h=g.substring(g.length-3)+"/"+(e.misc?"0":"1");a.each(f,function(a){a.set("_sort_by_cluster",h+"/"+a.label)})}b.trigger("engine:request_animation")},set_auto_compute:function(a){this.ALLOW_AUTO_COMPUTE=a},search_loading:function(a,b){},engine_play_error:function(b,c){var d=this;if(console.log("play:error","response",b),$("#loading-indicator").hide(0),d.DEBUG){d.response=b,d.xhr=c;var e;a.isEmpty(b)?(e=$(c.responseText),$("body").css("margin","0")):e=b.meta.errors.join("<br />"),$("body").after(e)}},set_viz:function(c){var d=this,e=d.models.graph;this.listenTo(b,i.select_node,function(b){if(d.AUTO_FOCUS){var e=a.pick(c.wnidx[b.id].position,"x","y","z");c.setFocus(e)}c.request_animation()}),this.listenTo(b,i.select_edge,function(a,b){a&&e.es.set_selected(a),c.setFocus()}),this.listenTo(e,"change:gid",function(){c.collapse()}),p(),o(c,""),n(this.$el,this.models.graph,""),m(this.$el,this.models.graph,""),c.animate()},install_listeners:function(){}}),B.Iframe=B.Base.extend({initialize:function(a,b){B.Iframe.__super__.initialize.apply(this,arguments)},setClusterings:function(a){this.clusterings=a},setLayouts:function(a){this.layouts=a}}),B.Simple=B.Base.extend({initialize:function(a,b){B.Simple.__super__.initialize.apply(this,arguments)},setClusterings:function(a){var b=$("padagraph-app-menu")[0],c=$("padagraph-controls")[0];b.clusterings=a,c.clusterings=a,this.clusterings=a},setLayouts:function(a){var b=$("padagraph-app-menu")[0],c=$("padagraph-controls")[0];b.layouts=a,c.layouts=a,this.layouts=a},create_models:function(){this.create_graph_model(),this.create_clustering_model(),this.create_query_model(),this.create_user_model()},start:function(){var a=this,c=a.models.graph;a.listenTo(c,"change:gid",function(){$("padagraph-graph-button")[0].graphname=c.id});var e=$("padagraph-app-menu")[0];e.themes=Object.keys(THEMES),e.graph=c,e.app=a;var f=$("padagraph-controls")[0];f.themes=Object.keys(THEMES),f.app=a,f.gviz=k,f.graph=c,f.setupUI();var g=$("padagraph-create")[0];g.graph=c,g.nodetype_model=c.nodetype_model,g.edgetype_model=c.edgetype_model,g.vertex_model=c.vertex_model,g.edge_model=c.edge_model;var h=$("padagraph-edits")[0];h.graph=c;var i=$("padagraph-messages")[0];i.graph=c,$("padagraph-node-search")[0].graph=c,$("padagraph-notifications")[0].setGraphModel(c),$("#newNodeType").click(function(){b.trigger("edit:nodetype",!1)}),initUI(),this.setFullscreen=function(a){this.fullscreen=a,setFullscreen(a)},this.setTheme=setTheme;var j=$("padagraph-gviz")[0],k=j.gviz;a.set_viz(k),this.gviz=j,window._app=this,window.Cello=d,window.Models=x,console.warn=function(){}}}),B}); define(["underscore","backbone","mousetrap","cello","gviz","materials","moment","numeric","pdgconst"],function(a,b,c,d,e,f,g,h,i){function j(b,c,d){d&&d.length?d+=" ":d="",a.each(c,function(c){if(a.isString(c))y.push("\n"+c);else{var e=d+c[0];l(e,c[1],c[2],b)}})}function l(a,b,d,e){e=void 0===e?document:e,c().bind(a,d),y.push("'"+a+"' : "+b)}function m(a,c,d){var e=["# Graph edition",["e","edits selected node",function(){var a=c.vs.by_flag("selected");1==a.length&&b.trigger("edit:node",a[0])}]];j(a,e,d)}function n(a,c,d){var e=[["enter","Expands node relations",function(){var a=c.vs.by_flag("selected");if(1==a.length){var d={graph:c.id,expand:[a[0].id],weights:[]};b.trigger("engine:expand_prox",d)}}],["shift+enter","Explore",function(){var a=c.vs.by_flag("selected");if(1==a.length){var d={graph:c.id,query:a[0].id};b.trigger("engine:explore",d)}}],["backspace","Removes node from view",function(){var a=c.vs.by_flag("selected");1==a.length&&b.trigger(i.remove_node,a[0])}]];j(a,e,d)}function o(a,b){j(a.$el,z(a),b)}function p(){l("h","Displays help",function(){var a=y.join("\n");console.log(a)})}function q(a){return a.reduce(function(a,b){return a>b?a:b})}function r(a){return a.reduce(function(a,b){return a<b?a:b})}function s(a){a.id&&$("#img"+a.id).remove()}function t(a){if(a.id&&a.properties.get("image")){var b=a.properties.get("image");"svg"==b.substring(b.length-3)?$.ajax({url:b,dataType:"text",success:function(c){var d=new Image;d.onload=function(){var c=document.getElementById("gviz_imgs_cache_canvas");c.width=400,c.height=400,c.getContext("2d").drawImage(d,0,0,400,400),b=c.toDataURL("image/png"),$("#gviz_model_imgs").append("<img id='img"+a.id+"' src='"+b+"'/>")},d.src="data:image/svg+xml;charset=utf-8,"+c}}):$("#gviz_model_imgs").append("<img id='img"+a.id+"' src='"+b+"'/>")}}function u(a){a.id&&a.properties&&a.properties.changed&&a.properties.changed.image&&(s(a),t(a))}function v(a,b){var c=a.vs;if(c.length&&!(!b|!("results"in b)|!("layout"in b.results))){var d=b.results.layout.coords,e=[],f=[],g={},h=0;for(var i in d){var j=d[i];j.push(0),f.push(j.slice(0,3)),c.get(i).get("coords")?e.push(c.get(i).get("coords").slice(0,3)):e.push(j.slice(0,3)),g[i]=h,h++}Q_new=A.rotate_graph(e,f);for(var i in d){var k=c.get(i);k.set("coords",Q_new[g[i]])}var l=c.map(function(a){return a.degree()}),m=q(l),n=r(l);c.each(function(a){var b=a.degree();a.set("_size",m>n?(b-n)/(m-n):1)})}}var w=!0;d.DEBUG=w,w||(console.log=function(){});var x={};x.User=b.Model.extend({defaults:{username:"",logged:!1,login_url:"../account/login",logout_url:"../account/logout"},login:function(a){var c=this;$.ajax({url:this.get("login_url"),type:"POST",data:JSON.stringify(a),contentType:"application/json; charset=utf-8",dataType:"json",success:function(a){console.log("success",a),c.set(a),a.logged&&""!=a.username&&(b.trigger("user:logged_in",c.attributes),console.log("triggered",c.attributes))},error:function(){c.trigger("user:loginError")}})},logout:function(){var a=this;$.ajax({url:this.get("logout_url"),type:"POST",data:JSON.stringify({}),contentType:"application/json; charset=utf-8",dataType:"json",success:function(c){a.set(c),b.trigger("user:logged_out",a.attributes),console.log("triggered","user:logged_out",a.attributes)},error:function(){a.trigger("user:logoutError")}})}}),x.Cluster=d.Cluster.extend({initialize:function(a,b){var c=this;x.Cluster.__super__.initialize.apply(this,arguments),this.on("change:color",function(){c.members.vs.each(function(a){a.set("cl_color",c.color)})})},_unselect:function(){this.members.vs.each(function(a){a.remove_flag("cluster")});var b=this.collection.without(this);a(b).each(function(b){b.members.vs.each(function(b){b.remove_flag("cluster-faded"),a.each(b.incident(),function(a){a.remove_flag("es-cluster-faded")})})})}}),x.Vertex=d.Vertex.extend({classname:"Models.Vertex",defaults:{uuid:null,nodetype:null,properties:new b.Model,cl_color:[0,0,0],color:[0,0,0]},url:function(){return this.graph.url()+"/node"+(this.id?"/"+this.id:"")},star:function(){this.set_starred(!0)},unstar:function(){this.set_starred(!1)},set_starred:function(a){var b=this.url()+(a?"/star":"/unstar");$.ajax({url:b,type:"POST",data:JSON.stringify({start:0}),contentType:"application/json; charset=utf-8",dataType:"json",success:function(a){},error:function(){}})},format_label:function(a){var b=".form",c=this.label;return a&&(c=c.substring(0,a)),[{form:c,css:b}]},to_str:function(){return this.label},validate:function(a,b){var c=[];if(a.nodetype||c.push({field:"nodetype",header:"Nodetype",message:"a nodetype is required"}),Object.keys(a.properties.attributes).length||c.push({field:"properties",header:"Properties",message:"a node should have a property"}),c.length)return c},parse:function(a,c){return a.properties&&(a.properties=new b.Model(a.properties,{parse:!0})),a},get_properties:function(){var a=this,b={};return this.nodetype.get("properties").each(function(c){var d=c.get("name");"uuid"!=d&&(b[d]=a.properties.get(d))}),b},fetch_neighbors:function(a,b){var c=this,d=this.url();return this._neighbors?void b(this._neighbors):void $.ajax({url:d+"/neighbors",type:"POST",data:JSON.stringify({start:0,mode:this.mode}),contentType:"application/json; charset=utf-8",dataType:"json",success:function(a){var d={};if(a.neighbors){for(var e in a.neighbors){var f=a.neighbors[e],g=f[0].uuid;d[g]=f}var h=[];for(var i in d)h.push(d[i]);c._neighbors=h}b(c._neighbors)}})},toCard:function(){return{uuid:this.id,label:this.label,nodetype:this.nodetype.get("name")}},toJSON:function(a){return{uuid:this.get("uuid"),nodetype:this.get("nodetype"),properties:this.get_properties()}}},{active_flags:["intersected","faded","selected"]}),x.EdgeType=d.EdgeType.extend({parse_label:function(){var a=this.label,b={};return b.label=a,b.family=a.indexOf("/")>=0?a.substring(0,a.indexOf("/")):"",b.name=a.indexOf("/")>0?a.substring(a.indexOf("/")+1):a,b}}),x.Edge=d.Edge.extend({url:function(){return this.graph.url()+"/edge"+(this.id?"/"+this.id:"")},get_properties:function(){var a=this,b={};return this.edgetype.get("properties").each(function(c){var d=c.get("name");"uuid"!=d&&(b[d]=a.properties.get(d))}),b},validate:function(a,b){var c=[];if(a.source||c.push({field:"source",header:"Source",message:"a source is required"}),a.target||c.push({field:"target",header:"Target",message:"a target is required"}),a.edgetype||c.push({field:"edgetype",header:"Edgetype",message:"a edgetype is required"}),c.length)return c},parse:function(a,c){return a.properties&&(a.properties=new b.Model(a.properties,{parse:!0})),a},toJSON:function(a){return{uuid:this.id,edgetype:this.edgetype.id,source:this.get("source"),target:this.get("target"),properties:this.get_properties()}}},{active_flags:["intersected","faded","selected"]}),x.UuidEdgeListQuery=b.Model.extend({defaults:{graph:null},export_for_engine:function(){var b=a.map(this.get("graph").es.models,function(a){return a.get("uuid")});return{format:"uuid_edgelist",graph:this.get("graph").get("gid"),edgelist:b}}}),x.IndexEdgeListQuery=b.Model.extend({defaults:{graph:null},export_for_engine:function(){var b=this.get("graph"),c=a.chain(b.vs.models).filter(function(a){return 0==a.has_flag("disabled")}).map(function(a){return a.get("uuid")}).value(),d=a.chain(c).map(function(a,b){return[a,b]}).object().value(),e=a.chain(b.es.models).filter(function(a){return 0==a.has_flag("disabled")}).map(function(a,b){return[d[a.source.id],d[a.target.id]]}).value(),f=a.chain(b.es.models).filter(function(a){return 0==a.has_flag("disabled")}).map(function(a,b){var c=a.properties.get("weight",1);return c?parseFloat(c):1}).value();return{format:"index_edgelist",graph:this.get("graph").get("gid"),nodelist:c,edgelist:e,weights:f,directed:!0}}}),x.ExpandNodesQuery=b.Model.extend({defaults:{graph:null,nodes:[],expand:[],weights:[]},export_for_engine:function(){var b=a.map(this.get("graph").vs.models,function(a){return a.get("uuid")});return{graph:this.get("graph").get("gid"),nodes:b,expand:this.get("expand"),weights:this.get("weights")}}}),x.ClustersLabelsQuery=b.Model.extend({defaults:{graph:null,clustering:[]},export_for_engine:function(){var a=this.get("clustering"),b=a.clusters.models,c=b.map(function(a){var b=a.members.vs.models.map(function(a){return a.id});return b});return{graph:this.get("graph").get("gid"),clusters:c}}}),x.AdditiveNodesQuery=b.Model.extend({defaults:{graph:null,uuids:[]},export_for_engine:function(){var b=a.map(this.get("graph").vs.models,function(a){return a.get("uuid")});return{graph:this.get("graph").get("gid"),nodes:b,add:this.get("uuids")}}}),x.QueryUnit=b.Model.extend({defaults:{query:"",valid:!1},initialize:function(a,b){this.on("change",this.validate)},set_from_str:function(a){this.set("query",a)},to_string:function(){return this.get("query")},toJSON:function(){return{query:this.get("query")}},validate:function(){}}),QueryUnits=b.Collection.extend({model:x.QueryUnit,graph:"",reset_from_models:function(b){a.isArray(b)===!1&&(b=[b]);var c=[],d=this.model;a.each(b,function(b){attrs=a.pick(b,"query");var e=new d(attrs);c.push(e)}),this.reset(c)},reset_from_str:function(b){console.log("query : "+b);var c=this.model,d=[],e=b.split(",");a.each(e,function(a){var b=new c;b.set_from_str(a),d.push(b)}),this.reset(d)},reset_random:function(){var a=this,b=this.model;$.ajax({url:this.random_url,dataType:"json",success:function(c){var d=new b(c);a.reset_from_models([d])}})},to_string:function(){return this.models.map(function(a){return a.to_string()}).join("; ")},validate:function(){return this.length>0},export_for_engine:function(){return{graph:this.graph,units:this.toJSON()}}});var y=[],z=function(a){return["* Labels ",["l","toggles node/edge label display",function(){a.show_text=!a.show_text,a.renderer.DISPLAY_EDGE_LABEL=!a.renderer.DISPLAY_EDGE_LABEL,a.request_animation()}],["+","increase vertex size",function(){a.increase_vertex_size()}],["-","decrease vertex size",function(){a.decrease_vertex_size()}],[",","increase font label size",function(){a.user_font_size=Math.min(25,a.user_font_size+1),a.request_animation()}],[";","decrease font label size",function(){a.user_font_size=Math.max(-5,a.user_font_size-1),a.request_animation()}],"* Nodes/edges ",["n","toggle node display",function(){a.show_nodes=!a.show_nodes,a.request_animation()}],["e","toggle edge display",function(){a.show_edges=!a.show_edges,a.request_animation()}],["i","toggle node image display",function(){a.show_images=!a.show_images,a.request_animation(),console.log("toggle image display",a.show_images)}],"* Rendering ",["r","toggles autorotate",function(){a.controls.AUTO_ROTATE=!a.controls.AUTO_ROTATE,a.request_animation()}],["d","increases autorotate speed",function(){a.controls.autoRotateSpeed=1.5*a.controls.autoRotateSpeed}],["s","decreases autorotate speed",function(){a.controls.autoRotateSpeed=a.controls.autoRotateSpeed/1.5}],["e","toggle end arrow display",function(){a.renderer.DISPLAY_EDGE=!a.renderer.DISPLAY_EDGE,a.request_animation()}],["a","toggle init arrows display",function(){a.DISPLAY_ARROW_END=!a.DISPLAY_ARROW_END,a.DISPLAY_ARROW_INIT=!a.DISPLAY_ARROW_INIT,a.request_animation()}],["f","toggle fog display",function(){a.ENABLE_FOG=!a.ENABLE_FOG,a.request_animation()}],["w","toggle coords transition",function(){a.changeCoordSpeed=a.changeCoordSpeed>10?10:500}]]},A={rotate_graph:function(a,b){try{var c=numeric.dot(numeric.transpose(a),b),d=numeric.svd(c),e=numeric.transpose(d.U),f=d.V,g=numeric.det(numeric.dot(f,e)),h=(0!=g)*(1-2*(g<0));h=1;var i=[[1,0,0],[0,1,0],[0,0,h]],j=numeric.dot(numeric.dot(f,i),e),k=numeric.dot(b,j);numeric.norm2(numeric.sub(a,b)),numeric.norm2(numeric.sub(a,k));return k}catch(a){return console.log("rotate_graph",a),b}}},B={};return B.Models=x,B.Base=b.View.extend({DEBUG:!1,initialize:function(b){this.DEBUG=b.debug||this.DEBUG,this.root_url=b.root_url||"/";var c=function(b){return b&&a.isString(b)?{url:b}:"url"in b?b:null};this.routes={};for(k in b.routes)this.routes[k]=c(b.routes[k]);this.complete_url=this.routes.complete_url,this.login_url=b.login_url,this.logout_url=b.logout_url,this.random_url=b.random_url,this.fullscreen=!1,this.$el=void 0===b.$el?document:b.$el,this.ALLOW_AUTO_COMPUTE=!0,this._auto_compute_delay=!1,this.Models=x,this.models=a.clone({}),this.engines=a.clone({})},create_user_model:function(){var a=this,c=new x.User;c.listenTo(b,"user:logout",c.logout),c.listenTo(b,"user:login",c.login),a.models.user=c},create_query_model:function(){var a=this;a.models.query=new QueryUnits([],{})},create_graph_model:function(c){var e=this;c=a.extend({vertex_model:x.Vertex,edge_model:x.Edge,edgetype_model:x.EdgeType},c?c:{});var f=new d.Graph(c);e.models.graph=f,e.listenTo(f.es,"remove",a.bind(e.auto_compute,e)),e.listenTo(f.vs,"add",e.auto_compute,e),e.listenTo(f.vs,"add",t),e.listenTo(f.vs,"change",u),e.listenTo(f.vs,"remove",function(a){s(a),f.vs.set_selected([])}),e.listenTo(b,i.unselect_nodes,function(){f.vs.set_selected([])}),e.listenTo(b,i.unselect_edges,function(){f.es.set_selected([])}),e.listenTo(b,i.select_node,function(a){a.id&&f.vs.get(a.id)&&(b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges),f.vs.set_selected(a))}),e.listenTo(b,i.select_edge,function(a,c){b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges)}),e.listenTo(b,i.remove_all,function(){e.set_auto_compute(!1),f.vs.set([]),f.es.set([]),e.set_auto_compute(!0)}),e.listenTo(b,i.remove_node,function(a){e.set_auto_compute(!1),a&&(f.vs.set_selected([]),f.vs.remove(a)),e.set_auto_compute(!0),e.trigger("engine:auto_compute",e.models.graph)}),e.listenTo(b,i.remove_edge,function(a){e.set_auto_compute(!1),a&&(f.es.set_selected([]),f.es.remove(a)),e.set_auto_compute(!0),e.trigger("engine:auto_compute",e.models.graph)}),this.listenTo(b,"request-graph-clear",function(a){b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges),e.set_auto_compute(!1),f.vs.set([]),e.set_auto_compute(!0)})},create_clustering_model:function(){var a=this;a.models.clustering=new d.Clustering({ClusterModel:x.Cluster,color_saturation:71,color_value:80})},create_engines:function(){var c=this,e=c.routes,f=function(a){var e=new d.Engine(a);return c.listenTo(e,"play:loading",function(){b.trigger("play:loading",e)}),c.listenTo(e,"play:error",function(){b.trigger("play:complete",e)}),c.listenTo(e,"play:success",function(){b.trigger("play:complete",e)}),e};if(e.explore){var g=f({url:e.explore.url});g.register_input("request",c.models.query),c.listenTo(b,"engine:explore",function(a,b){if(g.blocks.length){console.log("engine:layout",a);var d=g.blocks.at(0).components;d.each(function(a){a.set("selected",!1)});var e=d.get(a);e||(e=d.at(0)),e.set("selected",!0),c.models.query.reset_from_models(b),g.play()}}),c.listenTo(g,"play:success",c.explore_reset),c.engines.explore=g}if(e.starred){var h=f({url:e.starred.url});h.register_input("request",c.models.query),c.listenTo(b,"engine:starred",function(a){c.models.query.reset_from_models(a),h.play()}),c.listenTo(h,"play:success",c.explore_reset),c.engines.starred=h}if(e.additive_nodes){var i=new x.AdditiveNodesQuery({graph:c.models.graph});c.engines.additive_nodes=f({url:e.additive_nodes.url}),c.engines.additive_nodes.register_input("request",i),c.listenTo(b,"engine:additive_nodes",c.additive_nodes),c.listenTo(c.engines.additive_nodes,"play:success",c.merge_graph)}if(e.expand_px){var j=new x.ExpandNodesQuery({graph:c.models.graph});c.engines.expand_prox=f({url:e.expand_px.url}),c.engines.expand_prox.register_input("request",j),c.listenTo(b,"engine:expand_prox",function(a){console.log("engine:expand_prox",a),j.set("expand",a.expand),j.set("weights",a.weights),c.engines.expand_prox.play()}),c.listenTo(c.engines.expand_prox,"play:success",c.expand_graph)}if(e.layout){var k=f({url:e.layout.url});k.register_input("request",new x.IndexEdgeListQuery({graph:c.models.graph})),c.on("engine:layout",function(a){if(k.blocks.length){console.log("engine:layout",a);var b=k.blocks.at(0).components;b.each(function(a){a.set("selected",!1)});var c=b.get(a);c||(c=b.at(0)),c.set("selected",!0),k.play()}});var l=(c.models.graph,function(a,c,d){v(c,d),a._additive_nodes_delayed=!1,b.trigger("engine:request_animation")});c.listenTo(k,"play:success",a.partial(l,c,c.models.graph)),c.engines.layout=k}if(e.clustering){var m=f({url:e.clustering.url});m.register_input("request",new x.IndexEdgeListQuery({graph:c.models.graph})),c.on("engine:clustering",function(a){console.log("engine:clustering",a);var b=m.blocks;if(b.length){var c=b.at(0).components;c.each(function(a){a.set("selected",!1)});var d=c.get(a);d||(d=c.at(0)),d.set("selected",!0),m.play()}}),c.listenTo(m,"play:success",c.apply_clustering),c.engines.clustering=m}for(var n in e)if(!c.engines[n]){var o=f({url:e[n].url});c.engines[n]=o}c.listenTo(b,"play:error",c.engine_play_error),c.on("engine:auto_compute",c.auto_compute)},fetch_engines:function(b){var c=this,d={complete:b,count:a.size(c.engines)},e=function(a){if(d.count-=1,console.log(" engine_fetched ",d.count),0==d.count)if(d.complete)d.complete(c);else{var b=new Event("app_engines_fetched",{bubbles:!0,cancelable:!1});document.dispatchEvent(b)}};c.engines.layout&&c.engines.layout.fetch({success:function(b,d,f,g){if(a.size(d.blocks)){var h=d.blocks.at(0),i=h.components.models,k=[],l=["# Layouts"],m=0;for(var n in i){m++;var o=""+m,p=i[n].id+"|";p=p.substring(0,p.indexOf("|"));var q=""+i[n].id,r=function(a){return function(){c.trigger("engine:layout",a)}};l.push([o,p,r(q)]),k.push({name:p,value:q,model:i[n]})}j(this.$el,l,"!"),c.setLayouts(k),e()}}}),c.engines.clustering&&c.engines.clustering.fetch({success:function(b,d,f,g){if(a.size(d.blocks)){var h=d.blocks.at(0),i=h.components.models,k=[],l=["# Community detection"],m=0;for(var n in i){m++;var o=""+m,p=i[n].id+"|";p=p.substring(0,p.indexOf("|"));var q=i[n].id,r=function(a){return function(){c.trigger("engine:clustering",a)}};l.push([o,p,r(q)]),k.push({name:p,value:q,model:i[n]})}j(this.$el,l,":"),c.setClusterings(k),e()}}});for(var f in c.engines)console.log(" FETCH ENGINES "+f),"clustering"!=f&&"layout"!=f&&c.engines[f].fetch({success:e})},auto_compute:function(){if(this.ALLOW_AUTO_COMPUTE&&!this._auto_compute_delay){var a=this.models.graph;a&&a.vs&&a.vs.length&&(this.engines.clustering&&this.engines.clustering.play(),this.engines.layout&&this.engines.layout.play())}},noop:function(){},additive_nodes:function(b,c){if(this._additive_nodes_uuids=a.union(this._additive_nodes_uuids,b),!this._additive_nodes_delay){this._additive_nodes_delayed=!0;var d=this.engines.additive_nodes;console.log("engine:additive_nodes",this._additive_nodes_uuids,c),d.input_models.request.set("uuids",this._additive_nodes_uuids),d.play(c),this._additive_nodes_uuids=[]}},explore_reset:function(a){b.trigger(i.unselect_nodes),b.trigger(i.unselect_edges);var c=this;c.response=a,console.log("explore_reset",a.results),c.set_auto_compute(!1),a.results.graph&&(c.models.graph.reset(a.results.graph),c.models.graph.set("gid",a.results.graph.properties.name),c.models.graph.vs.each(function(a){a.add_flag("form")})),c.set_auto_compute(!0),c.auto_compute()},expand_graph:function(c){if(console.log("expand_graph",c.results),!(!c|!("results"in c))){var d=this.models.graph,e=[],f=a.pairs(c.results.scores);f.sort(function(a,b){return a[1]<b[1]?1:-1});for(var g in f){var h=f[g][0],i=f[g][1];if(null==d.vs.get(h)){if(e.length>=10&&i<1)break;console.log("expand_graph adding vertex : "+h,i),e.push(h)}}e.length&&b.trigger("engine:additive_nodes",e)}},clusters_labels:function(a,b){this.models.clustering.set_labels(a.results,b)},merge_graph:function(a,b){!a|!("results"in a)|!("graph"in a.results)||(this.set_auto_compute(!1),b||(b={}),b&&b.reset?this.models.graph.reset(a.results.graph):this.models.graph.merge(a.results.graph),this.models.graph.vs.each(function(a){a.add_flag("form")}),b.callback&&b.callback(),this.set_auto_compute(!0),this.auto_compute())},apply_clustering:function(c){if(!c|!("results"in c)|!("clusters"in c.results))return void b.trigger("engine:error",{message:"No response or no results in response",response:c});this.models.clustering.reset(c.results.clusters,{members:{vs:{source:this.models.graph.vs,id_field:"vids"}}}),this.models.clustering.clusters.each(function(a){a.listenTo(b,"unselect_clusters",function(){a.remove_flag("selected")})});for(var d in this.models.clustering.clusters.models){var e=this.models.clustering.clusters.at(d),f=e.members.vs.models,g="000"+d,h=g.substring(g.length-3)+"/"+(e.misc?"0":"1");a.each(f,function(a){a.set("_sort_by_cluster",h+"/"+a.label)})}b.trigger("engine:request_animation")},set_auto_compute:function(a){this.ALLOW_AUTO_COMPUTE=a},search_loading:function(a,b){},engine_play_error:function(b,c){var d=this;if(console.log("play:error","response",b),$("#loading-indicator").hide(0),d.DEBUG){d.response=b,d.xhr=c;var e;a.isEmpty(b)?(e=$(c.responseText),$("body").css("margin","0")):e=b.meta.errors.join("<br />"),$("body").after(e)}},set_viz:function(c){var d=this,e=d.models.graph;this.listenTo(b,i.select_node,function(b){if(d.AUTO_FOCUS){var e=a.pick(c.wnidx[b.id].position,"x","y","z");c.setFocus(e)}c.request_animation()}),this.listenTo(b,i.select_edge,function(a,b){a&&e.es.set_selected(a),c.setFocus()}),this.listenTo(e,"change:gid",function(){c.collapse()}),p(),o(c,""),n(this.$el,this.models.graph,""),m(this.$el,this.models.graph,""),c.animate()},install_listeners:function(){}}),B.Iframe=B.Base.extend({initialize:function(a,b){B.Iframe.__super__.initialize.apply(this,arguments)},setClusterings:function(a){this.clusterings=a},setLayouts:function(a){this.layouts=a}}),B.Simple=B.Base.extend({initialize:function(a,b){B.Simple.__super__.initialize.apply(this,arguments)},setClusterings:function(a){var b=$("padagraph-app-menu")[0],c=$("padagraph-controls")[0];b.clusterings=a,c.clusterings=a,this.clusterings=a},setLayouts:function(a){var b=$("padagraph-app-menu")[0],c=$("padagraph-controls")[0];b.layouts=a,c.layouts=a,this.layouts=a},create_models:function(){this.create_graph_model(),this.create_clustering_model(),this.create_query_model(),this.create_user_model()},start:function(){var a=this,c=a.models.graph;a.listenTo(c,"change:gid",function(){$("padagraph-graph-button")[0].graphname=c.id});var e=$("padagraph-app-menu")[0];e.themes=Object.keys(THEMES),e.graph=c,e.app=a;var f=$("padagraph-controls")[0];f.themes=Object.keys(THEMES),f.app=a,f.gviz=k,f.graph=c,f.setupUI();var g=$("padagraph-create")[0];g.graph=c,g.nodetype_model=c.nodetype_model,g.edgetype_model=c.edgetype_model,g.vertex_model=c.vertex_model,g.edge_model=c.edge_model;var h=$("padagraph-edits")[0];h.graph=c;var i=$("padagraph-messages")[0];i.graph=c,$("padagraph-node-search")[0].graph=c,$("padagraph-notifications")[0].setGraphModel(c),$("#newNodeType").click(function(){b.trigger("edit:nodetype",!1)}),initUI(),this.setFullscreen=function(a){this.fullscreen=a,setFullscreen(a)},this.setTheme=setTheme;var j=$("padagraph-gviz")[0],k=j.gviz;a.set_viz(k),this.gviz=j,window._app=this,window.Cello=d,window.Models=x,console.warn=function(){}}}),B});
\ No newline at end of file \ No newline at end of file
...@@ -952,6 +952,7 @@ gviz.DEFAULTS = { ...@@ -952,6 +952,7 @@ gviz.DEFAULTS = {
debug : false debug : false
}; };
gviz.ThreeViz = Backbone.View.extend({ gviz.ThreeViz = Backbone.View.extend({
initialize: function(attributes){ initialize: function(attributes){
...@@ -1455,8 +1456,9 @@ gviz.ThreeViz = Backbone.View.extend({ ...@@ -1455,8 +1456,9 @@ gviz.ThreeViz = Backbone.View.extend({
if (obj.nodetype) if (obj.nodetype)
material.text_lines = get_text_lines( obj, material ); material.text_lines = get_text_lines( obj, material );
if (material.shape == null) material.shape='circle'; if (gviz.SHAPES.indexOf(material.shape) == -1 )
material.shape = 'circle';
material.id = obj.id; material.id = obj.id;
return material; return material;
}, },
...@@ -2029,6 +2031,8 @@ gviz.ThreeViz = Backbone.View.extend({ ...@@ -2029,6 +2031,8 @@ gviz.ThreeViz = Backbone.View.extend({
* *
*/ */
gviz.SHAPES = "circle square losange diamond triangle triangle-top triangle-bottom".split(' ')
gviz.ThreeVizHelpers = { gviz.ThreeVizHelpers = {
PI2: Math.PI * 2, PI2: Math.PI * 2,
...@@ -2135,7 +2139,6 @@ gviz.ThreeVizHelpers = { ...@@ -2135,7 +2139,6 @@ gviz.ThreeVizHelpers = {
context.scale(scale, scale); context.scale(scale, scale);
node._scale *= scale; node._scale *= scale;
//
if (material.shape == 'circle') // centered on 0.0 if (material.shape == 'circle') // centered on 0.0
{ {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -630,7 +630,7 @@ require(['backbone', 'jquery', 'pdgconst'], function (Backbone, $, Const) { ...@@ -630,7 +630,7 @@ require(['backbone', 'jquery', 'pdgconst'], function (Backbone, $, Const) {
explore: function explore() { explore: function explore() {
var params = { graph: this.graph, query: this.model.id }; var params = { graph: this.graph, query: this.model.id };
Backbone.trigger('engine:explore', params); Backbone.trigger('engine:explore', "Search", params);
}, },
edit: function edit() { edit: function edit() {
...@@ -1342,7 +1342,7 @@ require(['backbone', 'pdgconst'], function (Backbone, Const) { ...@@ -1342,7 +1342,7 @@ require(['backbone', 'pdgconst'], function (Backbone, Const) {
} else if (action == 'explore') { } else if (action == 'explore') {
if (ismodel) { if (ismodel) {
var params = { graph: this.model.graph.id, query: this.model.id }; var params = { graph: this.model.graph.id, query: this.model.id };
Backbone.trigger('engine:explore', params); Backbone.trigger('engine:explore', 'Search', params);
} }
} else if (action == 'expand') { } else if (action == 'expand') {
var params = { graph: this.model.graph.id, expand: [this.model.id], weights: [] }; var params = { graph: this.model.graph.id, expand: [this.model.id], weights: [] };
...@@ -1702,7 +1702,7 @@ require(['backbone', 'cello', 'gviz', 'materials', 'pdgconst'], function (Backbo ...@@ -1702,7 +1702,7 @@ require(['backbone', 'cello', 'gviz', 'materials', 'pdgconst'], function (Backbo
explore: function explore() { explore: function explore() {
var graph = this.model.graph; var graph = this.model.graph;
var params = { graph: graph.id, query: this.model.id }; var params = { graph: graph.id, query: this.model.id };
Backbone.trigger('engine:explore', params); Backbone.trigger('engine:explore', "Search", params);
}, },
shortuuid: function shortuuid(model) { shortuuid: function shortuuid(model) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment