2025-01-14
(続き)
あとやることは…
・ballスケジュール「make_x」を仮定
・InitAiTypesPlayerの実装(🔺)
・InitAiTypesPlayerをmake_xに追加
・ChangeAiModePlayerの実装(✅)
・ChangeAiModePlayerをmake_xに追加…しない(トグルスイッチでかつデフォルトがTrainの為)(✅)
・ChangeTravelModePlayerの実装(✅)
・ChangeTravelModePlayerをmake_xに追加しない(トグルスイッチでかつデフォルトがForwardの為)(✅)
・AiSettingsPlayerの実装
・AiSettingsPlayerを見ながら、TokenizerPlayerを作る。
・AiSettingsPlayerをmake_xに追加
・EmbeddingPlayerの実装
・EmbeddingPlayerをmake_xに追加
実装中のつぶやき
2025-01-18
やること
あとやることは…
・ballスケジュール「make_x」を仮定
・InitAiTypesPlayerの実装(🔺)
・InitAiTypesPlayerをmake_xに追加
・ChangeAiModePlayerの実装(✅)
・ChangeAiModePlayerをmake_xに追加…しない(トグルスイッチでかつデフォルトがTrainの為)(✅)
・ChangeTravelModePlayerの実装(✅)
・ChangeTravelModePlayerをmake_xに追加しない(トグルスイッチでかつデフォルトがForwardの為)(✅)
・AiSettingsPlayerの実装(✅)
・AiSettingsPlayerを見ながら、TokenizerPlayerを作る。(✅)
・AiSettingsPlayerをmake_xに追加(✅)
・EmbeddingPlayerの実装(✅)
・EmbeddingPlayerをmake_xに追加(✅)
・BallOfjectの、ScheduleOfScheduleに、「モードの分岐処理は、各々プレイヤー自体に実装してください。」と、冒頭に記入しておく。(✅)
・スケジュールモードのスケジュール(モード分岐)の実装(✅)
・そして、上記のスケジュール実装中で必要と認識し、仮定したプレイヤーの実装
・スケジュールの実装
…ちょっと待って、、、ScheduleOfScheduleでスケジュールモードを切り替えるより、スケジュールモードを切り替えるプレイヤーを作った方が良くない、、!?
わかった、ScheduleOfScheduleは
「このモードが終了した後に、このモードを実行する」
という概念のみにしよう。つまり、forやmodeのif分岐は、全てプレイヤーの方で実装すれば、ScheduleOfScheduleはものすごくスッキリしたものになる!!!(上記のやることリストをそのように改変済み)
2025-01-23
あとやることは、、
・BallOfjectの、ScheduleOfScheduleに、「モードの分岐処理は、各々プレイヤー自体に実装してください。」と、冒頭に記入しておく。(✅)
・スケジュールモードのスケジュール(モード分岐)の実装(✅)
・そして、上記のスケジュール実装中で必要と認識し、仮定したプレイヤーの実装
・スケジュールの実装
モード切り替えのペア実装が完了した。↓
// 最初はロードから。
if ("FirstMode" == this.ScheduleMode)
{
this.ScheduleMode = "ParamsLoadMode";
}
// Aiの推論設定
else if ("ParamsLoadMode" == this.ScheduleMode)
{
this.ScheduleMode = "SettingsOfPredictMode";
}
// 入力データのベクトル化
else if ("SettingsOfPredictMode" == this.ScheduleMode)
{
this.ScheduleMode = "ToVecOfXOfPredictMode";
}
// 推論を開始する
else if ("ToVecOfXOfPredictMode" == this.ScheduleMode)
{
this.ScheduleMode = "OnePositionLoopOfPredictMode"; // eosトークンで抜ける
}
// 大臣と情報交換する(推論結果とサンプルデータのやり取り)
else if ("OnePositionLoopOfPredictMode" == this.ScheduleMode)
{
this.ScheduleMode = "SNSWithDaijinMode"; // eosトークンで抜ける
}
// Aiの設定(訓練としての設定)
else if ("SNSWithDaijinMode" == this.ScheduleMode)
{
this.ScheduleMode = "SettingsOfTrainMode";
}
// 入力データとラベルデータの、ベクトル化
else if ("SettingsOfTrainMode" == this.ScheduleMode)
{
this.ScheduleMode = "ToVecOfXandTMode";
}
// 学習開始
else if ("ToVecOfXandTMode" == this.ScheduleMode)
{
this.ScheduleMode = "OnePositionLoopOfTrainMode";
}
// パラメータのセーブ(セーブするしないの判断処理を含む)
else if ("OnePositionLoopOfTrainMode" == this.ScheduleMode)
{
this.ScheduleMode = "ParamsSendToHomePCMode";
}
// 推論設定に戻る(ループする) ループだけどこっちが正規ルートの為実装。
else if ("ParamsSendToHomePCMode" == this.ScheduleMode)
{
this.ScheduleMode = "SettingsOfPredictMode";
}
(ヤバっ、私の神的デザインパターンがバレるぅ💕)
未実装のモードの実装へ。
未実装のモード群
(実装次第チェック)
FirstMode(✅)
ParamsLoadMode()
SettingsOfPredictMode
ToVecOfXOfPredictMode
OnePositionLoopOfPredictMode
SNSWithDaijinMode
SettingsOfTrainMode
ToVecOfXandTMode
OnePositionLoopOfTrainMode
ParamsSendToHomePCMode
2025-01-23
やることリスト
FirstMode(✅)
ParamsLoadMode
→ これは内部で(
class BitEncoderDecoderPlayer(仮)
def FlattenAndEncodeToBits
def UnpackFromBitArray
)の実装が必要()
SettingsOfPredictMode
ToVecOfXOfPredictMode
OnePositionLoopOfPredictMode
SNSWithDaijinMode
SettingsOfTrainMode
ToVecOfXandTMode
OnePositionLoopOfTrainMode
ParamsSendToHomePCMode
スケジュールの実装()
InstallFromParams2DcodePlayer
は、
- エンコード(1行25bitの行列でデータを作る)プレイヤーを実行
- AiSettingsPlayerに渡す
の2つだけかな?
→でも、エンコード、デコードはプレイヤーでまとめたいよ…
2025-01-25~
試行錯誤中(https://chatgpt.com/g/g-kuufVcS5H-miraitoriko/c/67939986-7220-8012-b7d0-a4ca3710fff0)
・モードのスケジュールが完了
・仮定義したスケジュールの実装
・仮定義したプレイヤーの実装
・_BitEncoderDecoderPlayerの実装中
・
チェックリスト
[✅] FirstMode
[✅] ParamsLoadMode
[✅]_BitEncoderDecoderPlayer
[✅]FlattenAndEncodeToBits メソッド
[✅]UnpackFromBitArray メソッド
▷(https://chatgpt.com/g/g-kuufVcS5H-miraitoriko/c/6797df6c-8aac-8012-abea-3abf2bef8dfe)
▷ BitEncoderDecoderPlayerは、全てのパラメータを、ひとつの1次元ジャグにまとめて出力するメソッド、またその1次元ジャグをデコードロードするメソッドを持たせました。
なので、2Dcodeデータ ⇔ モデルParams のやり取りができるプレイヤーです。
[✅]OptimizerPlayerの実装
[🔺]作られたParamsのBit配列を、2Dcodeの限界容量毎にスプリットした2次元リストの作成(エンコード)するメソッド、それをデコードするメソッドを持った、新しいBitArraySplitterPlayerの実装
▷ 2Dコードの限界容量を取ってこよう(⚠️手間と判断。デバッグ時に実装する。)
[✅] // 二次元Bit配列からひとつ取り出すPlayerの実装
[] t_QRCodeErrorCorrectionAndMaskPlayerDir は多分使ってないですね、、。明確に使っていないことを確認する
[✅] // 二次元Bit配列にデータが無くなり次第(先頭のデータがnullになり次第)、次のモードを設定するPlayer の、実装(プレイヤーじゃないかも。)
[✅] // 二次元ジャグ化したら、各行の先頭にインデックスを加える(paddingSize=3 #100<1000枚程のテクスチャ使うから。) の実装
[✅]そのプレイヤーでエンコードされたデータを、forで回して沢山の2Dcodeを生産する形に、Modeを作り直し。
[✅] 二次元ジャグ化したら、各行の先頭にindexを追加する機能をどうにか入れる(BitArraySplitterPlayerに機能を追加する形にしよう。)
[✅] ParamsToBitDataModeのプレイヤー群のMainの再確認
[🔺]学習結果を今回保存するしないの判断をプレイヤーでやり、モード分岐をする。(保存するしないの条件だけ未実装)(ParamsSaveFlagControllingPlayerとして実装中…)
[✅]プレイヤー同士のクラス変数の渡し合いの実装
(
ParamsToBitDataMode(encode時、入力される二次元ジャグのindexがバラバラでも対応できるように改良もした)(✅)
BitDataTo2DcodeMode(
BitArrayFirstToEndHandlerPlayer(✅)
ChecksumPlayer(
ExtractedDataはstring型にしてこのプレイヤーに処理させなくちゃ。このプレイヤーでやる。関数を作った。
) (✅)
QRCodeMapInitializerPlayer (✅)
QRCodePositionDetectionPlayer (✅)
QRCodeTimingPatternPlayer (✅)
QRCodeAlignmentPatternPlayer (✅)
QRCodeMarkingPlayer (
あれっ、引き継ぎがへん、確認開始
QRCodeMarkingPlayer の変数の取得は次の通りに書かれている。
// 前のプレイヤーからデータを取得
ModeCharNumInfoChecksumBitlist = QRCodeAlignmentPatternPlayer.ModeCharNumInfoChecksumBitlist;
Version = QRCodeAlignmentPatternPlayer.Version;
GridSize = QRCodeAlignmentPatternPlayer.GridSize;
QRCodeMap = QRCodeAlignmentPatternPlayer.QRCodeMap;
全ての変数は、1つ前のプレイヤーである「QRCodeAlignmentPatternPlayer」から取得しているようだ。
全ての変数しっかり存在しているか確認しよう。
?QRCo・・・ernPlayerに存在?
ModeCharNumInfoChecksumBitlist(❌)
Version(❌)→versionは存在
GridSize(❌)→ gridSizeは存在
QRCodeMap(❌)→ qrCodeMapは存在
# 修正に取り掛かる
ModeCharNumInfoChecksumBitlist(❌)
→これは厄介ね。過去の自分のまとめ方を思い出しながらいこう。
現在、
・データ
・QRCodeMap
のふたつを作成中。ModeCh・・・Bitlistは後者と思われる。
ChecksumPlayer にこの同じ名前の変数がある!
Version(✅)
gridSize(✅)
qrCodeMap(✅)
)(✅)
WriteMainDataPatternPlayer (✅)
QRCodeMaskApplicatorPlayer (✅)
QRCodeErrorCorrectionAndMaskPlayer (🔺(多分入力変数不要))
QRCodeFormatInfoInserterPlayer (✅)
QRCodeTextureManagerPlayer(🦌)
)
[✅] ParamsToBitDataMode は、一次元ジャグ化するためのモード、とスケジュールにはメモされているけれど、本当に?確かめる。ParamsToBitDataModeで実行されている内容は…(
InitFromQrcodePlayer(AllParamsを一次元ジャグ化)(✅)
ParamsSaveFlagControllingPlayer(全開セーブ時刻から時間経過した時 かつ左大臣がワールドに存在した時に🚩を立てる)(🔺)
QRCodeModePlayer(モードを数字に変えるだけ)(✅)
QRCodeCharacterCountPlayer(CalculateBitCount() が
"0010" (英数字モード) → 9ビット、、
などの初期化設定。具体的にモードごとのビット数を決定して、指定された長さでゼロ埋めしたビット列を生成。最終的には、
モード指示子と文字数ビット列を結合して、最終的なビット出力を
outputBits に格納。設定と最初のbitの用意だけなので、問題は無し)(✅)
QRCodeBitConversionPlayer(データをbitに変換するプレイヤー)(✅)
BitArraySplitterPlayer (QRの最大容量ごとにスプリットし、二次元ジャグ化しているプレイヤー)(✅)
)
[✅] Alphanumericモードは、
「
0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
スペース $ % * + - . / :
」
しか変換ができないのだそう。なので、BitEncoderDecoderPlayer内では、アライメントをすべて「スペース $ % * / : 」のどれかにする様な改良が必要。修正した。README.mdにも「tokenizerにはalphabet飲みを使用してください」と記した。
[✅]あれ?AllParamsは二次元ジャグ。QRにするための一次元ジャグ化はどこ?(BitEncoderDecoderPlayerだ。でもこのプレイヤーはスケジュール内には存在させずに、ライブラリとして利用した気がする…使用している箇所を突き止める▷使っていなかった。BitEncoderDecoderPlayerをどうにか実装する。)(エンコードメソッドをInitFromQrcodePlayerResetのメインメソッドに実装した。)
[✅]思い返すと、重みやバイアスのなにか保存する時、文字列とfloat混ぜた気がするから、確認と修正(encode時にはstr化、Decode時には元に戻していたから問題なし)
### モードの作成と必要なプレイヤーの実装
▶︎モードスケジュールを上から見ていきます。([✅]スケジュールを整理しました。)
[✅]YoutubeQRsChangeToArray2DMode ▷⚠️"ball"にスケジュールを作っていこう、つまりプレイヤーは仮定物。メモした紙を見ながらスケジュール
// YouTubeの必要画面を
// 全てスクリーンショットし、
// それからQRを全てデコードし、
// Array2Dに変換するまで。
// 「YoutubeQRsChangeToArray2DMode」
// [仮]init_YoutubeQRChangeToArray2DModePlayer // QRcodeの数を元にスクリーンショット1枚あたりの全てのQRの座標をリスト化, スクリーンショットの最大枚数は何枚なのか、を、メンバ変数として持たせる
// [仮]YoutubeScreenShotsPlayer // 最大枚数集まるまでスクリーンショットする(既に集まっていればパス)
// [仮]ScreenShootSelectingPlayer // 自分が処理すべきスクリーンショットを選択する
// [仮]QRcodeSelectingPlayer // 自分が処理すべきQRcodeを抜き取り選択する
// CentralSquareReaderPlayer // 抜き取ったQR含有テクスチャからQR部分を取り出す。(この時点でまだQRの台形歪みは未処理)
// TrapezoidCorrectionPlayer // QR コードの台形歪みを補正し、25x25 の正方形マトリックスにリサイズするプレイヤー。
// PatternDetectionPlayer // QR コードの画像を取得し、それを 25x25 のバイナリマトリックスに変換して、主要なパターン(位置検出パターン、タイミングパターン、ダークモジュール)が正しく存在するかを検出するプレイヤー。
// ReplacePatternPlayer // QR コードの 2D マトリックスにおける主要なパターン(位置検出パターン、タイミングパターン、ダークモジュールを特定の値(-11)で置き換えるプレイヤー。
// ColumnSplitterConcatPlayer // QR コードの 2D マトリックスに対して特定の処理を行い、新しいジャグ配列を作成するプレイヤー。
// RightBottomReaderPlayer // QRコードデータの2Dリストを解析し、右下からデータを抽出して1Dリストとして取得するプレイヤー。
// BitDataProcessorPlayer // QRコードや画像データから取得したビットデータを処理し、8ビットごとに分割する役割を持つプレイヤー。
// ChecksumCheekPlayer // ChecksumCheekPlayer は、QRコードのデータ処理後にチェックサムの整合性を確認するプレイヤー。
// SpiritBitDataPlayer // QRコードのデータ部分を解析し、モードや文字数情報を取得するプレイヤー。
// BitModeDataReconstructorPlayer // QRコードのビットモードデータを復元するプレイヤー。
// [仮] WaitressQRDataWritingSchedulerPlayer // 復元したデータをウェイトレスの帳簿に書き込み、次のユーザーに(ウェイトレスがいなければ、ウェイトレスが来るまで "Complete" を返さず、待機。さらに、全てのQRの読み込みが終わったことがウェイトレスから告げられたら、"Completed"とし、読み込み完了とする。
)
☆SNSBy1byteFromTexturePlayerTypesの作成
[🦌] SNSBy1byteFromTexturePlayerTypes(
[🦌] init_SNSBy1byteFromTexturePlayerTypesPlayer
[🦌] EncodePush_a_IntToTexturesPlayer
[🦌] PullDecode_a_TexturesToIntPlayer
)
[🦌] YoutubeQRsChangeToArray2DModeのクラス変数の受け渡し受け取りの確認と、未実装プレイヤーの実装(
[] init_YoutubeReaderPlayer
YoutubeScreenShotsPlayer
ScreenShootSelectingPlayer
QRcodeSelectingPlayer
CentralSquareReaderPlayer
TrapezoidCorrectionPlayer
PatternDetectionPlayer
ReplacePatternPlayer
ColumnSplitterConcatPlayer
RightBottomReaderPlayer
BitDataProcessorPlayer
ChecksumCheekPlayer
SpiritBitDataPlayer
BitModeDataReconstructorPlayer
WaitressQRDataWritingSchedulerPlayer
)
[]SettingsOfPredictMode
▷ ParamsLoadModeの次に実行されるものですね。 Aiの推論設定です。
[]ToVecOfXOfPredictMode
[]OnePositionLoopOfPredictMode
[]SNSWithDaijinMode
[]SettingsOfTrainMode
[]ToVecOfXandTMode
[]OnePositionLoopOfTrainMode
[]ParamsSendToHomePCMode
[]プレイヤー同士のクラス変数の渡し合いの実装
[✅] ParamsToBitDataMode
▷パラメータをBit一次元化と、それをQRCodeサイズにスプリットして2次元化
[✅] BitDataTo2DcodeMode
▷2次元Bitパラメータを全てQRcodeテクスチャ化
[]