Preeti Dave
.
0aa1914
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()