Program Listing for File std_async_integration_demo.cpp

Return to documentation for file (examples/std_async_integration_demo.cpp)

#define NOMINMAX
#include <diffeq.hpp>
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
#include <vector>
#include <memory>
#include <mutex>
#include <atomic>
#include <functional>
#include <numeric>

#ifdef _WIN32
#include <windows.h>
#endif

// 示例:参数化系统
struct SimpleSystem {
    double alpha, beta;

    SimpleSystem(double a, double b) : alpha(a), beta(b) {}

    void operator()(std::vector<double>& dx, const std::vector<double>& x, double t) const {
        dx[0] = alpha * x[0] - beta * x[0] * x[1];
        dx[1] = -beta * x[1] + alpha * x[0] * x[1];
    }
};

// 示例:数据分析器
class DataAnalyzer {
private:
    std::vector<std::pair<std::vector<double>, double>> data_;
    mutable std::mutex data_mutex_;

public:
    void analyze_result(const std::vector<double>& final_state, double final_time) {
        std::lock_guard<std::mutex> lock(data_mutex_);

        // 计算简单的统计指标
        double magnitude = std::sqrt(final_state[0] * final_state[0] + final_state[1] * final_state[1]);
        double stability = std::abs(final_state[0] - final_state[1]);

        std::cout << "分析结果: 幅度=" << magnitude
                  << ", 稳定性=" << stability
                  << ", 时间=" << final_time << std::endl;

        data_.emplace_back(final_state, final_time);
    }

    const std::vector<std::pair<std::vector<double>, double>>& get_data() const {
        std::lock_guard<std::mutex> lock(data_mutex_);
        return data_;
    }
};

// 示例:轨迹保存器
class TrajectorySaver {
private:
    std::string prefix_;
    std::atomic<size_t> counter_{0};

public:
    explicit TrajectorySaver(std::string prefix = "traj_") : prefix_(std::move(prefix)) {}

    void save_trajectory(const std::vector<double>& final_state, double final_time) {
        auto count = ++counter_;
        std::string filename = prefix_ + std::to_string(count) + ".dat";

        // 模拟文件保存
        std::cout << "保存轨迹: " << filename
                  << " (状态: [" << final_state[0] << ", " << final_state[1]
                  << "], 时间: " << final_time << ")" << std::endl;
    }
};

// 示例:参数优化器
class ParameterOptimizer {
private:
    std::vector<double> best_params_;
    double best_objective_{std::numeric_limits<double>::max()};
    mutable std::mutex optimizer_mutex_;

public:
    void update_parameters(const std::vector<double>& params, double objective_value) {
        std::lock_guard<std::mutex> lock(optimizer_mutex_);

        if (objective_value < best_objective_) {
            best_objective_ = objective_value;
            best_params_ = params;

            std::cout << "发现更好的参数: [";
            for (size_t i = 0; i < params.size(); ++i) {
                std::cout << params[i];
                if (i < params.size() - 1) std::cout << ", ";
            }
            std::cout << "], 目标值: " << objective_value << std::endl;
        }
    }

    std::vector<double> get_best_parameters() const {
        std::lock_guard<std::mutex> lock(optimizer_mutex_);
        return best_params_;
    }

    double get_best_objective() const {
        std::lock_guard<std::mutex> lock(optimizer_mutex_);
        return best_objective_;
    }
};

int main() {
#ifdef _WIN32
    // 设置控制台编码为 UTF-8
    SetConsoleOutputCP(CP_UTF8);
#endif

    std::cout << "=== 标准库异步积分示例 ===" << std::endl;
    std::cout << "展示如何直接使用标准库设施进行异步计算" << std::endl;

    // 创建后处理组件
    DataAnalyzer analyzer;
    TrajectorySaver saver("std_traj_");
    ParameterOptimizer optimizer;

    // 定义参数组合
    std::vector<std::pair<double, double>> parameters = {
        {0.5, 0.3}, {0.8, 0.2}, {0.3, 0.7}, {0.6, 0.4},
        {0.4, 0.6}, {0.7, 0.3}, {0.2, 0.8}, {0.9, 0.1}
    };

    std::cout << "\n启动 " << parameters.size() << " 个异步积分任务..." << std::endl;

    // 用于存储所有异步任务的 futures
    std::vector<std::future<void>> integration_futures;

    auto start_time = std::chrono::high_resolution_clock::now();

    // 启动异步积分任务 - 直接使用 std::async
    for (size_t i = 0; i < parameters.size(); ++i) {
        const auto& [alpha, beta] = parameters[i];

        // 直接使用 std::async 启动异步任务
        auto future = std::async(std::launch::async,
            [&analyzer, &saver, &optimizer, alpha, beta, i]() {

                // 创建积分器和系统
                SimpleSystem system(alpha, beta);
                diffeq::RK4Integrator<std::vector<double>> integrator(
                    [system](double t, const std::vector<double>& x, std::vector<double>& dx) {
                        system(dx, x, t);
                    }
                );

                // 执行积分
                std::vector<double> state = {1.0, 0.5};
                integrator.integrate(state, 0.01, 10.0);

                std::cout << "任务 " << i << " 积分完成 (α=" << alpha << ", β=" << beta << ")" << std::endl;

                // 后处理任务 - 也使用异步执行
                std::vector<std::future<void>> post_futures;

                // 分析任务
                post_futures.push_back(std::async(std::launch::async,
                    [&analyzer, state, time = integrator.current_time()]() {
                        analyzer.analyze_result(state, time);
                    }
                ));

                // 保存任务
                post_futures.push_back(std::async(std::launch::async,
                    [&saver, state, time = integrator.current_time()]() {
                        saver.save_trajectory(state, time);
                    }
                ));

                // 优化任务
                double objective = std::abs(state[0] - state[1]);
                std::vector<double> params = {alpha, beta};

                post_futures.push_back(std::async(std::launch::async,
                    [&optimizer, params, objective]() {
                        optimizer.update_parameters(params, objective);
                    }
                ));

                // 等待所有后处理任务完成
                for (auto& f : post_futures) {
                    f.wait();
                }

                std::cout << "任务 " << i << " 后处理完成" << std::endl;
            }
        );

        integration_futures.push_back(std::move(future));
    }

    // 在主线程执行一些其他任务(演示非阻塞)
    std::cout << "\n主线程可以继续执行其他任务..." << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    std::cout << "主线程的其他工作完成" << std::endl;

    // 等待所有积分任务完成
    std::cout << "\n等待所有异步任务完成..." << std::endl;
    for (auto& future : integration_futures) {
        future.wait();
    }

    auto end_time = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);

    // 显示结果
    std::cout << "\n=== 执行完成 ===" << std::endl;
    std::cout << "完成的任务: " << parameters.size() << std::endl;
    std::cout << "总耗时: " << duration.count() << "ms" << std::endl;
    std::cout << "平均每个任务: " << (duration.count() / parameters.size()) << "ms" << std::endl;

    // 显示优化结果
    auto best_params = optimizer.get_best_parameters();
    auto best_objective = optimizer.get_best_objective();

    if (!best_params.empty()) {
        std::cout << "\n=== 优化结果 ===" << std::endl;
        std::cout << "最佳参数: [";
        for (size_t i = 0; i < best_params.size(); ++i) {
            std::cout << best_params[i];
            if (i < best_params.size() - 1) std::cout << ", ";
        }
        std::cout << "]" << std::endl;
        std::cout << "最佳目标值: " << best_objective << std::endl;
    }

    // 显示分析结果
    const auto& analysis_data = analyzer.get_data();
    std::cout << "\n收集的分析数据点: " << analysis_data.size() << std::endl;

    // 示例:使用 std::packaged_task 进行更灵活的任务管理
    std::cout << "\n=== std::packaged_task 示例 ===" << std::endl;

    // 创建一个可以稍后执行的任务
    std::packaged_task<double(double, double)> task(
        [](double a, double b) -> double {
            // 执行一个简单的积分计算
            diffeq::RK4Integrator<std::vector<double>> integrator(
                [a, b](double t, const std::vector<double>& x, std::vector<double>& dx) {
                    dx[0] = a * x[0] - b * x[0] * x[1];
                    dx[1] = -b * x[1] + a * x[0] * x[1];
                }
            );

            std::vector<double> state = {2.0, 1.0};
            integrator.integrate(state, 0.01, 5.0);

            return std::sqrt(state[0] * state[0] + state[1] * state[1]);
        }
    );

    // 获取 future
    auto result_future = task.get_future();

    // 在另一个线程执行任务
    std::thread task_thread(std::move(task), 0.6, 0.4);

    // 等待结果
    double result = result_future.get();
    std::cout << "Packaged task 结果: " << result << std::endl;

    task_thread.join();

    return 0;
}