Class: Differentiation::DualNumber
- Inherits:
-
Object
- Object
- Differentiation::DualNumber
- Includes:
- Comparable
- Defined in:
- lib/differentiation/dual_number.rb
Instance Attribute Summary collapse
-
#diff ⇒ Object
readonly
Returns the value of attribute diff.
-
#n ⇒ Object
readonly
Returns the value of attribute n.
-
#named_variables ⇒ Object
readonly
Returns the value of attribute named_variables.
Instance Method Summary collapse
- #*(other) ⇒ Object
- #**(other) ⇒ Object
- #+(other) ⇒ Object
- #+@ ⇒ Object
- #-(other) ⇒ Object
- #-@ ⇒ Object
- #/(other) ⇒ Object
- #<=>(other) ⇒ Object
- #coerce(other) ⇒ Object
- #derivative(var) ⇒ Object
- #gradients(*keys) ⇒ Object
-
#initialize(n, diff = lambda{|var| var.equal?(self) ? 1.0 : 0.0 }, named_variables: {}, key: nil) ⇒ DualNumber
constructor
A new instance of DualNumber.
- #inspect ⇒ Object
- #to_f ⇒ Object
- #to_i ⇒ Object
- #to_int ⇒ Object
Constructor Details
#initialize(n, diff = lambda{|var| var.equal?(self) ? 1.0 : 0.0 }, named_variables: {}, key: nil) ⇒ DualNumber
Returns a new instance of DualNumber.
7 8 9 10 11 12 13 14 15 |
# File 'lib/differentiation/dual_number.rb', line 7 def initialize(n, diff=lambda{|var| var.equal?(self) ? 1.0 : 0.0 }, named_variables: {}, key: nil) @n = n @diff = diff if key @named_variables = { key => self }.freeze else @named_variables = named_variables.dup.freeze end end |
Instance Attribute Details
#diff ⇒ Object (readonly)
Returns the value of attribute diff.
17 18 19 |
# File 'lib/differentiation/dual_number.rb', line 17 def diff @diff end |
#n ⇒ Object (readonly)
Returns the value of attribute n.
17 18 19 |
# File 'lib/differentiation/dual_number.rb', line 17 def n @n end |
#named_variables ⇒ Object (readonly)
Returns the value of attribute named_variables.
17 18 19 |
# File 'lib/differentiation/dual_number.rb', line 17 def named_variables @named_variables end |
Instance Method Details
#*(other) ⇒ Object
129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/differentiation/dual_number.rb', line 129 def *(other) if other.is_a?(DualNumber) n = @n * other.n diff = ->(var) { @n * other.derivative(var) + self.derivative(var) * other.n } named_variables = @named_variables.merge(other.named_variables) else n = @n * other diff = ->(var) { self.derivative(var) * other } named_variables = @named_variables end DualNumber.new(n, diff, named_variables: named_variables) end |
#**(other) ⇒ Object
155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/differentiation/dual_number.rb', line 155 def **(other) if other.is_a?(DualNumber) n = @n ** other.n diff = ->(var) { (@n ** other.n) * (other.derivative(var) * Math.log(@n) + (other.n / @n)) } named_variables = @named_variables.merge(other.named_variables) else n = @n ** other diff = ->(var) { ((@n ** (other-1)) * other) * self.derivative(var) } named_variables = @named_variables end DualNumber.new(n, diff, named_variables: named_variables) end |
#+(other) ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/differentiation/dual_number.rb', line 103 def +(other) if other.is_a?(DualNumber) n = @n + other.n diff = ->(var) { self.derivative(var) + other.derivative(var) } named_variables = @named_variables.merge(other.named_variables) else n = @n + other diff = @diff named_variables = @named_variables end DualNumber.new(n, diff, named_variables: named_variables) end |
#+@ ⇒ Object
95 96 97 |
# File 'lib/differentiation/dual_number.rb', line 95 def +@ self end |
#-(other) ⇒ Object
116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/differentiation/dual_number.rb', line 116 def -(other) if other.is_a?(DualNumber) n = @n - other.n diff = ->(var) { self.derivative(var) - other.derivative(var) } named_variables = @named_variables.merge(other.named_variables) else n = @n - other diff = @diff named_variables = @named_variables end DualNumber.new(n, diff, named_variables: named_variables) end |
#-@ ⇒ Object
99 100 101 |
# File 'lib/differentiation/dual_number.rb', line 99 def -@ self * -1 end |
#/(other) ⇒ Object
142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/differentiation/dual_number.rb', line 142 def /(other) if other.is_a?(DualNumber) n = @n / other.n diff = ->(var) { (self.derivative(var) / other.n) - (@n * other.derivative(var)) / (other.n ** 2) } named_variables = @named_variables.merge(other.named_variables) else n = @n / other diff = ->(var) { self.derivative(var) / other } named_variables = @named_variables end DualNumber.new(n, diff, named_variables: named_variables) end |
#<=>(other) ⇒ Object
87 88 89 90 91 92 93 |
# File 'lib/differentiation/dual_number.rb', line 87 def <=>(other) if other.is_a?(DualNumber) @n <=> other.n else @n <=> other end end |
#coerce(other) ⇒ Object
79 80 81 82 83 84 85 |
# File 'lib/differentiation/dual_number.rb', line 79 def coerce(other) if Differentiation.differentiable?(other) [Differentiation.convert_to_dual_number(other), self] else super end end |
#derivative(var) ⇒ Object
19 20 21 22 23 24 25 |
# File 'lib/differentiation/dual_number.rb', line 19 def derivative(var) if var.equal?(self) 1.0 else @diff.call(var) end end |
#gradients(*keys) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/differentiation/dual_number.rb', line 27 def gradients(*keys) keys = keys.flatten(1) return_hash = false if keys.empty? return_hash = true keys = @named_variables.keys vars = @named_variables.values else vars = keys.map do |k| if k.is_a?(DualNumber) or (defined?(::Matrix) and k.is_a?(Matrix)) k else @named_variables[k] end end end if return_hash keys.each_with_object({}) do |k, o| v = @named_variables[k] if v.nil? o[k] = 0.0 elsif defined?(::Matrix) and v.is_a?(::Matrix) o[k] = Matrix.build(v.row_size, v.column_size){|i, j| derivative(v[i, j]) } else o[k] = derivative(v) end end else vars.map do |v| if v.nil? 0.0 elsif defined?(::Matrix) and v.is_a?(::Matrix) Matrix.build(v.row_size, v.column_size){|i, j| derivative(v[i, j]) } else derivative(v) end end end end |
#inspect ⇒ Object
168 169 170 171 172 173 174 |
# File 'lib/differentiation/dual_number.rb', line 168 def inspect if $DEBUG "<DualNumber: #{@n} >" else @n.inspect end end |
#to_f ⇒ Object
75 76 77 |
# File 'lib/differentiation/dual_number.rb', line 75 def to_f @n.to_f end |
#to_i ⇒ Object
67 68 69 |
# File 'lib/differentiation/dual_number.rb', line 67 def to_i @n.to_i end |
#to_int ⇒ Object
71 72 73 |
# File 'lib/differentiation/dual_number.rb', line 71 def to_int @n.to_int end |