Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

physbo.search.discrete_multi.policyのインタラクティブ実行時の挙動 #42

Closed
yamato-m-csc opened this issue Sep 23, 2022 · 2 comments
Assignees

Comments

@yamato-m-csc
Copy link

多目的最適化の計算をインタラクティブ実行すると、以下のような挙動になりました。

  1. physbo.search.utility.show_search_results_moの履歴に最初の一個目の結果が表示されない(表示数が2以上の場合)
  2. policy.get_post_fmean実行時にValueError: shapes (100,10) and (9,) not aligned: 10 (dim 1) != 9 (dim 0)のようなエラーが発生

なお、2.のエラーに関してはsimulatorクラスを定義して実行した場合には発生しませんでした。
設定の間違いや回避策などがあればご教示いただければ幸いです。

実行環境

  • Windows10 64bit
  • Python 3.10.7
  • PHYSBO 1.1.0
  • JupyterLab

テストコード(インタラクティブ実行)

import numpy as np
import physbo

def f(x):
    y1 = 1 + np.exp(-x)
    y2 = 2*x**2 + 1
    return np.c_[-y1, -y2]

x = np.linspace(0.1,5,100)
test_X = x.reshape(len(x),1)

policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
policy.set_seed(0)

# ランダムサーチ
num_rand = 5
for i in range(num_rand):
    actions = policy.random_search(max_num_probes=1, simulator=None)
    t = f(test_X[actions[0]])
    policy.write(actions, t)
    physbo.search.utility.show_search_results_mo(policy.history, 10)

# ベイズ最適化
num_bo = 5
for i in range(num_bo):
    actions = policy.bayes_search(max_num_probes=1, simulator=None, score='HVPI', interval=0)
    t = f(test_X[actions[0]])
    policy.write(actions, t)
    physbo.search.utility.show_search_results_mo(policy.history, 10)

post_fmean = policy.get_post_fmean(test_X) # ここでエラー発生
post_fcov = policy.get_post_fcov(test_X)

エラーメッセージ全文

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In [1], line 31
     28     policy.write(actions, t)
     29     physbo.search.utility.show_search_results_mo(policy.history, 10)
---> 31 post_fmean = policy.get_post_fmean(test_X)
     32 post_fcov = policy.get_post_fcov(test_X)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\physbo\search\discrete_multi\policy.py:293, in policy.get_post_fmean(self, xs)
    291         predictor_list[i].fit(self.training_list[i], 0)
    292         predictor_list[i].prepare(self.training_list[i])
--> 293 fmean = [
    294     predictor.get_post_fmean(training, X)
    295     for predictor, training in zip(predictor_list, self.training_list)
    296 ]
    297 return np.array(fmean).T

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\physbo\search\discrete_multi\policy.py:294, in <listcomp>(.0)
    291         predictor_list[i].fit(self.training_list[i], 0)
    292         predictor_list[i].prepare(self.training_list[i])
    293 fmean = [
--> 294     predictor.get_post_fmean(training, X)
    295     for predictor, training in zip(predictor_list, self.training_list)
    296 ]
    297 return np.array(fmean).T

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\physbo\gp\predictor.py:98, in predictor.get_post_fmean(self, training, test)
     96 if self.model.stats is None:
     97     self.prepare(training)
---> 98 return self.model.get_post_fmean(training.X, test.X)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\physbo\gp\core\model.py:248, in model.get_post_fmean(self, X, Z, params)
    245     params = np.copy(self.params)
    247 if self.inf == "exact":
--> 248     post_fmu = inf.exact.get_post_fmean(self, X, Z, params)
    250 return post_fmu

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\physbo\gp\inf\exact.py:182, in get_post_fmean(gp, X, Z, params)
    179 fmu = gp.prior.get_mean(ntest)
    180 G = gp.prior.get_cov(X=Z, Z=X, params=prior_params)
--> 182 return G.dot(alpha) + fmu

ValueError: shapes (100,10) and (9,) not aligned: 10 (dim 1) != 9 (dim 0)

simulatorクラスを使った場合

del policy

class simulator(object):
    def __init__(self, X):
        self.t = f(X)

    def __call__( self, action):
        return self.t[action]

simu = simulator(test_X)

policy = physbo.search.discrete_multi.policy(test_X=test_X, num_objectives=2)
policy.set_seed(0)
policy.random_search(max_num_probes=5, simulator=simu)
res = policy.bayes_search(max_num_probes=5, simulator=simu, score='HVPI', interval=0)

post_fmean = policy.get_post_fmean(test_X)
post_fcov = policy.get_post_fcov(test_X)

post_fmean[0:res.num_runs] # こちらは問題なく実行可能
@yomichi yomichi self-assigned this Sep 28, 2022
@yomichi
Copy link
Contributor

yomichi commented Sep 28, 2022

@yamato-m-csc
報告ありがとうございます。こちらでも確認しました。
1, 2 ともにPHYSBO 側の問題でした。

1 については、結果を表示する範囲がおかしくなっています。内部的にはちゃんと記録されています。
2 については、インタラクティブ実行の場合には内部モデル関数を更新するタイミングに問題があり、最後の実行結果が反映されていない状態でした。
ベイズ最適化自体は問題なく回っていますが、最後に事後分布などを確認したい場合には今回のように内部の不整合で落ちる状態です。
さしあたって、 get_post_fmean などを呼ぶ前に、

policy.bayes_search(max_num_probes=0)

と、0回で空回ししてください。

yomichi added a commit that referenced this issue Apr 5, 2023
@yomichi
Copy link
Contributor

yomichi commented Apr 5, 2023

Fixed in #51.

@yomichi yomichi closed this as completed Apr 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants