Slide 1

Slide 1 text

ߦྻΛSwiftͰ࣮૷͢Δ USAMI Kosuke Fenrir Inc.

Slide 2

Slide 2 text

ࣗݾ঺հ • Ӊࠤݟެี • ϑΣϯϦϧגࣜձࣾ • iOS ΞϓϦ։ൃ : Swift / C# • ֶੜ࣌୅͸਺ֶઐ߈ • ࠷ۙɺ·ͨগ͠ਅ໘໨ʹ΍Γͩͨ͠

Slide 3

Slide 3 text

ߦྻͱ͸ • ͜͜Ͱ͍͏ߦྻ͸ɺઢܕ୅਺Ͱग़ͯ͘ΔߦྻʢMatrixʣͷ͜ͱ • ػցֶशͳͲͰ࢖ΘΕΔ͜ͱ͔Βɺ࠷ۙগ͠஫໨͞ΕͯΔ͔΋ ͠Εͳ͍ʁ ஌ΒΜ͚Ͳɻ

Slide 4

Slide 4 text

ߦྻΛ Swift Ͱ࣮૷ͯ͠ΈΔ • ਺ֶͷ֓೦ΛϓϩάϥϛϯάݴޠͰදݱ͢Δ໨తɿ • ਺ֶͷ֓೦Λཧղ͍ͨ͠ • ϓϩάϥϛϯάݴޠΛཧղ͍ͨ͠ • ࠓճ͸࣮༻౓͸͋·Γॏࢹ͠ͳ͍ • طʹ Swift for TensorFlow ͳͲ͕͋Δ

Slide 5

Slide 5 text

ԿΛ࣮૷͢Δ͔ • ࠓճ͸ɺߦྻͷԋࢉʹண໨ͨ͠ • ଍͠ࢉ / εΧϥʔഒ / ͔͚ࢉ • ߦྻʹ͸ɺϕΫτϧΛϕΫτϧʹҠ͢ઢܕࣸ૾Λදݱ͢Δͱ͍ ͏ॏཁͳҙຯ͕͋Δ͕ɺࠓճ͸ѻΘͳ͍ʢͦΕʹ͸ϕΫτϧ΋ ࣮૷͢Δඞཁ͕͋ΔͷͰɾɾɾʣ

Slide 6

Slide 6 text

ߦྻΛදݱ͢ΔͨΊͷσʔλ • ֤੒෼ͷܕ͸Կ͔ • Կߦ͋Δ͔ / Կྻ͋Δ͔ • XߦYྻͷ੒෼Λऔಘ͢Δ / ઃఆ͢Δ • ߦϕΫτϧ / ྻϕΫτϧ

Slide 7

Slide 7 text

Matrix ϓϩτίϧ protocol MatrixProtocol { associatedtype Scalar: Numeric var rows: Int { get } var columns: Int { get } subscript(row: Int, column: Int) -> Scalar { get set } func vector(row: Int) -> [Scalar] func vector(column: Int) -> [Scalar] }

Slide 8

Slide 8 text

ॳظԽ (1) struct Matrix : MatrixProtocol { typealias Scalar = Float private var grid: [Scalar] init(rows: Int, columns: Int, grid: [Scalar]) { self.rows = rows self.columns = columns self.grid = grid } }

Slide 9

Slide 9 text

ॳظԽ (2) // ΍ͬͺΓɺ͜͏ॻ͖͍ͨΑͶ let a = Matrix(elements: [[1, 2], [3, 4]]) struct Matrix { init(elements: [[Scalar]]) { let rows = elements.count let columns = elements.first?.count ?? 0 let grid = elements.flatMap { $0 } self.init(rows: rows, columns: columns, grid: grid) } }

Slide 10

Slide 10 text

੒෼ͷऔಘͱઃఆ struct Matrix : MatrixProtocol { subscript(row: Int, column: Int) -> Scalar { get { return grid[row * columns + column] } set { grid[row * columns + column] = newValue } } }

Slide 11

Slide 11 text

ߦϕΫτϧ / ྻϕΫτϧ struct Matrix : MatrixProtocol { func vector(row: Int) -> [Scalar] { return (0.. [Scalar] { return (0..

Slide 12

Slide 12 text

ԋࢉͷ࣮૷ • ߦྻͷԋࢉ • ଍͠ࢉ / εΧϥʔഒ / ͔͚ࢉ • ͜ΕΒΛఆٛ͢Δϓϩτίϧ͕طʹ͋ΔͳΒ४ڌ͍ͤͨ͞ • ඪ४ͷ API ʹͳΔ΂͋͘Θ͍ͤͨ • ͳ͍৔߹Ͱ΋ɺϓϩτίϧΛఆٛͯ͠४ڌͤ͞ΔΑ͏ʹ͢Δ

Slide 13

Slide 13 text

଍͠ࢉͷϓϩτίϧ • AdditiveArithmetic ϓϩτίϧΛ࢖͏ • Swift 5 ͷ AdditiveArithmetic protocol ͱ͸Կ͔ ͱ͍͏هࣄΛҎલ Qiita ʹॻ͍ͨ

Slide 14

Slide 14 text

଍͠ࢉͷ࣮૷ extension Matrix : AdditiveArithmetic { static func + (lhs: Matrix, rhs: Matrix) -> Matrix { return Matrix( rows: lhs.rows, columns: lhs.columns, grid: zip(lhs.grid, rhs.grid).map(+)) } static func - (lhs: Matrix, rhs: Matrix) -> Matrix { return Matrix( rows: lhs.rows, columns: lhs.columns, grid: zip(lhs.grid, rhs.grid).map(-)) } }

Slide 15

Slide 15 text

՝୊ : zero ͸Ͳ͏͢Δʁ protocol AdditiveArithmetic { static var zero: Self } • ͢΂ͯͷ੒෼͕ 0 ͷߦྻ͕θϩߦྻͰ͸͋Δͷ͕ͩɾɾɾ • ߦྻͷαΠζʹΑͬͯมΘΔͷͰɺstatic Ͱఆٛͮ͠Β͍ • ݱࡏɺྑ͍ղܾ͕ͳ͍ɾɾɾ

Slide 16

Slide 16 text

εΧϥʔഒͷϓϩτίϧͷఆٛ • Swift for TensorFlow ʹ͋ΔͷͰͦͷ··ਅࣅ͢Δ protocol VectorNumeric { associatedtype Scalar: Numeric static func * (lhs: Scalar, rhs: Self) -> Self static func *= (lhs: inout Self, rhs: Scalar) }

Slide 17

Slide 17 text

εΧϥʔഒͷ࣮૷ extension Matrix : VectorNumeric { static func * (lhs: Scalar, rhs: Matrix) -> Matrix { return Matrix( rows: rhs.rows, columns: rhs.columns, grid: rhs.grid.map { lhs * $0 }) } }

Slide 18

Slide 18 text

͔͚ࢉͷϓϩτίϧ • Swift ඪ४ͷ Numeric ͰͲ͏͔ʁ ҎԼͷϓϩύςΟ͕໰୊ protocol Numeric { associatedtype Magnitude : Comparable, Numeric var magnitude: Self.Magnitude { get } } • magnitude ͸ઈର஋Λฦ͢ɾɾɾߦྻʹ͸ͳ͍֓೦ • ͕ͨͬͯ͠ɺߦྻ͸ Numeric ͡Όͳ͍

Slide 19

Slide 19 text

͔͚ࢉͷϓϩτίϧͷఆٛ • Numeric ͔Β magnitude Λ͸ͣ͢ protocol MultiplicativeArithmetic { static func * (lhs: Self, rhs: Self) -> Self static func *= (lhs: inout Self, rhs: Self) }

Slide 20

Slide 20 text

͔͚ࢉͷ࣮૷ extension Matrix : MultiplicativeArithmetic { static func * (lhs: Matrix, rhs: Matrix) -> Matrix { return Matrix( rows: lhs.rows, columns: rhs.columns, grid: (0..

Slide 21

Slide 21 text

ࠓޙͷ՝୊ • associatedtype ΑΓδΣωϦΫεͷ΄͏͕ྑ͍͔ʁ • ΍ͬͺΓ Numeric ʹ͍͕ͨ͠ʁ • magnitude ͸ߦྻ͕ࣜߟ͑ΒΕΔ͕ਖ਼ํߦྻͷΈ • ߦྻΛϕΫτϧʹ࡞༻͍ͤͨ͞ • ͜ͷߦྻΛ਌࿨͢ΔΑ͏ʹϕΫτϧΛఆٛͯ͠΍Δ