File size: 4,555 Bytes
4ae4e0b
 
 
 
cf804c7
4ae4e0b
 
31c40ea
4ae4e0b
31c40ea
 
 
 
 
 
 
4ae4e0b
31c40ea
 
 
 
 
 
4ae4e0b
 
 
 
 
 
 
 
 
 
 
31c40ea
 
 
 
 
 
 
 
4ae4e0b
31c40ea
 
4ae4e0b
 
 
 
 
 
 
 
31c40ea
 
 
 
 
4ae4e0b
31c40ea
 
4ae4e0b
31c40ea
 
 
 
 
 
 
 
 
4ae4e0b
31c40ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4ae4e0b
 
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import gradio as gr
import requests

# The API endpoint URL
similarity_problem = 'http://34.166.48.42:5555/similarity_problem'
similarity_solution = 'http://34.166.48.42:5555/similarity_solution'
    
glob = {}

import json
import random
import string

def generate_random_string(length=10):
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(length))

def generate_random_json_object():
    return {
        "problem_link": f"https://example.com/problem/{generate_random_string()}",
        "solution": generate_random_string(20),
        "similarity": round(random.uniform(0, 1), 2)
    }

def get_similar_problems(problem_statement, problem_solution, top_k):
    if not problem_statement:
        if not problem_solution:
            return "ERROR: Input the problem's statement and/or solution"
        # The JSON object to send (with one key-value pair)
        data = {'solution': problem_solution,
                'top_k': top_k}
        # Send the POST request with the JSON data
        response = requests.post(similarity_solution, json=data)
        if response.status_code == 200:
            similar_solutions = response.json()
        # similar_solutions = [generate_random_json_object() for _ in range(10)]
            ret = {}
            glob.clear()
            for json_obj in similar_solutions:
                ret[json_obj.get("problem_link", "No problem link provided")] = json_obj.get("similarity", "No similarity provided")
                glob[json_obj.get("problem_link", "No problem link provided")] = json_obj.get("solution", "No problem solution provided")
            return ret
        else:
            glob.clear()
            return {"NaN" : 0}
    else:
        # The JSON object to send (with one key-value pair)
        data = {'problem': problem_statement,
                'top_k': top_k}
        # Send the POST request with the JSON data
        response = requests.post(similarity_problem, json=data)
        if response.status_code == 200:
            similar_problems = response.json()
            ret = {}
            glob.clear()
            for json_obj in similar_problems:
                ret[json_obj.get("problem_link", "No problem link provided")] = json_obj.get("similarity", "No similarity provided")
                glob[json_obj.get("problem_link", "No problem link provided")] = json_obj.get("problem_statement", "No problem statement provided")
        else:
            glob.clear()
            return {"NaN" : 0}
        
def show_problem(evt: gr.SelectData):  # SelectData is a subclass of EventData
    uid = evt.value
    if uid != "NaN":
        statement = glob[uid]
        title = uid 
        url = uid
        markdown = f"# [{title}]({url})\n\n"
        markdown += f"### Statement\n\n{statement}"
        return markdown

with gr.Blocks(
    title="Similarity Module", css=".mymarkdown {font-size: 15px !important}"
) as demo:
    gr.Markdown(
        """
    # Similarity Module
    IPC Intelligent Programming Companion
    """
    )
    with gr.Row():
        # column for inputs
        with gr.Column():
            problem_statement = gr.Textbox(
                label="Statement",
                info="Paste your statement here!",
                value="",
            )
            problem_solution = gr.Textbox(
                label="Solution",
                info="Paste your solution here!",
                value="",
            )
            topk_slider = gr.Slider(
                minimum=1,
                maximum=100,
                step=1,
                value=10,
                label="Number of similar problems to show",
            )
            submit_button = gr.Button("Submit")
            my_markdown = gr.Markdown(
                latex_delimiters=[
                    {"left": "$$", "right": "$$", "display": True},
                    {"left": "$", "right": "$", "display": False},
                    {"left": "\\(", "right": "\\)", "display": False},
                    {"left": "\\[", "right": "\\]", "display": True},
                ],
                elem_classes="mymarkdown",
            )
        # column for outputs
        with gr.Column():
            output_labels = gr.Label(
                label="Similar problems",
            )
    submit_button.click(
        fn=get_similar_problems,
        inputs=[problem_statement, problem_solution, topk_slider],
        outputs=[output_labels],
    )
    output_labels.select(fn=show_problem, inputs=None, outputs=[my_markdown])

demo.launch()