Spaces:
Sleeping
Sleeping
import gradio as gr | |
import networkx as nx | |
import matplotlib.pyplot as plt | |
import io | |
from PIL import Image | |
# Your sample Jus Mundi data (same as before) | |
jusmundi_data = { | |
"data": [ | |
{"type": "cases", "id": "46690", "attributes": {"commencement_date": "2025-03-31T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "United Operations v. Comoros"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/46690"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "79078"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46690/decisions"}}, "parties": {"data": [{"type": "parties", "id": "3535"}, {"type": "parties", "id": "64825"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46690/parties"}}}}, | |
{"type": "cases", "id": "46609", "attributes": {"commencement_date": "1913-07-31T00:00:00Z", "organization": "PCA", "outcome": "Concluded", "title": "Expropriated Religious Properties"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/46609"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "78948"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46609/decisions"}}, "parties": {"data": [{"type": "parties", "id": "7302"}, {"type": "parties", "id": "7319"}, {"type": "parties", "id": "7790"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46609/parties"}}}}, | |
{"type": "cases", "id": "46542", "attributes": {"commencement_date": "2025-03-20T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "Bellwether and Tecnipetrol v. Ecuador and Petroecuador"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/46542"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "78809"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46542/decisions"}}, "parties": {"data": [{"type": "parties", "id": "7569"}, {"type": "parties", "id": "13856"}, {"type": "parties", "id": "64647"}, {"type": "parties", "id": "64648"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46542/parties"}}}}, | |
{"type": "cases", "id": "46486", "attributes": {"commencement_date": "2025-03-14T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "Dirk Andres as insolvency administrator regarding the assets of HBH v. Algeria"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/46486"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "78693"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46486/decisions"}}, "parties": {"data": [{"type": "parties", "id": "7345"}, {"type": "parties", "id": "64617"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46486/parties"}}}}, | |
{"type": "cases", "id": "46422", "attributes": {"commencement_date": "2025-03-12T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "Brookfield v. Peru"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/46422"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "78955"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46422/decisions"}}, "parties": {"data": [{"type": "parties", "id": "1479"}, {"type": "parties", "id": "64717"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/46422/parties"}}}}, | |
{"type": "cases", "id": "42525", "attributes": {"commencement_date": "2025-03-05T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "Orano v. Niger (III)"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/42525"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "73961"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42525/decisions"}}, "parties": {"data": [{"type": "parties", "id": "5442"}, {"type": "parties", "id": "58131"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42525/parties"}}}}, | |
{"type": "cases", "id": "42289", "attributes": {"commencement_date": "2021-03-08T00:00:00Z", "organization": "ICSID", "outcome": "Discontinued", "title": "Ahmed Hussein v. Egypt (I)"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/42289"}, "relationships": {"parties": {"data": [{"type": "parties", "id": "352"}, {"type": "parties", "id": "59703"}, {"type": "parties", "id": "59703"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42289/parties"}}}}, | |
{"type": "cases", "id": "42131", "attributes": {"commencement_date": "2020-01-01T00:00:00Z", "organization": "PCA", "outcome": "Concluded", "title": "Claimant v. Respondent"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/42131"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "73273"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42131/decisions"}}, "parties": {"data": [{"type": "parties", "id": "59479"}, {"type": "parties", "id": "59480"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42131/parties"}}}}, | |
{"type": "cases", "id": "42025", "attributes": {"commencement_date": "2025-02-18T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "Draslovka Holding v. Mexico"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/42025"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "73113"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42025/decisions"}}, "parties": {"data": [{"type": "parties", "id": "11038"}, {"type": "parties", "id": "59408"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/42025/parties"}}}}, | |
{"type": "cases", "id": "41696", "attributes": {"commencement_date": "2025-02-06T00:00:00Z", "organization": "ICSID", "outcome": "Pending", "title": "Togo v. ContourGlobal"}, "links": {"self": "http://stanford.service.gra.prod.consul/cases/41696"}, "relationships": {"decisions": {"data": [{"type": "decisions", "id": "72520"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/41696/decisions"}}, "parties": {"data": [{"type": "parties", "id": "14333"}, {"type": "parties", "id": "59179"}], "links": {"related": "http://stanford.service.gra.prod.consul/cases/41696/parties"}}}} | |
], | |
"links": {"self": "http://stanford.service.gra.prod.consul/cases?page=1&count=10", "first": "http://stanford.service.gra.prod.consul/cases?page=1&count=10", "next": "http://stanford.service.gra.prod.consul/cases?page=2&count=10", "last": "http://stanford.service.gra.prod.consul/cases?page=154&count=10"}, | |
"meta": {"totalPages": 154, "totalRecords": 1539, "currentPage": 1, "perPage": 10} | |
} | |
def get_common_cases_and_parties(party_id_1, party_id_2): | |
common_cases = [] | |
for case in jusmundi_data['data']: | |
parties_in_case = [party['id'] for party in case['relationships']['parties']['data']] | |
if party_id_1 in parties_in_case and party_id_2 in parties_in_case: | |
common_cases.append(case) | |
return common_cases | |
def visualize_relationships(common_cases, party_id_1, party_id_2): | |
if not common_cases: | |
return "No common cases found to visualize." | |
graph = nx.Graph() | |
all_involved_parties = set([party_id_1, party_id_2]) | |
for case in common_cases: | |
case_title = case['attributes']['title'] | |
parties_in_case = [party['id'] for party in case['relationships']['parties']['data']] | |
for party_id in parties_in_case: | |
graph.add_node(party_id) | |
all_involved_parties.add(party_id) | |
# Create edges between all pairs of parties within the same case | |
for i in range(len(parties_in_case)): | |
for j in range(i + 1, len(parties_in_case)): | |
u, v = parties_in_case[i], parties_in_case[j] | |
graph.add_edge(u, v, case=case_title) | |
if not graph.nodes(): | |
return "No parties to visualize." | |
# Highlight the input parties | |
node_colors = ['red' if node == party_id_1 or node == party_id_2 else 'lightblue' for node in graph.nodes()] | |
plt.figure(figsize=(10, 8)) | |
pos = nx.spring_layout(graph) # You can try other layouts like circular_layout | |
nx.draw(graph, pos, with_labels=True, node_color=node_colors, node_size=2000, font_size=10, font_weight='bold') | |
edge_labels = nx.get_edge_attributes(graph, 'case') | |
nx.draw_networkx_edge_labels(graph, pos, edge_labels=edge_labels, font_size=8) | |
# Save the plot to a BytesIO object | |
buf = io.BytesIO() | |
plt.savefig(buf, format='png') | |
buf.seek(0) | |
img = Image.open(buf) | |
plt.close() | |
return img | |
def combined_function(party_id_1, party_id_2): | |
common_cases = get_common_cases_and_parties(party_id_1, party_id_2) | |
result_text = "" | |
if common_cases: | |
case_titles = [case['attributes']['title'] for case in common_cases] | |
result_text = f"Parties '{party_id_1}' and '{party_id_2}' appear together in the following cases: {', '.join(case_titles)}" | |
graph_image = visualize_relationships(common_cases, party_id_1, party_id_2) | |
return result_text, graph_image | |
else: | |
result_text = f"Parties '{party_id_1}' and '{party_id_2}' do not appear together in any of the cases in this sample data." | |
return result_text, None | |
iface = gr.Interface( | |
fn=combined_function, | |
inputs=[ | |
gr.Textbox(label="Enter Party ID 1"), | |
gr.Textbox(label="Enter Party ID 2") | |
], | |
outputs=[ | |
gr.Textbox(label="Result"), | |
gr.Image(label="Relationship Graph of Common Cases") | |
], | |
title="Jus Mundi Party Relationship Checker", | |
description="Enter two Party IDs to see if they appear together in any cases in the sample data and visualize their relationships within those cases." | |
) | |
iface.launch() |