<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>python | 背景</title>
	<atom:link href="https://moonpeta.com/category/programming/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://moonpeta.com</link>
	<description></description>
	<lastBuildDate>Wed, 02 Aug 2023 11:00:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://moonpeta.com/wp-content/uploads/2023/10/cropped-wraith_logo_ribon_pink-32x32.png</url>
	<title>python | 背景</title>
	<link>https://moonpeta.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Loupedeck liveでYouTube musicを使いこなす！</title>
		<link>https://moonpeta.com/tips/youtubemusic_loupedeck/</link>
					<comments>https://moonpeta.com/tips/youtubemusic_loupedeck/#respond</comments>
		
		<dc:creator><![CDATA[フローラ]]></dc:creator>
		<pubDate>Wed, 28 Jun 2023 02:13:28 +0000</pubDate>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Loupedeck live]]></category>
		<category><![CDATA[YouTube Music]]></category>
		<guid isPermaLink="false">https://www.fruity-floral.com/?p=2805</guid>

					<description><![CDATA[　Loupedeck live買いました！　whooooooo!! 　ところで私は普段、音楽を聞くときYouTube musicを使っています。YouTube Musicってブラウザから操作するのめちゃくちゃめんどくさい [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Loupedeck live買いました！　whooooooo!!</p>



<figure class="wp-block-image size-large is-resized"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-12.png"><img fetchpriority="high" decoding="async" src="https://moonpeta.com/wp-content/uploads/2023/06/image-12-1024x673.png" alt="" class="wp-image-2876" width="840" height="552" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-12-1024x673.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-12-300x197.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-12-768x505.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image-12-1536x1009.png 1536w, https://moonpeta.com/wp-content/uploads/2023/06/image-12-2048x1345.png 2048w" sizes="(max-width: 840px) 100vw, 840px" /></a><figcaption class="wp-element-caption">kakkoii</figcaption></figure>



<p>　ところで私は普段、音楽を聞くときYouTube musicを使っています。YouTube Musicってブラウザから操作するのめちゃくちゃめんどくさいですよね。<br>　今回YouTube musicライフを快適にするために、Loupedeck liveを使ってYouTube musicの操作を行えるようにしたので紹介します。<br>　OSはwindows 11です。</p>



<p>　以下で紹介する情報の中には古いバージョン特有のものもあるかと思うので、最新情報を確認するのがいいと思います。</p>







<h3 class="wp-block-heading"><span id="toc1">この記事の内容でできるようになること</span></h3>



<ul class="wp-block-list">
<li>基本的な再生、停止、スキップ、シャッフル、ループの切り替えなど</li>



<li>10秒スキップ、10秒バック</li>



<li>特定の曲をワンプッシュで再生</li>



<li>特定のプレイリストの曲をワンプッシュで再生</li>



<li>特定のプレイリストをランダムにワンプッシュで再生</li>
</ul>



<h3 class="wp-block-heading"><span id="toc2">YouTube Music Desktop Appをインストール</span></h3>



<p>　まずYouTube Music Desktop Appをインストールしましょう。ブラウザのYouTube Musicを使うよりこれを入れたほうが色々できるようになります。<br>　以下のリンクにアクセス</p>



<p> <a rel="noopener" target="_blank" href="https://github.com/ytmdesktop/ytmdesktop" data-type="URL" data-id="https://github.com/ytmdesktop/ytmdesktop">https://github.com/ytmdesktop/ytmdesktop<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>



<p>　Available forというところのBinariesを押す。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image.png"><img decoding="async" src="https://moonpeta.com/wp-content/uploads/2023/06/image-1024x477.png" alt="" class="wp-image-2809" width="840" height="391" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-1024x477.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-300x140.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-768x358.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image.png 1262w" sizes="(max-width: 840px) 100vw, 840px" /></a></figure>



<p>　インストールしたいバージョンのインストーラーをAssetsからダウンロードする。記事公開時点での安定版はv1.13.0でした。再生やスキップなどの基本的な機能はこれで問題ないですが、<strong>特定の曲や特定のプレイリストをLoupedeckから再生したい場合</strong>は、プレリリース版のv1.14.2をインストールする必要がありました。</p>



<figure class="wp-block-image size-large"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-1.png"><img decoding="async" width="1024" height="513" src="https://moonpeta.com/wp-content/uploads/2023/06/image-1-1024x513.png" alt="" class="wp-image-2810" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-1-1024x513.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-1-300x150.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-1-768x385.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image-1-1536x769.png 1536w, https://moonpeta.com/wp-content/uploads/2023/06/image-1.png 2005w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>　あとは適当にインストールする。<br>　インストールが終わったらログインとかは適当にやり、設定画面を開く</p>



<figure class="wp-block-image size-large"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-2.png"><img loading="lazy" decoding="async" width="1024" height="424" src="https://moonpeta.com/wp-content/uploads/2023/06/image-2-1024x424.png" alt="" class="wp-image-2811" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-2-1024x424.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-2-300x124.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-2-768x318.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image-2.png 1100w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>　連携のリモコンサーバーをONにする。</p>



<p>　これでYouTube Music Desktop Appの導入は完了です。</p>



<h3 class="wp-block-heading"><span id="toc3">Loupedeckにプラグイン導入</span></h3>



<p>　Loupedeckのアプリを開き、Marketplaceを開きます。そしてyoutubeと入力して、プラグインからYoutube Music Desktopというのをインストールします。</p>



<figure class="wp-block-image size-large"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-3.png"><img loading="lazy" decoding="async" width="1024" height="641" src="https://moonpeta.com/wp-content/uploads/2023/06/image-3-1024x641.png" alt="" class="wp-image-2812" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-3-1024x641.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-3-300x188.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-3-768x481.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image-3.png 1417w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-4.png"><img loading="lazy" decoding="async" width="992" height="633" src="https://moonpeta.com/wp-content/uploads/2023/06/image-4.png" alt="" class="wp-image-2813" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-4.png 992w, https://moonpeta.com/wp-content/uploads/2023/06/image-4-300x191.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-4-768x490.png 768w" sizes="(max-width: 992px) 100vw, 992px" /></a></figure>



<p>　ステータスが準備完了になってればOKです。準備完了にならない場合はYouTube Music Desktop Appがインストールされていること、設定の確認、再起動などしてみてください。</p>



<h3 class="wp-block-heading"><span id="toc4">この段階でできること</span></h3>



<p>　あとは別のプラグインなどと同じく、Loupedeckのボタンやつまみに割り当てれば使えるようになります。<br>具体的にできることが知りたい場合は以下を参照。</p>



<p> <a rel="noopener" target="_blank" href="https://help.xeroxdev.de/en/loupedeck/ytmd/home">https://help.xeroxdev.de/en/loupedeck/ytmd/home<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>



<p>　一応最低限のことはこれでできるようになるんですが、特定の曲を再生したり特定のプレイリストを再生したりといったことはできないんですよね。ちょっと機能は少なめ。spotifyとかはLoupedeckの公式対応だから、それと比べるとちょっと劣るかも（使ったことないけど）。</p>



<h3 class="wp-block-heading"><span id="toc5">10秒スキップ、10秒バックしたい</span></h3>



<p>　YouTube Music Desktop AppのAPIでは10秒スキップ、10秒バックができます。ただしプラグインだとなんでか10秒スキップ、10秒バックができないんですよね。これは初音ミクの消失を聞くときに高確率で欲しくなる機能なので欲しいです。<br>　そんなわけで、APIを直接呼び出してできるようにしました。例えば10秒バックは以下のようなコードを適当な場所に配置して</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import requests
import json

requests.post(&#39;http://localhost:9863/query&#39;, data=json.dumps({&quot;command&quot;:&quot;player-rewind&quot;}))</code></pre></div>



<p>　Loupedeckの「実行」を選んで以下のように書けばOKです。pythonのあとに||が必要なことに注意。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>python|| &lt;ファイルへの絶対パス&gt;</code></pre></div>



<p>　プラグインにもとからある機能と比べると若干レスポンスが悪くはなりますが、まあしょうがないです。私はつまみにアサインしました。余分に回せばたくさんスキップしたり戻ったりすることもできます。実行時にウィンドウが表示されるのが嫌な場合はpythonをpythonwに書き換えるといいと思います。<br>　プラグインでサポートされていないけどYouTube Music Desktop AppのAPIでサポートされていることは同じように実行できると思います。</p>



<h3 class="wp-block-heading"><span id="toc6">特定の曲、特定のプレイリストを再生するボタンを作る</span></h3>



<p>　ボタン一発で特定のプレイリストの再生を開始する、というやつを作りたいです。</p>



<p>　YouTube Music Desktop AppはURIでコントロールすることができます。具体的には以下の画像参照(上で貼ったgithubリンクのwikiにある)。</p>



<figure class="wp-block-image size-large"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-5.png"><img loading="lazy" decoding="async" width="1024" height="709" src="https://moonpeta.com/wp-content/uploads/2023/06/image-5-1024x709.png" alt="" class="wp-image-2816" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-5-1024x709.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-5-300x208.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-5-768x532.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image-5.png 1386w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>　ここで &lt;Video_Id&gt;や&lt;Playlist_Id&gt;はyoutube musicをブラウザで開いたときURLに出てくるやつです。<br>　例えばURLがこんな感じなら</p>



<figure class="wp-block-image size-full"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-8.png"><img loading="lazy" decoding="async" width="882" height="56" src="https://moonpeta.com/wp-content/uploads/2023/06/image-8.png" alt="" class="wp-image-2819" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-8.png 882w, https://moonpeta.com/wp-content/uploads/2023/06/image-8-300x19.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-8-768x49.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></a></figure>



<p>　<strong>bj4nuPCRDxg</strong> がVideo_Idで、<strong>PL_0A0t0-Y0ANo9NZV4LRSUzIus8JkmHEK</strong> がPlaylist_Idになります。つまりこの曲を再生したいなら「ytmd://play/bj4nuPCRDxg」、この曲をこのプレイリストで再生したいなら「ytmd://play/bj4nuPCRDxg/PL_0A0t0-Y0ANo9NZV4LRSUzIus8JkmHEK」にブラウザからアクセスすればできます。<br>　Loupedeckで実行するには、「ウェブページ」を選んでURIを入れて実行するようにすればいいです。<br>　ちなみにv1.13.0ではURIで実行することができなかったので、これをやりたい場合はv1.14.2をインストールする必要があります。</p>



<h3 class="wp-block-heading"><span id="toc7">プレイリストの曲をランダムに再生する</span></h3>



<p>　上記の方法ではプレイリストを再生するときに特定の曲も指定しなければならず、必ず同じ曲から再生されることになってしまいます。この記事公開時点ではランダムな曲からプレイリストを再生する方法はありませんでした。<br>　ランダムな曲からプレイリストの再生を開始する一番簡単な方法はマクロでやることだと思います。つまり「固定された曲からプレイリスト再生」-&gt;「シャッフル」-&gt;「次の曲に行く」というマクロを組めばいいです。ただやってみた感じ個人的になんか微妙だったので、ちゃんとランダムな曲から再生するやつを作りました。 以下の公開します。ただ<strong>将来アプリが更新されたら機能追加される可能性も高いので、真似する前にYouTube Music Desktop Appの更新情報を確認することを推奨します。</strong></p>



<p>　プレイリストからランダムに曲を再生するコードです。ただしこの例ではvideo_ids_in_playlist.jsonに予めplaylist idとプレイリスト内のすべての曲のvideo idのリストが格納されているものとします。コマンドライン引数で与えられたプレイリストの名前をkeyにplaylist idとvideo idのリストを取ってきて、ランダムに再生を開始しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import sys
import os
import json
import random
import webbrowser

#ディレクトリは適当に設定してね
with open(os.path.dirname(sys.argv[0]) + &#39;/json/video_ids_in_playlist.json&#39;, &#39;r&#39;) as f:
	data = json.load(f)

playlist_id = data[sys.argv[1]][0]
now_video_id = data[sys.argv[1]][1][random.randrange(len(data[sys.argv[1]][1]))]

uri = f&quot;ytmd://play/{now_video_id}/{playlist_id}&quot;
webbrowser.open(uri)
</code></pre></div>



<p>　ランダムに再生開始の曲が決定され、そのあとはプレイリストを順番に再生していきます。もしランダムに再生したい場合はLoupedeckのマクロでシャッフルを入れるか、コード内でシャッフルを入れるかすればできます。</p>



<p>　あとは以下の感じでやる。</p>



<figure class="wp-block-image size-full"><a href="https://moonpeta.com/wp-content/uploads/2023/06/スクリーンショット-2023-06-27-170637.png"><img loading="lazy" decoding="async" width="836" height="570" src="https://moonpeta.com/wp-content/uploads/2023/06/スクリーンショット-2023-06-27-170637.png" alt="" class="wp-image-2830" srcset="https://moonpeta.com/wp-content/uploads/2023/06/スクリーンショット-2023-06-27-170637.png 836w, https://moonpeta.com/wp-content/uploads/2023/06/スクリーンショット-2023-06-27-170637-300x205.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/スクリーンショット-2023-06-27-170637-768x524.png 768w" sizes="(max-width: 836px) 100vw, 836px" /></a></figure>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>python|| &lt;ファイルの絶対パス&gt; playlist_name</code></pre></div>



<p>　jsonファイルのkeyになるplaylist_nameを指定する必要があります。</p>



<h4 class="wp-block-heading"><span id="toc8">プレイリスト情報の更新</span></h4>



<p>　上記の方法でランダムにシャッフルすることができるんですが、予めプレイリストに含まれる曲のvideo idのリストを持っておく必要があります。記事更新時点ではYouTube Music Desktop Appの機能を使ってvideo idのリストを取得することはできませんでした。もちろん手動で作成することはできますが、曲数が多いとかなりめんどくさく、かつプレイリストに曲を追加したら更新しないといけません（しなくてもその曲からスタートする確率が0になるだけなので、大した問題でもないが）。<br>　そこでYouTube Data APIを使ってあるプレイリストに含まれている曲のvideo idリストを取得するプログラムを作りました。以下のコードを動かすには予めYouTube Data APIの設定を行いAPI keyを取得しておく必要があるので注意してください。YouTube Data APIの設定とかは別のサイトとか参照。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from apiclient.discovery import build
import os
import sys
import json

# 更新対象のプレイリストIDのリスト。これはブラウザでYoutube musicにアクセスしてリンクから確認してね。
playlist_ids = {&quot;プレイリストの名前1&quot;: &quot;playlist_id1&quot;, &quot;プレイリストの名前2&quot;, &quot;playlist_id2&quot;, ...}

def get_video_id_in_playlist(youtube, playlist_id) -&gt; list:
	video_id_list = []

	playlistitems_list_request = youtube.playlistItems().list(playlistId=playlist_id, part=&quot;snippet&quot;, maxResults=50)

	while playlistitems_list_request:
		playlistitems_list_response = playlistitems_list_request.execute()

		for playlist_item in playlistitems_list_response[&quot;items&quot;]:
			video_id_list.append(playlist_item[&quot;snippet&quot;][&quot;resourceId&quot;][&quot;videoId&quot;])

		playlistitems_list_request = youtube.playlistItems().list_next(
			playlistitems_list_request, playlistitems_list_response)

	return video_id_list


def main():

	API_KEY = &quot;&lt;あなたのAPIキー&gt;&quot;

	youtube = build(&#39;youtube&#39;, &#39;v3&#39;, developerKey=API_KEY)

	result = {}
	for key, playlist_id in playlist_ids.items():
		r = [playlist_id]
		r.append(get_video_id_in_playlist(youtube, playlist_id))
		result[key] = r

　#ディレクトリは適当に設定してね
	with open(os.path.dirname(sys.argv[0]) + &#39;/json/video_ids_in_playlist.json&#39;, &#39;w&#39;) as f:
		json.dump(result, f)


if __name__ == &quot;__main__&quot;:
	main()</code></pre></div>



<p>　上記のプログラムを実行する際、対象のプレイリストが公開あるいは限定公開になっていることが必要なので注意してください。これで生成したファイルが、ひとつ上に書いたプレイリストのランダム再生に使うファイルになっています。<br>　このプログラムもLoupedeckに登録することで、ワンプッシュで実行できるようにしました。曲を追加したときとかに1回ポチってやればOKです。</p>



<h3 class="wp-block-heading"><span id="toc9">まとめ。</span></h3>



<figure class="wp-block-image size-large"><a href="https://moonpeta.com/wp-content/uploads/2023/06/image-13.png"><img loading="lazy" decoding="async" width="1024" height="417" src="https://moonpeta.com/wp-content/uploads/2023/06/image-13-1024x417.png" alt="" class="wp-image-2915" srcset="https://moonpeta.com/wp-content/uploads/2023/06/image-13-1024x417.png 1024w, https://moonpeta.com/wp-content/uploads/2023/06/image-13-300x122.png 300w, https://moonpeta.com/wp-content/uploads/2023/06/image-13-768x313.png 768w, https://moonpeta.com/wp-content/uploads/2023/06/image-13.png 1493w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>　最終的にこんな感じになりました！　右の縦3列はプレイリスト再生用、また追加予定。画面を開かなくてもYouTube Musicの操作ができるというのはものすごく便利です！　最強！</p>



<p>　あとはライブラリの画面に一発アクセスできるようになれれば超便利そうなんですが、できるのか不明です。更新求む！</p>



<h3 class="wp-block-heading"><span id="toc10">本日の作業用BGM</span></h3>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Love Words IV" width="1256" height="942" src="https://www.youtube.com/embed/PYFgPuVfrzs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://moonpeta.com/tips/youtubemusic_loupedeck/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Graphvizで木をplotするときのrootの決め方</title>
		<link>https://moonpeta.com/tips/graphviztips1/</link>
					<comments>https://moonpeta.com/tips/graphviztips1/#respond</comments>
		
		<dc:creator><![CDATA[フローラ]]></dc:creator>
		<pubDate>Wed, 23 Feb 2022 10:49:27 +0000</pubDate>
				<category><![CDATA[python]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Graphviz]]></category>
		<category><![CDATA[tree]]></category>
		<guid isPermaLink="false">https://www.fruity-floral.com/?p=1528</guid>

					<description><![CDATA[　edgeを作るときにedge(root,other)という順番で入れる必要がある。 　root以外のnodeについても、rootからみて上にある方がuで下にある方がdならG.edge(u,d)という順番でいれるとうまく [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　edgeを作るときにedge(root,other)という順番で入れる必要がある。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>#0がroot
G=graphviz.Graph(format=&#39;png&#39;)
G.edge(&#39;0&#39;,&#39;1&#39;)
G.edge(&#39;0&#39;,&#39;2&#39;)
G.edge(&#39;1&#39;,&#39;3&#39;)
G.edge(&#39;1&#39;,&#39;4&#39;)
G.view()</code></pre></div>



<figure class="wp-block-image size-full"><a href="https://moonpeta.com/wp-content/uploads/2022/02/Graph1.png"><img loading="lazy" decoding="async" width="227" height="251" src="https://moonpeta.com/wp-content/uploads/2022/02/Graph1.png" alt="" class="wp-image-1531"/></a></figure>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>#同じ木で1がroot
G=graphviz.Graph(format=&#39;png&#39;)
G.edge(&#39;1&#39;,&#39;0&#39;)
G.edge(&#39;0&#39;,&#39;2&#39;)
G.edge(&#39;1&#39;,&#39;3&#39;)
G.edge(&#39;1&#39;,&#39;4&#39;)
G.view()</code></pre></div>



<figure class="wp-block-image size-full"><a href="https://moonpeta.com/wp-content/uploads/2022/02/Graph2.png"><img loading="lazy" decoding="async" width="275" height="251" src="https://moonpeta.com/wp-content/uploads/2022/02/Graph2.png" alt="" class="wp-image-1530"/></a></figure>



<p>　root以外のnodeについても、rootからみて上にある方がuで下にある方がdならG.edge(u,d)という順番でいれるとうまくplotされる。rootから深さ優先探索（もしくは幅優先探索）しながらplotしていくときれいになる。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://moonpeta.com/tips/graphviztips1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PyQUBOにおける3乗以上の項の扱い</title>
		<link>https://moonpeta.com/programming/pyqubotips/</link>
					<comments>https://moonpeta.com/programming/pyqubotips/#respond</comments>
		
		<dc:creator><![CDATA[フローラ]]></dc:creator>
		<pubDate>Tue, 09 Nov 2021 13:48:18 +0000</pubDate>
				<category><![CDATA[python]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[PyQUBO]]></category>
		<category><![CDATA[QUBO]]></category>
		<category><![CDATA[量子アニーリング]]></category>
		<category><![CDATA[量子コンピュータ]]></category>
		<guid isPermaLink="false">https://www.fruity-floral.com/?p=1291</guid>

					<description><![CDATA[　PyQUBOのドキュメント[1]には3乗以上の項の扱いがあまり詳しく書かれていなかったのでメモ書きしておきます。 　そもそもQUBOのQはQuadraticのQなのでコスト函数は2次形式でないといけないわけですが、現実 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　PyQUBOのドキュメント<a href="#1">[1]</a>には3乗以上の項の扱いがあまり詳しく書かれていなかったのでメモ書きしておきます。</p>



<p>　そもそもQUBOのQはQuadraticのQなのでコスト函数は2次形式でないといけないわけですが、現実問題として3乗以上の項が含まれたコスト函数を扱いたいときはあります。そういうときは変数の置き換えが必要になりますが、PyQUBOならそれは勝手にやってくれます。<br>　例えば一番シンプルな3次のコスト函数例として以下のコスト関数を考えてみます。</p>



\[
H(x,y,z)=\alpha xyz
\]



<p>　もちろん、ここで\(x,y,z\)は \(0\) か \(1\) のみを取ります。<br>　これをPyQUBOに入れてQUBOを生成してみます。ここではとりあえず\(\alpha=7\)としてます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>#プレースホルダー
alpha = Placeholder(&quot;alpha&quot;)
#変数
x, y, z = Binary(&quot;x&quot;), Binary(&quot;y&quot;), Binary(&quot;z&quot;)
#コスト函数
H = alpha * x * y * z
#コンパイル
model = H.compile()
#QUBOを生成
QUBO, offset = model.to_qubo(feed_dict = {&quot;alpha&quot;: 7})
#変数リスト
print(model.variables)
#QUBO
print(QUBO)</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="出力結果"><code>[&#39;x&#39;, &#39;y&#39;, &#39;z&#39;, &#39;0*1&#39;]
{(&#39;x&#39;, &#39;x&#39;): 0.0, (&#39;y&#39;, &#39;y&#39;): 0.0, (&#39;z&#39;, &#39;z&#39;): 0.0, (&#39;y&#39;, &#39;0*1&#39;): -10.0, (&#39;z&#39;, &#39;0*1&#39;): 7.0, (&#39;0*1&#39;, &#39;0*1&#39;): 15.0, (&#39;x&#39;, &#39;0*1&#39;): -10.0, (&#39;x&#39;, &#39;y&#39;): 5.0}</code></pre></div>



<p>　ここでmodel.variablesの出力を見てみると、0*1というものが現れています。これは私たちが定義した変数ではなくて、PyQUBOが次数を下げるために自動的に生成した変数であり、\(xy\)を置き換えたものです。ここでは\(0*1=w=xy\)と書くことにします。QUBOの出力結果だけを見てもよくわからないですが、実はPyQUBOが出力したコスト函数は以下のようになっています。</p>



\[
H_\mathrm{pyqubo}(x,y,z,w)=\alpha zw+S(xy-2xw-2yw+3w)
\]



<p>　ここでPyQUBOが生成したコスト関数\(H_\mathrm{pyqubo}(x,y,z,w)\)は、新たな変数\(w=xy\)を使って次数を下げたことにより、2次式になっていることがわかります。つまり変数を追加することでQUBOを定義できるようになりました。<br>　この式の第一項は \(w=xy\)ですので、もとのコスト函数であることがわかります。<br>　次に第二項の \(S\)に比例する項が何かというと、 \(w=xy\)を成り立たせるための制約項になっています。第二項はこの等号が成り立つときに0になり、成り立たないときには正のペナルティを与えるようになっていることがわかります。そして \(S\)は8行目のcompile()の引数strengthです。いまはcompile()に引数を与えずに実行したので、この場合はデフォルト引数のstrength=5が入ります。</p>



<p><br>　つまりPyQUBOは3次以上のコスト函数を与えたとき、変数をうまく置き換えて2次式に変換し、後ろに置き換えた変数に矛盾が起こらないための制約項を追加してくれます、便利ですね。<br>　もともとのコスト函数には全体に \(\alpha\)がかかっていますが、PyQUBOが生成したQUBOはそうなっていないことに注意してください。</p>



<h3 class="wp-block-heading"><span id="toc1">strengthの注意点</span></h3>



<p>　以下のようなコスト関数考えてみます。</p>



\[
H(x,y,z)=-2\alpha xyz+\alpha yz
\]



<p>　これをPyQUBOで生成したQUBOを使ってコスト函数に戻すと以下のようになります。</p>



\[
H_\mathrm{pyqubo}(x,y,z,w)=-2\alpha zw+\alpha yz+S(xy-2xw-2yw+3w)
\]



<p>　先程と同じように \(w:=xy\)を新たな変数として追加しています。 \(\alpha\)含みの項は明らかにもとのコスト函数部分で、 \(S\)含みの項は変数置き換えが矛盾しないように導入したペナルティで、先程と同じ表式になっています。<br>　ところでもともとのコスト函数の最小値は \(H(1,1,1)=-\alpha\) です。第一項を消えないようにするには \((x,y,z)=(1,1,1)\) しか許されず、この場合第二項が必ず残るからです。<br>　ところが、\(H_\mathrm{pyqubo}(x,y,z,w)\)では、第一項と第二項の第一項だけを生き残らせることができます。つまり</p>



\[
\begin{align}
H_\mathrm{pyqubo}(x,0,1,1)=-2\alpha+S(-x+3)
\end{align}
\]



<p>　となるときです。このとき\(S\)が小さければ元々の最小値\(-\alpha\)よりも小さい解が出てくる可能性があります。実際今考えてるコスト函数をそのままPyQUBOでQUBOを生成し計算すると、デフォルトの\(S\)は5なので、 \(\alpha\)が6以上だと誤った最小値を拾ってきます。もしくは\(\alpha=5\)だと、本来の最小値とコストは一致するが、変数を置き換えの制約を満たさないような組み合わせが出現します（ここら辺の数字の話は今回のコスト関数特有なので重要ではないですが、とにかく）。これを阻止するためには変数置き換えの制約を破ったときのペナルティ\(S\)つまり.compile(strength)のstrengthを十分大きくしましょうという話でした。</p>



<h3 class="wp-block-heading"><span id="toc2">参考文献</span></h3>



<p><div id="1">[1]<a rel="noopener" target="_blank" href="https://pyqubo.readthedocs.io/en/latest/index.html" data-type="URL" data-id="https://pyqubo.readthedocs.io/en/latest/index.html">PyQUBO公式ドキュメント<span class="fa fa-external-link external-icon anchor-icon"></span></a></div></p>



<h3 class="wp-block-heading"><span id="toc3">本日の作業用BGM</span></h3>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="【大人っぽく】エンヴィーベイビー【歌ってみた(cover)/ときのそら】" width="1256" height="707" src="https://www.youtube.com/embed/BQ76G9I3gIc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://moonpeta.com/programming/pyqubotips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
