本論文 Poisoning Attacks on the PGM-index の公式コードです。
git clone https://github.com/atsukisato/pgm-attack.git
cd pgm-attack
git submodule update --init --recursive
./scripts/build.sh
CMake が必要です(依存関係を参照)。出力は build/ 以下に生成されます(デフォルトではバイナリは build/bin に配置されます)。
./scripts/download_alex_dataset.sh # ALEX
./scripts/download_mgbench.sh # mgbench
./scripts/download_sosd_datasets.sh # SOSD
./scripts/preprocess_alex_dataset.sh # ALEX
./scripts/preprocess_mgbench.sh # mgbench
./scripts/generate_synthetic_dataset.sh # synthetic
各実行は ./scripts/run_experiment.sh <config.json> を介して 1 つの JSON 設定を受け取ります。例:
4.1 最大誤差を最大化する(例:n=16、consecutive 法)
./scripts/run_experiment.sh "configs/experiments/poison_attack/maximize_maxerror_consec/baseline_n16.json"
4.2 カバーされる正当なキーを最小化する(例:epsilon=2、consecutive 法)
./scripts/run_experiment.sh "configs/experiments/poison_attack/minimize_segment_length/baseline_epsilon2.json"
4.3 m_opt を最大化する(PGM-index の例)
./scripts/run_experiment.sh "configs/experiments/poison_attack/inject_poisons_to_minimize_segment_length_swing_lambda_with_theta/baseline.json"
4.4 m_opt の上限(インスタンス依存の例)
./scripts/run_experiment.sh "configs/experiments/upper_bound/fix_w_per_block/baseline.json"
4.5 すべての実験を実行する(バッチ)
scripts/run_all_experiment.sh 内の実験設定の全リストを実行します(セットを変更するにはそのファイルを編集してください)。
./scripts/run_all_experiment.sh
リポジトリのルートから:
./scripts/plot.sh
./scripts/print_table.sh
図とログは fig/ 以下に書き出されます。まず Python の依存関係をインストールしてください:pip install -r requirements.txt。
g++、make、および CMake(ビルドスクリプトは CMake で構成し、cmake --build でビルドします。これは通常 Make を呼び出します)。requirements.txt に記載のパッケージ(プロット/表スクリプト用)。./scripts/run_experiment.sh で必要です。| パス | 役割 |
|---|---|
src/ | C++ ソース(攻撃、PGM ベンチマーク、ツール、上限)。 |
configs/experiments/ | 実験用 JSON 設定(poison_attack/、upper_bound/ などの下のパス)。 |
scripts/ | ビルド、データ、run_experiment.sh、run_all_experiment.sh、plot.sh、print_table.sh。 |
third_party/ | Git サブモジュール(PGM-index、FITing-Tree、RadixSpline)。 |
data/、results/、fig/ | データ、実行出力、生成された図/表ログ。 |
plot/ | Python のプロットおよび表出力スクリプト。 |
イメージを一度ビルドします:
./docker_build.sh
docker_run.sh — 対話型コンテナ:リポジトリを /workspace にマウントし、8 CPU(0–7)を割り当て、bash に入るので、手動でコマンドをビルドおよび実行できます。docker_run_all.sh — デタッチ実行:コンテナ内(8 CPU)で ./scripts/run_all_experiment.sh を実行し、標準出力を results/run_all.log に書き込みます。docker_run_all_single_cpu.sh — docker_run_all.sh と同じですが、シングルスレッド実行のために 1 CPU と OMP_NUM_THREADS=1 を使用します。3 つすべてがイメージ pgm_poisoning:latest と、スクリプト内と同じケーパビリティ/ボリューム設定を使用します。