SlideShare a Scribd company logo
1 of 34
CRANBERRIES INTERVAL
LIBRARY
BoostのIntervalが使いにくいので
作っちゃいました
自己紹介
• Twitter : いなむ先生@_EnumHack
• 高校で化学・物理を教えている
• 趣味で数値解析の研究をしている
• プログラミング歴約6年、C++歴約3年
• ちょうど1週間前に「C++の会」というオンラインのコミュニティを立ち上げた
C++の会の宣伝
• C++の会はC++超初心者やC++中級者が集う会です
• 競プロ、ゲーム制作、趣味、いろいろな人が、現在38人集まっています
• いなむ先生(私)は設立メンバー(2人のownerうちの1人)です
• slack上でC++の質問をしたり答えたりRubyやら洗濯物の雑談をしたりしています
• 基本フラットで、習熟度はあまり関係なく話し合う会を目指しています
• C++の会ではC++をイチから勉強したい方や
• 鉞を投げ込んでくれる本物のC++プログラマーを募集してます!
• 興味を持った方は@_EnumHackまで
開発経緯
• 大学時代の研究室の教授の方針で使用するコードはすべて書く
• 区間演算ライブラリを書いた
• 自分の書いたコードと既存の区間演算ライブラリのコードを比べた
• 違うところがある
• 自分のライブラリも便利な気がした
• せっかく作ったから車輪の再々発明だけど公開しよう←いまここ
目次
• 区間演算の概要
• Boost Intervalではダメな理由
• Cranberries Interval Library の特徴
区間演算の概要
https://github.com/LoliGothick/Interval-Analysis
区間演算の使い方(一例)
そもそも区間とは?
• 定義
区間Xとはある実数𝑎, 𝑏(𝑎 ≤ 𝑏)を上下限とする実数の集合
X = 𝑎, 𝑏 = ∀𝑥 ∈ ℝ 𝑎 ≤ 𝑥 ≤ 𝑏}
区間は中学生でも使っている
• 変域と値域
区間
区間
区間演算の性質
• 変数を区間にして関数を計算すると値域が求まる
(関数の区間拡張)
𝑓 𝑋 = 𝑋2
𝑓 [−1,2] = [0, 4]
• ただし、区間演算は実際の値域より広い区間になる性質がある
• その場合も、必ず値域を包み込みます(区間包囲)
実用例 – 区間最適化
• Levy3 関数の最小化
• 𝑓 𝑥1, 𝑥2 = 𝑖=1
5
𝑖cos 𝑖 − 1 𝑥1 + 𝑖 𝑖=1
5
𝑖cos 𝑖 + 1 𝑥2 + 𝑖
• −10 < 𝑥1, 𝑥2 < 10
• [-10,10]で関数値を区間演算すると
• ans = [ -54.5403, 54.5403 ]
• 真の値域は[-14.976,14.976]
• どうするか?
こうする
• 区間の幅を狭くすればよい
optimize.exe
なぜBOOSTでは
ダメなのか
区間演算の根本的な問題があった
区間の比較という問題、その前に
• 比較には3種類ある
• Total Ordering
• Weak Ordering
• Partial Ordering
• ソートするにはWeak Ordering を満たす比較演算子が必要
区間の比較という問題
• 区間の比較には3種類ほど定義があるらしい
• どの定義もPartial Ordering である
• 正しくソートされる保証がない!
• kvライブラリなどほかの区間演算ライブラリでも同様
CRANBERRIES
INTERVAL LIBRARY
の特徴
新しい区間比較方法の提案
提供する機能の紹介
区間比較の定義を新しく作った
• Cranberries Interval には比較の種類が4つある
• Total Ordering
• Weak Ordering
• Partial Ordering
• Interval Ordering
Interval Ordering
•区間𝑋, 𝑌について𝑋 < 𝑌であるとは
∀𝑥 ∈ 𝑋, ∀𝑦 ∈ 𝑌, 𝑥 < 𝑦
𝑋 = 𝑎, 𝑏 , 𝑌 = 𝑐, 𝑑 , 𝑏 < 𝑐
Partial Ordering
•区間𝑋, 𝑌について𝑋 < 𝑌であるとは
∀𝑥 ∈ 𝑋, ∃𝑦 ∈ 𝑌, 𝑥 < 𝑦 かつ∃𝑥 ∈ 𝑋, ∀𝑦 ∈ 𝑌, 𝑥 < 𝑦
𝑋 = 𝑎, 𝑏 , 𝑌 = 𝑐, 𝑑 , 𝑎 < 𝑐 ∧ 𝑏 < 𝑑
Weak Ordering
•区間𝑋, 𝑌について𝑋 < 𝑌であるとは
∃𝑥 ∈ 𝑋, ∀𝑦 ∈ 𝑌, 𝑥 < 𝑦
𝑋 = 𝑎, 𝑏 , 𝑌 = 𝑐, 𝑑 , 𝑎 < 𝑐
Total Ordering
•区間𝑋, 𝑌について𝑋 < 𝑌であるとは
𝑋 = 𝑎, 𝑏 , 𝑌 𝑐, 𝑑
𝑖𝑓 𝑎 = 𝑐 𝑏 < 𝑑
𝑒𝑙𝑠𝑒 𝑎 < 𝑐
比較演算子について
• これらの比較方法は4種類の関数として提供される
• bool operator<(interval<T> const&, interval<T> const&)
• はデフォルトではtotal_ordering
bool interval_ordering(interval<T> const&, interval<T> const&)
bool partial_ordering(interval<T> const&, interval<T> const&)
bool weak_ordering(interval<T> const&, interval<T> const&)
bool partial_ordering(interval<T> const&, interval<T> const&);
Semantics Switching
auto&& a = interval<>{ 1,3 };
auto&& b = interval<>{ 2,4 };
a < b; // defaultではtotal orderingなのでtrue
{
using namespace interval_ordering;
a < b; // interval ordering に意味が変わるのでfalseになる
}
仕組み
inline namespace total_ordering_policy {
template < typename T, typename U >
inline constexpr bool operator<( interval<T> const& x, interval<U> const& y ){
return total_less( x, y ) ;
}
}
namespace interval_ordering_policy {
template < typename T, typename U>
constexpr bool operator<( T&& x, U&& y ) {
return interval_less( std::forward<T>( x ), std::forward<U>( y ) ) ;
}
}
関数オブジェクトもある
template < order = order::Total >
struct less {
template < typename T, typename U >
constexpr bool operator()( interval<T> const& a, interval<U> const& b ) const {
return total_less( a, b ) ;
}
template < typename T, typename U >
constexpr bool operator()( U const& a, interval<T> const& b ) const {
return total_less( a, b ) ;
}
template < typename T, typename U >
constexpr bool operator()( interval<T> const& a, U const& b ) const {
return total_less( a, b ) ;
}
} ;
関数オブジェクトの使いどころ
interval<double> a{1,2}, b{3,4}, c{5,6}, d{6,7} ;
vector<interval<double>> vec{a,b,c,d} ;
std::sort(vec.begin(),vec.end(),less<order::Weak>()) ;
提供される演算子
operator+
operator-
operator*
operator/
operator++
operator<
operator<=
operator>
operator>=
operator==
operator!=
operator+=
operator-=
operator*=
operator/=
operator--
trigonometric functions
sin()
cos()
tan()
asin()
acos()
atan()
hyperbolic functions
sinh()
cosh()
tanh()
asinh()
acosh()
atanh()
その他
log()
log10()
log2()
log1p()
exp()
exp2()
expm1()
pow(int)
sqrt()
abs()
erf()
erfc()
fma(T1,T2,T3)
区間専用関数
mid()
wid()
is_singleton()
upper()
lower()
2項演算子と2、3引数関数
• 2項演算子と2,3引数関数はintervalのvalue typeが違ってもよい
• 戻り値型は型変換もしくはプロモーションが起こった結果の型
• 計算不可能なときはコンパイルエラー
型変換の仕組み
• 異なるvalue type をもつ区間クラスの演算での型変換規則
template < typename L, typename R >
struct promotion {
typedef decltype( L{} + R{} ) type ;
} ;
template < typename L, typename R >
using promotion_t = typename promotion<L, R>::type ;
次のリリース(予定)
auto&& a = interval<>{ 1,3 };
auto&& b = interval<>{ 2,4 };
{
using namespace Expression;
auto&& expr = a + b; // Expression Templateになる!
}
課題
• 区間用の関数が少ない(norm, mig, mag etc…)
• C++始めたてのころの稚拙なコードが残っている
• 使っている人がいない

More Related Content

Similar to Cranberries interval library 開発の話

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用までyoshihikoozaki5
 
Boot strap3 勉強会
Boot strap3 勉強会Boot strap3 勉強会
Boot strap3 勉強会Daisuke Onoe
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」Hiro H.
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
パフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practiceパフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practice啓介 大橋
 
「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)
「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)
「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)Keiichi Nagaoka
 
C++と仲良くなるためのn問 ~ポインタ編~ #ladiescpp
C++と仲良くなるためのn問 ~ポインタ編~ #ladiescppC++と仲良くなるためのn問 ~ポインタ編~ #ladiescpp
C++と仲良くなるためのn問 ~ポインタ編~ #ladiescppcocodrips
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみたSatoshi Sato
 
PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門Tomo Mizoe
 

Similar to Cranberries interval library 開発の話 (12)

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
C++の復習
C++の復習C++の復習
C++の復習
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
 
Boot strap3 勉強会
Boot strap3 勉強会Boot strap3 勉強会
Boot strap3 勉強会
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
 
Study3 boost
Study3 boostStudy3 boost
Study3 boost
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
パフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practiceパフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practice
 
「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)
「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)
「Excel方眼紙公開討論会 presented by Forguncy」で使用したスライド(の最終稿)
 
C++と仲良くなるためのn問 ~ポインタ編~ #ladiescpp
C++と仲良くなるためのn問 ~ポインタ編~ #ladiescppC++と仲良くなるためのn問 ~ポインタ編~ #ladiescpp
C++と仲良くなるためのn問 ~ポインタ編~ #ladiescpp
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 

Recently uploaded (9)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 

Cranberries interval library 開発の話