File size: 2,589 Bytes
ca32de3
 
1c1e102
ca32de3
1c1e102
de08591
ca32de3
1c1e102
 
 
 
 
91eb8de
ca32de3
 
91eb8de
1c1e102
91eb8de
ca32de3
 
1c1e102
273b0a2
 
 
1c1e102
273b0a2
1c1e102
 
273b0a2
 
1c1e102
 
 
 
 
 
 
 
 
273b0a2
 
 
1c1e102
 
273b0a2
1c1e102
ca32de3
273b0a2
 
1c1e102
 
 
 
273b0a2
1c1e102
 
 
 
273b0a2
 
1c1e102
 
 
 
 
 
 
91eb8de
ca32de3
273b0a2
 
1c1e102
273b0a2
 
91eb8de
ca32de3
91eb8de
 
5bea186
1c1e102
 
 
ca32de3
 
91eb8de
273b0a2
 
1c1e102
273b0a2
91eb8de
273b0a2
91eb8de
 
1c1e102
ca32de3
91eb8de
 
1c1e102
 
ca32de3
1c1e102
 
ca32de3
91eb8de
ca32de3
91eb8de
ca32de3
91eb8de
ca32de3
91eb8de
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
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

# --------- Model Config ---------
MODEL_NAME = "google/gemma-7b-it"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16
)

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)

model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    quantization_config=bnb_config,
    device_map="auto"
)

# --------- General Prompt (Test-Case Based) ---------
def pre_processing(requirement, code):
    return f"""
# ROLE
You are a strict Python code evaluator.

# TASK
Determine whether the code satisfies the requirement.

# INSTRUCTIONS

Step 1: Convert the requirement into 3 clear test cases (input β†’ expected output).
Step 2: Analyze the code logic carefully.
Step 3: Simulate the code for each test case (DO NOT execute, reason mentally).
Step 4: Compare actual vs expected outputs.

# DECISION RULE
- If ALL test cases match β†’ YES
- If ANY test case fails β†’ NO

# RULES
- Be strict
- Do not assume missing logic
- Do not execute code
- Do not guess
- Include edge cases (if applicable)

# OUTPUT FORMAT

Test Cases:
1. Input β†’ Expected Output
2. Input β†’ Expected Output
3. Input β†’ Expected Output

Evaluation:
1. PASS/FAIL
2. PASS/FAIL
3. PASS/FAIL

Final Answer: YES or NO

# INPUT
Requirement:
{requirement}

Code:
{code}
"""

# --------- Core Function ---------
def evaluate_code(requirement, code):

    prompt = pre_processing(requirement, code)

    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    outputs = model.generate(
        **inputs,
        max_new_tokens=60,
        temperature=0.1,
        do_sample=False,
        repetition_penalty=1.2
    )

    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    response_upper = response.upper()

    # Extract final answer
    if "FINAL ANSWER: YES" in response_upper:
        return "βœ… YES"
    elif "FINAL ANSWER: NO" in response_upper:
        return "❌ NO"
    else:
        return "⚠️ Unable to determine\n\n" + response

# --------- UI ---------
with gr.Blocks() as app:
    gr.Markdown("## 🧠 Code Requirement Validator (Gemma 7B - General)")
    gr.Markdown("Evaluates code using test-case based reasoning (high accuracy).")

    requirement = gr.Textbox(label="Requirement", lines=4)
    code = gr.Textbox(label="Code", lines=10)

    output = gr.Textbox(label="Result")

    btn = gr.Button("Evaluate")

    btn.click(fn=evaluate_code, inputs=[requirement, code], outputs=output)

app.launch()