Skip to content

Commit aefedda

Browse files
committed
works, todo cleanup
1 parent df0b176 commit aefedda

File tree

2 files changed

+38
-82
lines changed

2 files changed

+38
-82
lines changed

codeflash/api/aiservice.py

Lines changed: 30 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,22 @@
44
import os
55
import platform
66
import time
7-
from typing import TYPE_CHECKING, Any
8-
7+
from typing import TYPE_CHECKING, Any, Literal
8+
from pathlib import Path
99
import requests
1010
from pydantic.json import pydantic_encoder
1111

1212
from codeflash.cli_cmds.console import console, logger
1313
from codeflash.code_utils.env_utils import get_codeflash_api_key
1414
from codeflash.code_utils.git_utils import get_last_commit_author_if_pr_exists, get_repo_owner_and_name
15+
from codeflash.code_utils.time_utils import humanize_runtime
1516
from codeflash.lsp.helpers import is_LSP_enabled
1617
from codeflash.models.ExperimentMetadata import ExperimentMetadata
1718
from codeflash.models.models import AIServiceRefinerRequest, CodeStringsMarkdown, OptimizedCandidate
1819
from codeflash.telemetry.posthog_cf import ph
1920
from codeflash.version import __version__ as codeflash_version
2021

2122
if TYPE_CHECKING:
22-
from pathlib import Path
23-
2423
from codeflash.discovery.functions_to_optimize import FunctionToOptimize
2524
from codeflash.models.ExperimentMetadata import ExperimentMetadata
2625
from codeflash.models.models import AIServiceRefinerRequest
@@ -513,91 +512,45 @@ def generate_regression_tests( # noqa: D417
513512
ph("cli-testgen-error-response", {"response_status_code": response.status_code, "error": response.text})
514513
return None
515514

516-
def get_optimization_impact(self, original_code, new_code, explanation, existing_tests_source, generated_original_test_source, function_trace_id, coverage_message, replay_tests, concolic_tests) -> list[OptimizedCandidate]:
515+
def get_optimization_impact(self, original_code, new_code, explanation, existing_tests_source, generated_original_test_source, function_trace_id, coverage_message, replay_tests, concolic_tests, root_dir, original_line_profiler_results, optimized_line_profiler_results) -> str:
517516
"""Optimize the given python code for performance by making a request to the Django endpoint.
518517
519518
Args:
520-
request: A list of optimization candidate details for refinement
519+
PrComment args
521520
522521
Returns:
523522
-------
524-
- List[OptimizationCandidate]: A list of Optimization Candidates.
523+
- 'high','medium' or 'low' optimization impact
525524
526525
"""
527-
# """{
528-
# "original_code": original_code_combined,
529-
# "new_code": new_code_combined,
530-
# "explanation": new_explanation,
531-
# "existing_tests_source": existing_tests,
532-
# "generated_original_test_source": generated_tests_str,
533-
# "function_trace_id": self.function_trace_id[:-4] + exp_type
534-
# if self.experiment_id
535-
# else self.function_trace_id,
536-
# "coverage_message": coverage_message,
537-
# "replay_tests": replay_tests,
538-
# "concolic_tests": concolic_tests,
539-
# }"""
540-
# logger.info("Creating a new PR with the optimized code...")
541-
# console.rule()
542-
# owner, repo = get_repo_owner_and_name(git_repo, git_remote)
543-
# logger.info(f"Pushing to {git_remote} - Owner: {owner}, Repo: {repo}")
544-
# console.rule()
545-
# if not check_and_push_branch(git_repo, git_remote, wait_for_push=True):
546-
# logger.warning("⏭️ Branch is not pushed, skipping PR creation...")
547-
# return
548-
# relative_path = explanation.file_path.relative_to(root_dir).as_posix()
549-
# base_branch = get_current_branch()
550-
# build_file_changes = {
551-
# Path(p).relative_to(root_dir).as_posix(): FileDiffContent(
552-
# oldContent=original_code[p], newContent=new_code[p]
553-
# )
554-
# for p in original_code
555-
# }
556-
#
557-
# response = cfapi.create_pr(
558-
# owner=owner,
559-
# repo=repo,
560-
# base_branch=base_branch,
561-
# file_changes=build_file_changes,
562-
# pr_comment=PrComment(
563-
# optimization_explanation=explanation.explanation_message(),
564-
# best_runtime=explanation.best_runtime_ns,
565-
# original_runtime=explanation.original_runtime_ns,
566-
# function_name=explanation.function_name,
567-
# relative_file_path=relative_path,
568-
# speedup_x=explanation.speedup_x,
569-
# speedup_pct=explanation.speedup_pct,
570-
# winning_behavior_test_results=explanation.winning_behavior_test_results,
571-
# winning_benchmarking_test_results=explanation.winning_benchmarking_test_results,
572-
# benchmark_details=explanation.benchmark_details,
573-
# ),
574-
# existing_tests=existing_tests_source,
575-
# generated_tests=generated_original_test_source,
576-
# trace_id=function_trace_id,
577-
# coverage_message=coverage_message,
578-
# replay_tests=replay_tests,
579-
# concolic_tests=concolic_tests,
580-
# )
581-
# if response.ok:
582-
# pr_id = response.text
583-
# pr_url = github_pr_url(owner, repo, pr_id)
584-
# logger.info(f"Successfully created a new PR #{pr_id} with the optimized code: {pr_url}")
585-
# else:
586-
# logger.error(
587-
# f"Optimization was successful, but I failed to create a PR with the optimized code."
588-
# f" Response from server was: {response.text}"
589-
# )
590-
# console.rule()
591526
logger.info("!lsp|Computing Optimization Impact…")
527+
original_code_str = ''
528+
new_code_str = ''
529+
for p in original_code:
530+
original_code_str += f"```python:{Path(p).relative_to(root_dir).as_posix()}"
531+
original_code_str += '\n'
532+
original_code_str += original_code[p]
533+
for p in new_code:
534+
new_code_str += f"```python:{Path(p).relative_to(root_dir).as_posix()}"
535+
new_code_str += '\n'
536+
new_code_str += new_code[p]
537+
592538
payload = {
593-
"original_code": original_code,
594-
"new_code": new_code,
595-
"existing_tests_source": existing_tests_source,
596-
"generated_original_test_source": generated_original_test_source,
597-
"function_trace_id": function_trace_id,
539+
"original_code": original_code_str,
540+
"optimized_code": new_code_str,
541+
"existing_tests": existing_tests_source,
542+
"generated_tests": generated_original_test_source,
543+
"trace_id": function_trace_id,
598544
"coverage_message": coverage_message,
599545
"replay_tests": replay_tests,
600546
"concolic_tests": concolic_tests,
547+
"speedup": f"{1+float(explanation.speedup):.2f}x",
548+
"loop_count": explanation.winning_benchmarking_test_results.number_of_loops(),
549+
"benchmark_details": explanation.benchmark_details if explanation.benchmark_details else None,
550+
"optimized_runtime": humanize_runtime(explanation.best_runtime_ns),
551+
"original_runtime": humanize_runtime(explanation.original_runtime_ns),
552+
"original_line_profiler_results":original_line_profiler_results,
553+
"optimized_line_profiler_results":optimized_line_profiler_results
601554
}
602555
console.rule()
603556
try:
@@ -617,7 +570,7 @@ def get_optimization_impact(self, original_code, new_code, explanation, existing
617570
logger.error(f"Error generating impact candidates: {response.status_code} - {error}")
618571
ph("cli-optimize-error-response", {"response_status_code": response.status_code, "error": error})
619572
console.rule()
620-
return []
573+
return ''
621574

622575

623576
class LocalAiServiceClient(AiServiceClient):

codeflash/optimization/function_optimizer.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,15 +1401,18 @@ def process_review(
14011401
}
14021402

14031403
raise_pr = not self.args.no_pr
1404-
# modify argument of staging vs pr based on the impact
1405-
opt_impact_response = self.aiservice_client.get_optimization_impact(**data)
1406-
if opt_impact_response in ['medium', 'low']:
1407-
raise_pr = False
1408-
self.args.staging_review = True
14091404

14101405
if raise_pr or self.args.staging_review:
14111406
data["root_dir"] = git_root_dir()
14121407

1408+
if raise_pr:
1409+
# modify argument of staging vs pr based on the impact
1410+
opt_impact_response = self.aiservice_client.get_optimization_impact(**data, original_line_profiler_results=original_code_baseline.line_profile_results["str_out"],
1411+
optimized_line_profiler_results=best_optimization.line_profiler_test_results["str_out"],)
1412+
if opt_impact_response in ['low', 'medium']:
1413+
raise_pr = False
1414+
self.args.staging_review = True
1415+
14131416
if raise_pr and not self.args.staging_review:
14141417
data["git_remote"] = self.args.git_remote
14151418
check_create_pr(**data)

0 commit comments

Comments
 (0)