Molbap HF Staff commited on
Commit
ae4e744
·
1 Parent(s): 31b1b7e
Files changed (2) hide show
  1. app.py +4 -4
  2. modular_graph_and_candidates.py +36 -3
app.py CHANGED
@@ -76,26 +76,26 @@ with gr.Blocks(css=CUSTOM_CSS) as demo:
76
  repo_in = gr.Text(value=HF_MAIN_REPO, label="Repo / fork URL")
77
  thresh = gr.Slider(0.50, 0.95, value=0.5, step=0.01, label="Similarity ≥")
78
  multi_cb = gr.Checkbox(label="Only multimodal models")
79
- sim_radio = gr.Radio(["jaccard", "embedding"], value="jaccard", label="Similarity metric")
80
  go_btn = gr.Button("Build graph")
81
 
82
  graph_html_out = gr.HTML(elem_id="graph_html", show_label=False)
83
  graph_json_out = gr.File(label="Download graph.json")
84
 
85
- go_btn.click(run_graph, [repo_in, thresh, multi_cb, sim_radio], [graph_html_out, graph_json_out])
86
 
87
  with gr.Tab("Chronological Timeline"):
88
  with gr.Row():
89
  timeline_repo_in = gr.Text(value=HF_MAIN_REPO, label="Repo / fork URL")
90
  timeline_thresh = gr.Slider(0.50, 0.95, value=0.5, step=0.01, label="Similarity ≥")
91
  timeline_multi_cb = gr.Checkbox(label="Only multimodal models")
92
- timeline_sim_radio = gr.Radio(["jaccard", "embedding"], value="jaccard", label="Similarity metric")
93
  timeline_btn = gr.Button("Build timeline")
94
 
95
  timeline_html_out = gr.HTML(elem_id="timeline_html", show_label=False)
96
  timeline_json_out = gr.File(label="Download timeline.json")
97
 
98
- timeline_btn.click(run_timeline, [timeline_repo_in, timeline_thresh, timeline_multi_cb, timeline_sim_radio], [timeline_html_out, timeline_json_out])
99
 
100
  if __name__ == "__main__":
101
  demo.launch(allowed_paths=["static"])
 
76
  repo_in = gr.Text(value=HF_MAIN_REPO, label="Repo / fork URL")
77
  thresh = gr.Slider(0.50, 0.95, value=0.5, step=0.01, label="Similarity ≥")
78
  multi_cb = gr.Checkbox(label="Only multimodal models")
79
+ gr.Markdown("**Embedding method:** TBD")
80
  go_btn = gr.Button("Build graph")
81
 
82
  graph_html_out = gr.HTML(elem_id="graph_html", show_label=False)
83
  graph_json_out = gr.File(label="Download graph.json")
84
 
85
+ go_btn.click(lambda repo, thresh, multi: run_graph(repo, thresh, multi, "jaccard"), [repo_in, thresh, multi_cb], [graph_html_out, graph_json_out])
86
 
87
  with gr.Tab("Chronological Timeline"):
88
  with gr.Row():
89
  timeline_repo_in = gr.Text(value=HF_MAIN_REPO, label="Repo / fork URL")
90
  timeline_thresh = gr.Slider(0.50, 0.95, value=0.5, step=0.01, label="Similarity ≥")
91
  timeline_multi_cb = gr.Checkbox(label="Only multimodal models")
92
+ gr.Markdown("**Embedding method:** TBD")
93
  timeline_btn = gr.Button("Build timeline")
94
 
95
  timeline_html_out = gr.HTML(elem_id="timeline_html", show_label=False)
96
  timeline_json_out = gr.File(label="Download timeline.json")
97
 
98
+ timeline_btn.click(lambda repo, thresh, multi: run_timeline(repo, thresh, multi, "jaccard"), [timeline_repo_in, timeline_thresh, timeline_multi_cb], [timeline_html_out, timeline_json_out])
99
 
100
  if __name__ == "__main__":
101
  demo.launch(allowed_paths=["static"])
modular_graph_and_candidates.py CHANGED
@@ -740,7 +740,7 @@ node.filter(d => d.cls !== 'base').append('circle').attr('r', d => 20*d.sz);
740
  node.append('text')
741
  .attr('class','node-label')
742
  .attr('dy','-2.4em')
743
- .style('font-size', d => d.cls === 'base' ? '32px' : '28px')
744
  .style('font-weight', d => d.cls === 'base' ? 'bold' : 'normal')
745
  .text(d => d.id);
746
 
@@ -837,7 +837,7 @@ svg{ width:100vw; height:100vh; }
837
  pointer-events:none;
838
  text-anchor:middle;
839
  font-weight:600;
840
- font-size:13px;
841
  paint-order:stroke fill;
842
  stroke:var(--outline);
843
  stroke-width:3px;
@@ -886,13 +886,27 @@ svg{ width:100vw; height:100vh; }
886
  stroke-opacity: 0.6;
887
  }
888
 
 
 
 
 
 
 
889
  .timeline-label {
890
  fill: var(--muted);
891
- font-size: 14px;
892
  font-weight: 600;
893
  text-anchor: middle;
894
  }
895
 
 
 
 
 
 
 
 
 
896
  /* Enhanced controls panel */
897
  #controls{
898
  position:fixed; top:20px; left:20px;
@@ -972,6 +986,8 @@ if (timeExtent[0] && timeExtent[1]) {
972
 
973
  // Enhanced year markers with better spacing
974
  const years = d3.timeYear.range(new Date(timeExtent[0] * 1000), new Date(timeExtent[1] * 1000 + 365*24*60*60*1000));
 
 
975
  timelineG.selectAll('.timeline-tick')
976
  .data(years)
977
  .join('line')
@@ -981,6 +997,15 @@ if (timeExtent[0] && timeExtent[1]) {
981
  .attr('x2', d => timeScale(d))
982
  .attr('y2', timelineY + 15);
983
 
 
 
 
 
 
 
 
 
 
984
  timelineG.selectAll('.timeline-label')
985
  .data(years)
986
  .join('text')
@@ -988,6 +1013,14 @@ if (timeExtent[0] && timeExtent[1]) {
988
  .attr('x', d => timeScale(d))
989
  .attr('y', timelineY + 30)
990
  .text(d => d.getFullYear());
 
 
 
 
 
 
 
 
991
  }
992
 
993
  function handleZoom(event) {
 
740
  node.append('text')
741
  .attr('class','node-label')
742
  .attr('dy','-2.4em')
743
+ .style('font-size', d => d.cls === 'base' ? '50px' : '45px')
744
  .style('font-weight', d => d.cls === 'base' ? 'bold' : 'normal')
745
  .text(d => d.id);
746
 
 
837
  pointer-events:none;
838
  text-anchor:middle;
839
  font-weight:600;
840
+ font-size:25px;
841
  paint-order:stroke fill;
842
  stroke:var(--outline);
843
  stroke-width:3px;
 
886
  stroke-opacity: 0.6;
887
  }
888
 
889
+ .timeline-month-tick {
890
+ stroke: var(--timeline-line);
891
+ stroke-width: 1px;
892
+ stroke-opacity: 0.4;
893
+ }
894
+
895
  .timeline-label {
896
  fill: var(--muted);
897
+ font-size: 20px;
898
  font-weight: 600;
899
  text-anchor: middle;
900
  }
901
 
902
+ .timeline-month-label {
903
+ fill: var(--muted);
904
+ font-size: 16px;
905
+ font-weight: 400;
906
+ text-anchor: middle;
907
+ opacity: 0.7;
908
+ }
909
+
910
  /* Enhanced controls panel */
911
  #controls{
912
  position:fixed; top:20px; left:20px;
 
986
 
987
  // Enhanced year markers with better spacing
988
  const years = d3.timeYear.range(new Date(timeExtent[0] * 1000), new Date(timeExtent[1] * 1000 + 365*24*60*60*1000));
989
+ const months = d3.timeMonth.range(new Date(timeExtent[0] * 1000), new Date(timeExtent[1] * 1000 + 365*24*60*60*1000));
990
+
991
  timelineG.selectAll('.timeline-tick')
992
  .data(years)
993
  .join('line')
 
997
  .attr('x2', d => timeScale(d))
998
  .attr('y2', timelineY + 15);
999
 
1000
+ timelineG.selectAll('.timeline-month-tick')
1001
+ .data(months)
1002
+ .join('line')
1003
+ .attr('class', 'timeline-month-tick')
1004
+ .attr('x1', d => timeScale(d))
1005
+ .attr('y1', timelineY - 8)
1006
+ .attr('x2', d => timeScale(d))
1007
+ .attr('y2', timelineY + 8);
1008
+
1009
  timelineG.selectAll('.timeline-label')
1010
  .data(years)
1011
  .join('text')
 
1013
  .attr('x', d => timeScale(d))
1014
  .attr('y', timelineY + 30)
1015
  .text(d => d.getFullYear());
1016
+
1017
+ timelineG.selectAll('.timeline-month-label')
1018
+ .data(months.filter((d, i) => i % 3 === 0))
1019
+ .join('text')
1020
+ .attr('class', 'timeline-month-label')
1021
+ .attr('x', d => timeScale(d))
1022
+ .attr('y', timelineY + 45)
1023
+ .text(d => d.toLocaleDateString('en', { month: 'short' }));
1024
  }
1025
 
1026
  function handleZoom(event) {