From d5fdeccd09d392914ddb69a96072c4eb9b7c7f3b Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 6 Aug 2024 09:29:22 +0800 Subject: [PATCH] doc: add benchmark.rst (#153) * add benchmark png * Create benchmark.rst * Update benchmark.rst * Draft * rename file * add autopydantic_settings * remove ignored file * add example * sort imports * sort imports * format code with black --------- Co-authored-by: Young --- docs/_static/benchmark.png | Bin 0 -> 62064 bytes docs/conf.py | 4 +- docs/index.rst | 1 + docs/research/benchmark.rst | 99 +++++++++++++++++++++++++++ docs/research/research.rst | 15 ++++ rdagent/components/benchmark/conf.py | 26 +++++-- 6 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 docs/_static/benchmark.png create mode 100644 docs/research/benchmark.rst create mode 100644 docs/research/research.rst diff --git a/docs/_static/benchmark.png b/docs/_static/benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..428be9c72fb98b282abe7175ab02a72f0c1a4b7e GIT binary patch literal 62064 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index 65fb93886..6222a0465 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -15,9 +15,7 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = [ - "sphinx.ext.autodoc", -] +extensions = ["sphinx.ext.autodoc", "sphinxcontrib.autodoc_pydantic"] autodoc_member_order = "bysource" diff --git a/docs/index.rst b/docs/index.rst index a0bc76497..715546af5 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,6 +14,7 @@ Welcome to RDAgent's documentation! installation_and_configuration scens/catalog project_framework_introduction + research/research development api_reference policy diff --git a/docs/research/benchmark.rst b/docs/research/benchmark.rst new file mode 100644 index 000000000..6fe1923e9 --- /dev/null +++ b/docs/research/benchmark.rst @@ -0,0 +1,99 @@ +============================== +Benchmark +============================== + +Introduction +============= + + +Benchmarking the capabilities of the R&D is a very important research problem of the research area. + +Currently we are continuously exploring how to benchmark them. + +The current benchmarks are listed in this page + + +Development Capability Benchmarking +=================================== + + +Benchmark is used to evaluate the effectiveness of factors with fixed data. + +It mainly includes the following steps: + +1. :ref:`read and prepare the eval_data ` + +2. :ref:`declare the method to be tested and pass the arguments ` + +3. :ref:`declare the eval method and pass the arguments ` + +4. :ref:`run the eval ` + +5. :ref:`save and show the result ` + +Configuration +------------- +.. _config: + +.. autopydantic_settings:: rdagent.components.benchmark.conf.BenchmarkSettings + +Example +++++++++ +.. _example: + +The default value for ``bench_test_round`` is 10, and it will take about 2 hours to run 10 rounds. +To modify it from ``10`` to ``2`` you can adjust this by adding environment variables in the .env file as shown below. + +.. code-block:: Properties + + BENCHMARK_BENCH_TEST_ROUND=1 + +Data Format +------------- +.. _data: + +The sample data in ``bench_data_path`` is a dictionary where each key represents a factor name. + +The value associated with each key is factor data containing the following information: + +- **description**: A textual description of the factor. +- **formulation**: A LaTeX formula representing the model's formulation. +- **variables**: A dictionary of variables involved in the factor. +- **Category**: The category or classification of the factor. +- **Difficulty**: The difficulty level of implementing or understanding the factor. +- **gt_code**: A piece of code associated with the factor. + +Here is the example of this data format: + +.. literalinclude:: ../../rdagent/components/benchmark/example.json + :language: json + +Run Benchmark +------------- +.. _run: + +Start benchmark after finishing the :doc:`../installation_and_configuration`. + +.. code-block:: Properties + + python rdagent/app/quant_factor_benchmark/eval.py + + + +Once completed, a pkl file will be generated, and its path will be printed on the last line of the console. + +Show Result +------------- +.. _show: + +The ``analysis.py`` script is used to read data from pkl and convert it to an image. +Modify the python code in ``rdagent/app/quant_factor_benchmark/analysis.py`` to specify the path to the pkl file and the output path for the png file. + +.. code-block:: Properties + + python rdagent/app/quant_factor_benchmark/analysis.py + +A png file will be saved to the designated path as shown below. + +.. image:: ../_static/benchmark.png + diff --git a/docs/research/research.rst b/docs/research/research.rst new file mode 100644 index 000000000..b27165a95 --- /dev/null +++ b/docs/research/research.rst @@ -0,0 +1,15 @@ +=========== +Research +=========== + + + +.. TODO: xiao will add this + + +.. toctree:: + :maxdepth: 1 + :caption: Doctree: + :hidden: + + benchmark.rst diff --git a/rdagent/components/benchmark/conf.py b/rdagent/components/benchmark/conf.py index a05bbe399..095212a79 100644 --- a/rdagent/components/benchmark/conf.py +++ b/rdagent/components/benchmark/conf.py @@ -1,29 +1,41 @@ -from dotenv import load_dotenv - -load_dotenv(verbose=True, override=True) from dataclasses import field from pathlib import Path from typing import Optional +from dotenv import load_dotenv from pydantic_settings import BaseSettings -DIRNAME = Path(__file__).absolute().resolve().parent +# Load environment variables +load_dotenv(verbose=True, override=True) + + +DIRNAME = Path("./") class BenchmarkSettings(BaseSettings): class Config: - env_prefix = "BENCHMARK_" # Use BENCHMARK_ as prefix for environment variables + env_prefix = "BENCHMARK_" + """Use `BENCHMARK_` as prefix for environment variables""" ground_truth_dir: Path = DIRNAME / "ground_truth" + """ground truth dir""" bench_data_path: Path = DIRNAME / "example.json" + """data for benchmark""" bench_test_round: int = 10 - bench_test_case_n: Optional[int] = None # how many test cases to run; If not given, all test cases will be run + """how many rounds to run, each round may cost 10 minutes""" + + bench_test_case_n: Optional[int] = None + """how many test cases to run; If not given, all test cases will be run""" bench_method_cls: str = "rdagent.components.coder.factor_coder.CoSTEER.FactorCoSTEER" + """method to be used for test cases""" + bench_method_extra_kwargs: dict = field( default_factory=dict, - ) # extra kwargs for the method to be tested except the task list + ) + """extra kwargs for the method to be tested except the task list""" bench_result_path: Path = DIRNAME / "result" + """result save path"""