diff --git a/week4/community-contributions/code_conversion.ipynb b/week4/community-contributions/code_conversion.ipynb new file mode 100644 index 0000000..db41fef --- /dev/null +++ b/week4/community-contributions/code_conversion.ipynb @@ -0,0 +1,420 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "8dee7381-2291-4202-a6e6-9eb94e896141", + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "\n", + "import os\n", + "import io\n", + "import sys\n", + "from dotenv import load_dotenv\n", + "from openai import OpenAI\n", + "import google.generativeai\n", + "import anthropic\n", + "from IPython.display import Markdown, display, update_display\n", + "import gradio as gr\n", + "import subprocess\n", + "import platform\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc145e4c-1e06-4414-aa2b-1ea1862b4600", + "metadata": {}, + "outputs": [], + "source": [ + "# environment\n", + "\n", + "load_dotenv(override=True)\n", + "os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY', 'your-key-if-not-using-env')\n", + "os.environ['ANTHROPIC_API_KEY'] = os.getenv('ANTHROPIC_API_KEY', 'your-key-if-not-using-env')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bfaf8584-a10f-43f0-b550-f1b2b6f07160", + "metadata": {}, + "outputs": [], + "source": [ + "# initialize\n", + "\n", + "openai = OpenAI()\n", + "claude = anthropic.Anthropic()\n", + "\n", + "OPENAI_MODEL = \"gpt-4o-mini\"\n", + "CLAUDE_MODEL = \"claude-3-haiku-20240307\"\n", + "\n", + "# OPENAI_MODEL = \"gpt-4o\"\n", + "# CLAUDE_MODEL = \"claude-3-5-sonnet-20240620\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b47508e-dc60-4db5-a29c-f3f0ed57d894", + "metadata": {}, + "outputs": [], + "source": [ + "processor = platform.machine()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ee9ec20-3b1d-4a15-9ab3-b2fbb93296b4", + "metadata": {}, + "outputs": [], + "source": [ + "def get_name_by_extension(extension):\n", + " for lang in programming_languages:\n", + " if lang[\"extension\"] == extension:\n", + " return lang[\"name\"]\n", + " return None " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee408ffd-fde2-4c1e-b87f-c8dce2ad49bc", + "metadata": {}, + "outputs": [], + "source": [ + "def get_system_message(prog_lang):\n", + " name = get_name_by_extension(prog_lang)\n", + " \n", + " system_message = f\"You are an assistant that reimplements Python code to {name} for an {processor} device. \"\n", + " system_message += f\"Respond only with code; use comments sparingly and do not provide any explanation other than occasional comments. \"\n", + " system_message += f\"The {name} response needs to produce an identical output in the fastest possible time.\"\n", + " system_message += f\"If the used function does not exists for {name} language interchange it for its compatibility and if not throw an error\"\n", + "\n", + " return system_message" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac8d5d3b-a018-4b94-8080-9b18f5634dc7", + "metadata": {}, + "outputs": [], + "source": [ + "def user_prompt_for(python, prog_lang):\n", + " name = get_name_by_extension(prog_lang)\n", + " \n", + " user_prompt = f\"Rewrite this Python code in {name} with the fastest possible implementation that produces identical output in the least time. \"\n", + " user_prompt += f\"Respond only with {name} code; do not explain your work other than a few comments. \"\n", + " user_prompt += \"Pay attention to number types to ensure no int overflows\\n\\n\"\n", + " user_prompt += python\n", + " return user_prompt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23c58e61-5fdd-41f5-9e60-a0847f4bf86f", + "metadata": {}, + "outputs": [], + "source": [ + "def messages_for(python, prog_lang):\n", + " system_message = get_system_message(prog_lang)\n", + " \n", + " return [\n", + " {\"role\": \"system\", \"content\": system_message},\n", + " {\"role\": \"user\", \"content\": user_prompt_for(python, prog_lang)}\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e193cd6-16f4-440a-9376-6041672f91fc", + "metadata": {}, + "outputs": [], + "source": [ + "# write to a file called optimized.cpp\n", + "\n", + "def write_output(content, prog_lang):\n", + " code = content.replace(\"```cpp\",\"\").replace(\"javascript\",\"\").replace(\"```\",\"\")\n", + " \n", + " with open(f\"optimized.{prog_lang}\", \"w\") as f:\n", + " f.write(code)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28b0be5e-73b6-49d8-8ef6-8209eace5ee6", + "metadata": {}, + "outputs": [], + "source": [ + "python_hard = \"\"\"# Be careful to support large number sizes\n", + "\n", + "def lcg(seed, a=1664525, c=1013904223, m=2**32):\n", + " value = seed\n", + " while True:\n", + " value = (a * value + c) % m\n", + " yield value\n", + " \n", + "def max_subarray_sum(n, seed, min_val, max_val):\n", + " lcg_gen = lcg(seed)\n", + " random_numbers = [next(lcg_gen) % (max_val - min_val + 1) + min_val for _ in range(n)]\n", + " max_sum = float('-inf')\n", + " for i in range(n):\n", + " current_sum = 0\n", + " for j in range(i, n):\n", + " current_sum += random_numbers[j]\n", + " if current_sum > max_sum:\n", + " max_sum = current_sum\n", + " return max_sum\n", + "\n", + "def total_max_subarray_sum(n, initial_seed, min_val, max_val):\n", + " total_sum = 0\n", + " lcg_gen = lcg(initial_seed)\n", + " for _ in range(20):\n", + " seed = next(lcg_gen)\n", + " total_sum += max_subarray_sum(n, seed, min_val, max_val)\n", + " return total_sum\n", + "\n", + "# Parameters\n", + "n = 10000 # Number of random numbers\n", + "initial_seed = 42 # Initial seed for the LCG\n", + "min_val = -10 # Minimum value of random numbers\n", + "max_val = 10 # Maximum value of random numbers\n", + "\n", + "# Timing the function\n", + "import time\n", + "start_time = time.time()\n", + "result = total_max_subarray_sum(n, initial_seed, min_val, max_val)\n", + "end_time = time.time()\n", + "\n", + "print(\"Total Maximum Subarray Sum (20 runs):\", result)\n", + "print(\"Execution Time: {:.6f} seconds\".format(end_time - start_time))\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2818063c-008e-4029-851a-959f63d3f0fc", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_gpt(python, prog_lang): \n", + " stream = openai.chat.completions.create(model=OPENAI_MODEL, messages=messages_for(python, prog_lang), stream=True)\n", + " reply = \"\"\n", + " for chunk in stream:\n", + " fragment = chunk.choices[0].delta.content or \"\"\n", + " reply += fragment\n", + " yield reply.replace('```cpp\\n','').replace('javascript\\n','').replace('```','')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e3e0502-8550-46fe-bd2f-394078db6576", + "metadata": {}, + "outputs": [], + "source": [ + "def stream_claude(python, prog_lang):\n", + " system_message = get_system_message(prog_lang)\n", + " \n", + " result = claude.messages.stream(\n", + " model=CLAUDE_MODEL,\n", + " max_tokens=2000,\n", + " system=system_message,\n", + " messages=[{\"role\": \"user\", \"content\": user_prompt_for(python, prog_lang)}],\n", + " )\n", + " reply = \"\"\n", + " with result as stream:\n", + " for text in stream.text_stream:\n", + " reply += text\n", + " yield reply.replace('```cpp\\n','').replace('javascript\\n','').replace('```','')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10accbb2-b56d-4c79-beef-928c2a3b58f0", + "metadata": {}, + "outputs": [], + "source": [ + "def optimize(python, model, prog_lang):\n", + " if model==\"GPT\":\n", + " result = stream_gpt(python, prog_lang)\n", + " elif model==\"Claude\":\n", + " result = stream_claude(python, prog_lang)\n", + " else:\n", + " raise ValueError(\"Unknown model\")\n", + " for stream_so_far in result:\n", + " yield stream_so_far " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1acb130-8b5c-4199-818a-3afa89c342cb", + "metadata": {}, + "outputs": [], + "source": [ + "def execute_python(code):\n", + " try:\n", + " output = io.StringIO()\n", + " sys.stdout = output\n", + "\n", + " namespace = {}\n", + " exec(code, namespace)\n", + " finally:\n", + " sys.stdout = sys.__stdout__\n", + " return output.getvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e901e81-61d8-4ab2-9e16-f70c8ee6bdbe", + "metadata": {}, + "outputs": [], + "source": [ + "css = \"\"\"\n", + ".python {background-color: #306998;}\n", + ".cpp {background-color: #050;}\n", + ".php {background-color: #cb7afa;}\n", + ".js {background-color: #f4ff78;}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e0dfe2e-a87d-4595-b4ef-72797bd1ad44", + "metadata": {}, + "outputs": [], + "source": [ + "def execute_cpp(code):\n", + " write_output(code, \"cpp\")\n", + " try:\n", + " compile_cmd = [\"clang++\", \"-Ofast\", \"-std=c++17\", \"-o\", \"optimized\", \"optimized.cpp\"]\n", + " compile_result = subprocess.run(compile_cmd, shell=True, text=True, capture_output=True)\n", + " run_cmd = [\"./optimized\"]\n", + " run_result = subprocess.run(run_cmd, check=True, text=True, capture_output=True)\n", + " return run_result.stdout\n", + " except subprocess.CalledProcessError as e:\n", + " return f\"An error occurred:\\n{e.stderr}\"\n", + "\n", + "def execute_js(code):\n", + " write_output(code, \"js\")\n", + " try:\n", + " run_result = subprocess.run([\"node\", \"optimized.js\"], shell=True, text=True, capture_output=True)\n", + " return run_result.stdout\n", + " except subprocess.CalledProcessError as e:\n", + " return f\"An error occurred:\\n{e.stderr}\"\n", + "\n", + "def execute_php(code):\n", + " write_output(code, \"php\")\n", + " try:\n", + " run_result = subprocess.run([\"php\", \"optimized.php\"], shell=True, text=True, capture_output=True)\n", + " return run_result.stdout or run_result.stderr\n", + " except subprocess.CalledProcessError as e:\n", + " return f\"An error occurred:\\n{e.stderr}\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c127bbc9-ef4d-40e4-871a-85873fc9e406", + "metadata": {}, + "outputs": [], + "source": [ + "programming_languages = [\n", + " {\"name\": \"C++\", \"extension\": \"cpp\", \"fn\": execute_cpp},\n", + " {\"name\": \"Javascript\", \"extension\": \"js\", \"fn\": execute_js},\n", + " {\"name\": \"Php\", \"extension\": \"php\", \"fn\": execute_php}\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "126636a1-4315-4811-9de9-61ee032effc8", + "metadata": {}, + "outputs": [], + "source": [ + "def create_prog_lang_ui(lang, model):\n", + " prog_name = lang[\"name\"]\n", + " extension = lang[\"extension\"]\n", + " fn = lang[\"fn\"]\n", + "\n", + " with gr.Row():\n", + " with gr.Column():\n", + " convert = gr.Button(f\"Convert to {prog_name}\")\n", + " converted_code = gr.Textbox(label=f\"Converted {prog_name} code:\", lines=10)\n", + "\n", + " with gr.Column():\n", + " prog_run = gr.Button(f\"Run {prog_name}\")\n", + " prog_out = gr.TextArea(label=f\"{prog_name} result:\", elem_classes=[extension])\n", + "\n", + " current_selected = gr.Dropdown([extension], value=extension, visible=False)\n", + " \n", + " convert.click(optimize, inputs=[python, model, current_selected], outputs=[converted_code])\n", + " \n", + " match extension:\n", + " case \"cpp\":\n", + " prog_run.click(execute_cpp, inputs=[converted_code], outputs=[prog_out])\n", + " case \"js\":\n", + " prog_run.click(execute_js, inputs=[converted_code], outputs=[prog_out])\n", + " case \"php\":\n", + " prog_run.click(execute_php, inputs=[converted_code], outputs=[prog_out])\n", + "\n", + "with gr.Blocks(css=css) as ui:\n", + " gr.Markdown(\"## Convert code from Python to selected Programming Language\")\n", + " with gr.Row():\n", + " with gr.Column():\n", + " python = gr.Textbox(label=\"Python code:\", value=python_hard, lines=10)\n", + " with gr.Column():\n", + " python_run = gr.Button(f\"Run Python\")\n", + " python_out = gr.TextArea(label=f\"Python result:\", elem_classes=[\"python\"])\n", + " \n", + " with gr.Row():\n", + " model = gr.Dropdown([\"GPT\", \"Claude\"], label=\"Select model\", value=\"GPT\")\n", + "\n", + " python_run.click(execute_python, inputs=[python], outputs=[python_out]) \n", + "\n", + "\n", + " for lang in programming_languages:\n", + " create_prog_lang_ui(lang, model)\n", + "\n", + "ui.launch(\n", + " # inbrowser=True\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:base] *", + "language": "python", + "name": "conda-base-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}