File size: 9,866 Bytes
0aa1914
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()