Cranberries interval library 開発の話
-
Upload
wada-yuki -
Category
Technology
-
view
700 -
download
0
Transcript of Cranberries interval library 開発の話
![Page 1: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/1.jpg)
CRANBERRIES INTERVAL LIBRARY
Boost の Interval が使いにくいので作っちゃいました
![Page 2: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/2.jpg)
自己紹介• Twitter : いなむ先生 @_EnumHack
• 高校で化学・物理を教えている• 趣味で数値解析の研究をしている• プログラミング歴約 6 年、 C++ 歴約 3 年• ちょうど 1 週間前に「 C++ の会」というオンラインのコミュニティを立ち上げた
![Page 3: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/3.jpg)
C++ の会の宣伝• C++ の会は C++ 超初心者や C++ 中級者が集う会です• 競プロ、ゲーム制作、趣味、いろいろな人が、現在 38 人集まっています• いなむ先生(私)は設立メンバー( 2 人の owner うちの 1 人)です• slack 上で C++ の質問をしたり答えたり Ruby やら洗濯物の雑談をしたりしています• 基本フラットで、習熟度はあまり関係なく話し合う会を目指しています• C++ の会では C++ をイチから勉強したい方や• 鉞を投げ込んでくれる本物の C++ プログラマーを募集してます!• 興味を持った方は @_EnumHack まで
![Page 4: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/4.jpg)
開発経緯• 大学時代の研究室の教授の方針で使用するコードはすべて書く• 区間演算ライブラリを書いた• 自分の書いたコードと既存の区間演算ライブラリのコードを比べた• 違うところがある• 自分のライブラリも便利な気がした• せっかく作ったから車輪の再々発明だけど公開しよう←いまここ
![Page 5: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/5.jpg)
目次• 区間演算の概要• Boost Interval ではダメな理由• Cranberries Interval Library の特徴
![Page 6: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/6.jpg)
区間演算の概要https://github.com/LoliGothick/Interval-Analysis
区間演算の使い方(一例)
![Page 7: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/7.jpg)
そもそも区間とは?• 定義 区間 X とはある実数を上下限とする実数の集合
![Page 8: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/8.jpg)
区間は中学生でも使っている• 変域と値域
区間
区間
![Page 9: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/9.jpg)
区間演算の性質• 変数を区間にして関数を計算すると値域が求まる
(関数の区間拡張)
• ただし、区間演算は実際の値域より広い区間になる性質がある• その場合も、必ず値域を包み込みます(区間包囲)
![Page 10: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/10.jpg)
実用例 – 区間最適化• Levy3 関数の最小化
• [-10,10] で関数値を区間演算すると• ans = [ -54.5403, 54.5403 ]
• 真の値域は [-14.976,14.976]
• どうするか?
![Page 11: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/11.jpg)
こうする• 区間の幅を狭くすればよいoptimize.exe
![Page 12: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/12.jpg)
なぜ BOOST ではダメなのか区間演算の根本的な問題があった
![Page 13: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/13.jpg)
区間の比較という問題、その前に•比較には 3 種類ある
•Total Ordering•Weak Ordering•Partial Ordering
•ソートするには Weak Ordering を満たす比較演算子が必要
![Page 14: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/14.jpg)
区間の比較という問題• 区間の比較には 3 種類ほど定義があるらしい• どの定義も Partial Ordering である• 正しくソートされる保証がない!• kvライブラリなどほかの区間演算ライブラリでも同様
![Page 15: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/15.jpg)
CRANBERRIES INTERVAL LIBRARYの特徴
新しい区間比較方法の提案提供する機能の紹介
![Page 16: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/16.jpg)
区間比較の定義を新しく作った•Cranberries Interval には比較の種類が4つある
•Total Ordering•Weak Ordering•Partial Ordering•Interval Ordering
![Page 17: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/17.jpg)
Interval Ordering•区間についてあるとは
![Page 18: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/18.jpg)
Partial Ordering•区間についてあるとは
![Page 19: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/19.jpg)
Weak Ordering•区間についてあるとは
![Page 20: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/20.jpg)
Total Ordering
![Page 21: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/21.jpg)
比較演算子について• これらの比較方法は 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&);
![Page 22: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/22.jpg)
Semantics Switchingauto&& a = interval<>{ 1,3 };auto&& b = interval<>{ 2,4 };a < b; // default では total ordering なので true{
using namespace interval_ordering;a < b; // interval ordering に意味が変わるので falseになる
}
![Page 23: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/23.jpg)
仕組み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 ) ) ; }
}
![Page 24: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/24.jpg)
関数オブジェクトもある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 ) ;}
} ;
![Page 25: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/25.jpg)
関数オブジェクトの使いどころ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>()) ;
![Page 26: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/26.jpg)
提供される演算子operator+operator-operator*operator/operator++
operator<operator<=operator>operator>=operator==operator!=
operator+=operator-=operator*=operator/=operator--
![Page 27: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/27.jpg)
trigonometric functionssin()cos()tan()asin()acos()atan()
![Page 28: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/28.jpg)
hyperbolic functionssinh()cosh()tanh()asinh()acosh()atanh()
![Page 29: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/29.jpg)
その他log()log10()log2()log1p()exp()exp2()expm1()
pow(int)sqrt()abs()erf()erfc()fma(T1,T2,T3)
![Page 30: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/30.jpg)
区間専用関数mid()wid()is_singleton()upper()lower()
![Page 31: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/31.jpg)
2項演算子と2、3引数関数•2項演算子と2,3引数関数は interval の value type が違ってもよい•戻り値型は型変換もしくはプロモーションが起こった結果の型• 計算不可能なときはコンパイルエラー
![Page 32: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/32.jpg)
型変換の仕組み•異なる 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 ;
![Page 33: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/33.jpg)
次のリリース(予定)auto&& a = interval<>{ 1,3 };auto&& b = interval<>{ 2,4 };{
using namespace Expression;auto&& expr = a + b; // Expression Template になる !
}
![Page 34: Cranberries interval library 開発の話](https://reader035.fdocuments.net/reader035/viewer/2022062900/58ea1e6f1a28abf9018b4aad/html5/thumbnails/34.jpg)
課題• 区間用の関数が少ない( norm, mig, mag etc… )• C++始めたてのころの稚拙なコードが残っている• 使っている人がいない