2026年10月26日月曜日

unsigned char(8bit)× int16(16bit)のベクトル積

 unsigned charとint16のベクトル積のSSEコード

結論から言うと、unsigned char(8bit)× int16(16bit)のベクトル積を SSE2 で行うには、 「8bit → 16bit へのゼロ拡張」+「16bit × 16bit の乗算」 という 2 ステップ構成になります。

SSE2 には 8bit × 16bit の直接乗算命令は存在しないため、 unpack(ゼロ拡張)→ PMULLW(16bit multiply) が正解です。

最速の SSE2 コードを完成形で提示します。

🧩 unsigned char × int16 の SSE2 ベクトル積の正しい流れ

1. unsigned char(8bit)を 16bit にゼロ拡張

SSE2 の PUNPCKLBW / PUNPCKHBW を使う。

cpp
__m128i bytes = _mm_loadu_si128((__m128i*)uc);   // unsigned char × 16
__m128i zero  = _mm_setzero_si128();

// 下位8バイト → 16bit に拡張
__m128i uc_lo = _mm_unpacklo_epi8(bytes, zero);

// 上位8バイト → 16bit に拡張
__m128i uc_hi = _mm_unpackhi_epi8(bytes, zero);

これで:

  • uc_lo = 16bit × 8

  • uc_hi = 16bit × 8

に変換される。

2. int16 と 16bit × 16bit の乗算(PMULLW)

cpp
__m128i s16_lo = _mm_loadu_si128((__m128i*)i16);      // int16 × 8
__m128i s16_hi = _mm_loadu_si128((__m128i*)(i16 + 8)); // int16 × 8

// 16bit × 16bit の乗算(下位16bit)
__m128i prod_lo = _mm_mullo_epi16(uc_lo, s16_lo);
__m128i prod_hi = _mm_mullo_epi16(uc_hi, s16_hi);

_mm_mullo_epi16(PMULLW)は:

  • signed 16bit × signed 16bit → 下位 16bit を返す

unsigned char はゼロ拡張しているので signed として扱っても問題なし。

✔ 完成形:unsigned char × int16 の SSE2 ベクトル積コード

cpp
void mul_uc_i16_sse(const unsigned char* uc, const int16_t* s16,
                    int16_t* out)
{
    __m128i bytes = _mm_loadu_si128((__m128i*)uc);
    __m128i zero  = _mm_setzero_si128();

    // 8bit → 16bit ゼロ拡張
    __m128i uc_lo = _mm_unpacklo_epi8(bytes, zero);
    __m128i uc_hi = _mm_unpackhi_epi8(bytes, zero);

    // int16 をロード
    __m128i s16_lo = _mm_loadu_si128((__m128i*)s16);
    __m128i s16_hi = _mm_loadu_si128((__m128i*)(s16 + 8));

    // 16bit × 16bit の乗算
    __m128i prod_lo = _mm_mullo_epi16(uc_lo, s16_lo);
    __m128i prod_hi = _mm_mullo_epi16(uc_hi, s16_hi);

    // 結果をストア
    _mm_storeu_si128((__m128i*)out,     prod_lo);
    _mm_storeu_si128((__m128i*)(out+8), prod_hi);
}

2026年10月24日土曜日

飽和演算

unsigned char同士の演算で負の場合0になるSSE命令は?

結論だけ先に言うと、unsigned char(8bit)同士の演算で「負になったら 0 に飽和する」SSE 命令は存在します。 それは SSE2 の saturating subtract for unsigned bytes:

PSUBUSB(Packed SUBtract Unsigned Saturate Bytes) → 8bit の unsigned subtract で、結果が負になる場合 0 に飽和する。

🔍 なぜ PSUBUSB が該当するのか

SSE2 には「飽和演算(saturating arithmetic)」があり、特に unsigned byte に対しては:

  • PSUBUSB:a - b が負なら 0 に clamp

  • PADDUSB:a + b が 255 を超えたら 255 に clamp

あなたの質問は「unsigned char 同士の演算で負の場合 0 になる SSE 命令」なので、 まさに PSUBUSB がそのものです。

🧠 補足:Intel の saturating arithmetic の仕様

検索結果(Arm の saturating arithmetic の一般仕様)では:

unsigned saturating operation では、結果が negative なら 0 になる

と説明されています。 x86 SSE2 でも同じ概念があり、unsigned byte subtract の saturating 版が PSUBUSB です。

📌 使用例(C/C++ intrinsics)

cpp
#include <emmintrin.h>

__m128i a = _mm_set1_epi8(10);
__m128i b = _mm_set1_epi8(20);

// 10 - 20 = -10 → saturate to 0
__m128i r = _mm_subs_epu8(a, b);

_mm_subs_epu8 が PSUBUSB に対応します。

2026年10月20日火曜日

Q.登録マイクロソフトアカウント(買い切り版)の変更

Q.登録アドレス(買い切り版)ですが、県の規制があり、

 xxx@pref.xxxxxxx.lg.jp 

がうまくマイクロソフトアカウントに登録できないことがわかりました。

そこで、代替の

xxx@outlook.jp 

に登録の変更をお願いいたします。

こちらは、すでにマイクロソフトアカウントを取得済のアドレスになります。

Ans.

変更しました。明日には、有効になっている可能性が高いと思います。明日以降、お送りしたインストールマニュアルに従ってトライしてみてください。


2026年10月19日月曜日

上界と最大の違い

 結論だけ先に言うと、「上界(upper bound)」は“解の値の保証”であり、

「最大(max 制約)」は“変数の許容量の上限”であって、まったく別物。

🎯 一言で区別

  • 上界(upper bound): 目的関数の値について「これ以上は小さくできない/大きくできない」という 探索木全体に対する評価値。

  • 最大(max 制約): あるリソースや変数が「これ以上使ってはいけない」という モデル内の制約式。

📌 もう少し厳密に:最適化の文脈での違い

1. 上界(Upper Bound)

最適化(特に Branch-and-Bound / Branch-and-Price)で使う概念。

  • 最小化問題なら 上界 = 現時点での最良実行可能解の値

  • 下界 = 緩和問題の値(LP, Lagrangian, etc.)

探索木で:

  • 下界が上がる → 探索が絞られる

  • 上界が下がる → より良い実行可能解が見つかった

つまり 上界は探索の進捗を示すグローバルな値。

2. 最大(Max 制約)

モデルの中にある通常の制約。

例:

x1+x2+x3≤10

これは「リソース使用量は最大 10」という意味であり、 目的関数の値とは無関係。

Branch-and-Bound の上界とは全く別の概念。

🧩 混同しやすい理由

  • 最小化問題で「上界が上がる」と言うと、 直感的には「制約の上限が上がる」ように聞こえるが、 まったく違う。

  • 上界は 目的関数の値の話

  • 最大は 制約式の話

2026年10月17日土曜日

COPTの評価ライセンスがExpire

 期限が切れたので、当該箇所を#ifdef COPTで切り離しました。

今までの知見を基に、新たな標準解法を構築して行きます。とりあえずは、ひな形を人力で作ることにします。AIを使わないのは、いきなりAIに任せると理解が難しく結局デバグで手間取ることを避けたかったからです。安定したらコードの最適化はAIに任せようと思います。

私自身、新しいソルバがどのような結果になるのか、分かりません。ときどき、今までとの違いを説明して行きたいと思います。

2026年10月15日木曜日

凸性とは?

Q.凸性とは

凸性(convexity)とは、数学で「中間が極端よりも高く(または低く)ならない」形状・関数の性質のこと。 もっと具体的に言うと、2点を結ぶ線分が必ずグラフの上側(または同じ位置)にあるような関数や集合の性質を指す。

📘 1. 凸性の数学的定義(関数の場合)

関数 f が凸であるとは、任意の x,y と t∈[0,1] に対して

f(tx+(1−t)y)≤tf(x)+(1−t)f(y)

が成り立つこと。 これは「グラフ上の2点を結ぶ直線(弦)が、常にグラフの上側にある」という幾何学的意味を持つ。

📐 2. 凸集合の定義(集合の場合)

集合 Q が凸集合とは、任意の2点 v0,v1 を結ぶ線分

(1−λ)v0+λv1,λ∈[0,1]

がすべて集合の内部に含まれること。

🔍 3. 凸性の判定(微分による判定)

1変数関数の場合:

  • 二階微分が常に非負(f′′(x)≥0)なら凸関数

  • 二階微分が常に正(f′′(x)>0)なら狭義凸(strict convex)

🧠 4. 凸性が重要な理由(最適化の観点)

凸性は最適化で極めて重要。理由は:

  • 局所最小値 = 大域最小値 →「谷が一つしかない地形」と同じ

  • 解が一意になる(狭義凸の場合)

  • 多くのアルゴリズムが高速・安定に収束する

凸性は機械学習・制御・経済学・物理学などで広く使われる。

🧩 5. 凸性の例

  • 線形関数(常に凸かつ凹)

  • 二次関数 f(x)=x2(凸)

  • 指数関数 ex(凸)

  • 絶対値関数 ∣x∣(凸)

  • −log⁡x(凸)

🎯 まとめ

  • 凸性=線分がグラフの上側にある性質

  • 二階微分が非負なら凸

  • 最適化で「唯一の最小値」を保証する強力な性質


Q.単調増加と違うのですか?

いい質問。凸性(convexity)と単調増加(monotonicity)はまったく別の概念で、しばしば混同されますが、性質としては根本的に違います。

🎯 結論:凸性 ≠ 単調増加

  • 凸性は「曲がり方(形状)」の性質

  • 単調増加は「値の増え方(方向)」の性質

つまり、凸性は“カーブの形”の話で、単調増加は“右に行くと値が増えるかどうか”の話。

📘 1. 具体的な違い

🔹 単調増加とは

関数 f(x) が単調増加とは:

x1<x2⇒f(x1)≤f(x2)

つまり、右に行くほど値が増える。

例:

  • f(x)=x(線形)

  • f(x)=ex(指数)

  • f(x)=log⁡x(単調増加だが凸ではない区間あり)

🔹 凸性とは

関数 f が凸とは:

f(tx+(1−t)y)≤tf(x)+(1−t)f(y)

つまり、グラフが「下に向かって丸い」形。

例:

  • f(x)=x2(凸だが単調増加ではない)

  • f(x)=ex(凸かつ単調増加)

  • f(x)=∣x∣(凸だが単調増加ではない)

🔍 2. 代表的な反例で違いが一発でわかる

❌ 凸だが単調増加ではない

f(x)=x2
  • 左側(x<0)では減少

  • 右側(x>0)では増加

  • しかし形はずっと「下に丸い」ので凸

→ 凸性と単調増加は独立。

❌ 単調増加だが凸ではない

f(x)=log⁡x
  • 単調増加

  • しかし二階微分は負なので凹(concave)

→ 単調増加でも凸とは限らない。

🧠 3. 最適化の観点での違い

あなたは最適化・Barrier・Branch-and-Priceに強い関心があるので、ここが重要。

🔹 凸性が保証するもの

  • 局所最適 = 大域最適

  • 唯一の最小値(狭義凸)

  • Barrier・PDLPなどの収束性が保証される

🔹 単調増加が保証するもの

  • 値が増える方向がわかるだけ

  • 最適化の構造はほぼ何も保証しない

  • 単調増加でも非凸なら局所解にハマる

→ 最適化では凸性が圧倒的に重要で、単調増加はほぼ役に立たない。

📌 まとめ

性質何を意味する?最適化で重要?
凸性曲がり方(形状)★★★★★
単調増加値の増え方(方向)★☆☆☆☆

2026年10月14日水曜日

Q.プロジェクト作成サービスの経過状態

 Q. そろそろ1年が経過するころと思いますが、

①サブスク契約期間はいつまでになりますでしょうか?

メンテナンスしてほしいところがあり、いつまでならソフトのバージョンアップが行えるか確認の連絡でした。


Ans.

契約期間は、去年9月4日から1年になっております。

申し訳ありません。現在は、通常のメールサポートのみ、となっております。

どのようなご相談か、プロジェクトファイルを頂いて、簡単に対応できるようであれば、メールサポート範囲で対応します。

難しそうであれば、また1年間のプロジェクトサポートサービスのご利用をお願いすることになると思います。

まずは、ご要望内容をご相談ください。