interpolator 0.13 → 0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/interpolator.rb +211 -106
- metadata +3 -3
    
        data/interpolator.rb
    CHANGED
    
    | @@ -22,6 +22,9 @@ | |
| 22 22 | 
             
            # OTHER DEALINGS IN THE SOFTWARE.
         | 
| 23 23 | 
             
            #
         | 
| 24 24 | 
             
            #
         | 
| 25 | 
            +
            # More information, source code and gems @ http://rubyforge.org/projects/interpolator/
         | 
| 26 | 
            +
            #
         | 
| 27 | 
            +
            #
         | 
| 25 28 | 
             
            module Interpolator
         | 
| 26 29 |  | 
| 27 30 | 
             
            # Table holds a series of independent and dependent values that can be interpolated or extrapolated.
         | 
| @@ -30,7 +33,12 @@ module Interpolator | |
| 30 33 | 
             
            # created.
         | 
| 31 34 | 
             
            #
         | 
| 32 35 | 
             
            # Tables can be told to not extrapolate by setting .extrapolate=false
         | 
| 33 | 
            -
            # The interpolation method is controlled with .style = LINEAR,LAGRANGE2, or  | 
| 36 | 
            +
            # The interpolation method is controlled with .style = LINEAR, LAGRANGE2, LAGRANGE3, CUBIC (also known as natural spline), or CATMULL (spline)
         | 
| 37 | 
            +
            #
         | 
| 38 | 
            +
            # The style and extrapolate attributes are only applied to that specific Table. They are not propagated to subtables. Each subtable
         | 
| 39 | 
            +
            # can of course accept it's own attributes.
         | 
| 40 | 
            +
            #
         | 
| 41 | 
            +
            # More information, source code and gems @ http://rubyforge.org/projects/interpolator/
         | 
| 34 42 | 
             
            #
         | 
| 35 43 | 
             
                class Table
         | 
| 36 44 |  | 
| @@ -40,10 +48,12 @@ module Interpolator | |
| 40 48 | 
             
                   LINEAR    = 1
         | 
| 41 49 | 
             
                   LAGRANGE2 = 2
         | 
| 42 50 | 
             
                   LAGRANGE3 = 3
         | 
| 43 | 
            -
             | 
| 51 | 
            +
                   CUBIC     = 4
         | 
| 52 | 
            +
                   CATMULL   = 5
         | 
| 53 | 
            +
            #
         | 
| 44 54 | 
             
            # Tables are constructed from either a pair of Arrays or a single Hash.
         | 
| 45 55 | 
             
            #     
         | 
| 46 | 
            -
            # The 2 argument constructor accepts  | 
| 56 | 
            +
            # The 2 argument constructor accepts an array of independents and an array of dependents. The
         | 
| 47 57 | 
             
            # independent Array should be floating point values. The dependent Array can be either floating
         | 
| 48 58 | 
             
            # point values or Tables (aka sub tables.) There is no limit to how deep a Table can be.
         | 
| 49 59 | 
             
            #     
         | 
| @@ -80,6 +90,10 @@ module Interpolator | |
| 80 90 | 
             
            #                      5=>Table.new([11.0,12.0,13.0],[-14.0,-15.0,-16.0]))
         | 
| 81 91 | 
             
            #                  )
         | 
| 82 92 | 
             
            #
         | 
| 93 | 
            +
            #             Note: notice how the Hash version of the table constructor makes it easier to view multidimensional Tables.
         | 
| 94 | 
            +
            #
         | 
| 95 | 
            +
            #
         | 
| 96 | 
            +
            # The amount of Table nesting is only limited by RAM.
         | 
| 83 97 | 
             
            #
         | 
| 84 98 | 
             
            # As a convienance the constructor accepts a block and will pass back the
         | 
| 85 99 | 
             
            # Table instance. This makes it easy to set the style and extrapolation inline.
         | 
| @@ -105,17 +119,20 @@ module Interpolator | |
| 105 119 | 
             
                       end
         | 
| 106 120 |  | 
| 107 121 | 
             
                       raise "number of independents must equal the number of dependents" unless @inds.size == @deps.size
         | 
| 108 | 
            -
                        | 
| 122 | 
            +
                       ii = nil
         | 
| 109 123 | 
             
                       @inds.each do |i|
         | 
| 110 | 
            -
                         raise "independents must be monotonically increasing" unless ( | 
| 111 | 
            -
                          | 
| 124 | 
            +
                         raise "independents must be monotonically increasing" unless (ii == nil || i > ii)
         | 
| 125 | 
            +
                         ii = i
         | 
| 112 126 | 
             
                       end
         | 
| 113 127 | 
             
                       @extrapolate = true
         | 
| 114 128 | 
             
                       @style       = LINEAR
         | 
| 129 | 
            +
                       @ilast       = 0    # index of last bracket operation. theory is subsequent table reads may be close to this index so remember it
         | 
| 130 | 
            +
                       @secderivs   = []
         | 
| 115 131 | 
             
                       if block_given? 
         | 
| 116 132 | 
             
                         yield self  # makes it easy for users to set Table attributes inline
         | 
| 117 133 | 
             
                       end
         | 
| 118 134 | 
             
                   end
         | 
| 135 | 
            +
            #
         | 
| 119 136 | 
             
            # Interpolate or extrapolate the Table. Pass as many arguments as there are independent dimensions to the table (univariant a
         | 
| 120 137 | 
             
            # single argument, bivariant 2 arguments, etc.)
         | 
| 121 138 | 
             
            #   
         | 
| @@ -133,51 +150,31 @@ module Interpolator | |
| 133 150 | 
             
                      raise "table requires at least 2 points for linear interpolation" if (@style == LINEAR && @inds.size<2)
         | 
| 134 151 | 
             
                      raise "table requires at least 3 points for lagrange2 interpolation" if (@style == LAGRANGE2 && @inds.size<3)
         | 
| 135 152 | 
             
                      raise "table requires at least 4 points for lagrange3 interpolation" if (@style == LAGRANGE3 && @inds.size<4)
         | 
| 153 | 
            +
                      raise "table requires at least 3 points for cubic spline interpolation" if (@style == CUBIC && @inds.size<3)
         | 
| 154 | 
            +
                      raise "table requires at least 2 points for catmull-rom interpolation" if (@style == CATMULL && @inds.size<2)
         | 
| 136 155 | 
             
                      raise "insufficient number of arguments to read table" unless args.size>=1
         | 
| 156 | 
            +
                      raise "insufficient number of arguments to read table" if (args.size==1 && @deps[0].kind_of?(Table))
         | 
| 157 | 
            +
                      raise "too many arguments to read table" if (args.size>1 && !@deps[0].kind_of?(Table))
         | 
| 137 158 |  | 
| 138 159 | 
             
                      xval = args[0]
         | 
| 160 | 
            +
                      subargs = args[1..-1]
         | 
| 139 161 |  | 
| 140 162 | 
             
                      if (@extrapolate == false) && (xval < @inds[0]) then
         | 
| 141 | 
            -
                           | 
| 142 | 
            -
                            ans = @deps[0]
         | 
| 143 | 
            -
                          else
         | 
| 144 | 
            -
                            subargs = args[1..-1]
         | 
| 145 | 
            -
                            tab = @deps[0]
         | 
| 146 | 
            -
                            ans = tab.read(*subargs)
         | 
| 147 | 
            -
                          end
         | 
| 163 | 
            +
                          ans = subread(0,*subargs)
         | 
| 148 164 |  | 
| 149 165 | 
             
                      elsif (@extrapolate == false) && (xval > @inds[-1]) 
         | 
| 150 | 
            -
                           | 
| 151 | 
            -
             | 
| 152 | 
            -
                          else
         | 
| 153 | 
            -
                            subargs = args[1..-1]
         | 
| 154 | 
            -
                            tab = @deps[-1]
         | 
| 155 | 
            -
                            ans = tab.read(*subargs)
         | 
| 156 | 
            -
                          end
         | 
| 157 | 
            -
                      
         | 
| 166 | 
            +
                          ans = subread(-1,*subargs)
         | 
| 167 | 
            +
             | 
| 158 168 | 
             
                      else
         | 
| 159 | 
            -
                   
         | 
| 160 169 | 
             
                          ileft = bracket(xval)
         | 
| 161 170 |  | 
| 162 171 | 
             
                          case @style
         | 
| 163 172 | 
             
                          when LINEAR
         | 
| 164 173 | 
             
                             x1 = @inds[ileft]
         | 
| 165 174 | 
             
                             x2 = @inds[ileft+1]
         | 
| 166 | 
            -
                              | 
| 167 | 
            -
             | 
| 168 | 
            -
             | 
| 169 | 
            -
                                  y2 = @deps[ileft+1]
         | 
| 170 | 
            -
                                  ans = linear(xval,x1,x2,y1,y2)
         | 
| 171 | 
            -
                             else
         | 
| 172 | 
            -
                                # interpolate the sub tables
         | 
| 173 | 
            -
                                  tab1 = @deps[ileft]
         | 
| 174 | 
            -
                                  tab2 = @deps[ileft+1]
         | 
| 175 | 
            -
                                  subargs = args[1..-1]
         | 
| 176 | 
            -
                                  y1 = tab1.read(*subargs)
         | 
| 177 | 
            -
                                  y2 = tab2.read(*subargs)
         | 
| 178 | 
            -
                                  ans = linear(xval,x1,x2,y1,y2)
         | 
| 179 | 
            -
                             end            
         | 
| 180 | 
            -
                          
         | 
| 175 | 
            +
                             y1 = subread(ileft,*subargs)
         | 
| 176 | 
            +
                             y2 = subread(ileft+1,*subargs)
         | 
| 177 | 
            +
                             ans = linear(xval,x1,x2,y1,y2)            
         | 
| 181 178 | 
             
                          when LAGRANGE2
         | 
| 182 179 | 
             
                             indx = ileft
         | 
| 183 180 | 
             
                             if ileft == @inds.size-2    
         | 
| @@ -186,24 +183,11 @@ module Interpolator | |
| 186 183 | 
             
                             x1 = @inds[indx]
         | 
| 187 184 | 
             
                             x2 = @inds[indx+1]
         | 
| 188 185 | 
             
                             x3 = @inds[indx+2]
         | 
| 189 | 
            -
                              | 
| 190 | 
            -
             | 
| 191 | 
            -
             | 
| 192 | 
            -
             | 
| 193 | 
            -
             | 
| 194 | 
            -
                                  ans = lagrange2(xval,x1,x2,x3,y1,y2,y3)
         | 
| 195 | 
            -
                             else
         | 
| 196 | 
            -
                                # interpolate the sub tables
         | 
| 197 | 
            -
                                  tab1 = @deps[indx]
         | 
| 198 | 
            -
                                  tab2 = @deps[indx+1]
         | 
| 199 | 
            -
                                  tab3 = @deps[indx+2]
         | 
| 200 | 
            -
                                  subargs = args[1..-1]
         | 
| 201 | 
            -
                                  y1 = tab1.read(*subargs)
         | 
| 202 | 
            -
                                  y2 = tab2.read(*subargs)
         | 
| 203 | 
            -
                                  y3 = tab3.read(*subargs)
         | 
| 204 | 
            -
                                  ans = lagrange2(xval,x1,x2,x3,y1,y2,y3)
         | 
| 205 | 
            -
                             end                  
         | 
| 206 | 
            -
                          
         | 
| 186 | 
            +
                             y1 = subread(indx,*subargs)
         | 
| 187 | 
            +
                             y2 = subread(indx+1,*subargs)
         | 
| 188 | 
            +
                             y3 = subread(indx+2,*subargs)
         | 
| 189 | 
            +
                             ans = lagrange2(xval,x1,x2,x3,y1,y2,y3)
         | 
| 190 | 
            +
                       
         | 
| 207 191 | 
             
                          when LAGRANGE3
         | 
| 208 192 | 
             
                             indx = ileft
         | 
| 209 193 | 
             
                             if (ileft > @inds.size-3) 
         | 
| @@ -215,26 +199,39 @@ module Interpolator | |
| 215 199 | 
             
                             x2 = @inds[indx]
         | 
| 216 200 | 
             
                             x3 = @inds[indx+1]
         | 
| 217 201 | 
             
                             x4 = @inds[indx+2]
         | 
| 218 | 
            -
                              | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
             | 
| 225 | 
            -
                              | 
| 226 | 
            -
             | 
| 227 | 
            -
             | 
| 228 | 
            -
             | 
| 229 | 
            -
             | 
| 230 | 
            -
             | 
| 231 | 
            -
             | 
| 232 | 
            -
             | 
| 233 | 
            -
             | 
| 234 | 
            -
             | 
| 235 | 
            -
             | 
| 236 | 
            -
             | 
| 237 | 
            -
                              | 
| 202 | 
            +
                             y1 = subread(indx-1,*subargs)
         | 
| 203 | 
            +
                             y2 = subread(indx,*subargs)
         | 
| 204 | 
            +
                             y3 = subread(indx+1,*subargs)
         | 
| 205 | 
            +
                             y4 = subread(indx+2,*subargs)
         | 
| 206 | 
            +
                             ans = lagrange3(xval,x1,x2,x3,x4,y1,y2,y3,y4)
         | 
| 207 | 
            +
             | 
| 208 | 
            +
                          when CUBIC
         | 
| 209 | 
            +
                             indx = ileft
         | 
| 210 | 
            +
                             x1 = @inds[indx]
         | 
| 211 | 
            +
                             x2 = @inds[indx+1]
         | 
| 212 | 
            +
                             y1 = subread(indx,*subargs)
         | 
| 213 | 
            +
                             y2 = subread(indx+1,*subargs)
         | 
| 214 | 
            +
                             ans = cubic(xval,indx,x1,x2,y1,y2,*subargs)
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                          when CATMULL
         | 
| 217 | 
            +
                             indx = ileft
         | 
| 218 | 
            +
                             tinds = @inds.dup              # were gonna prepend and append 2 control points temporarily
         | 
| 219 | 
            +
                             tdeps = @deps.dup                 
         | 
| 220 | 
            +
                             tinds.insert(0,@inds[0])
         | 
| 221 | 
            +
                             tinds << @inds[-1]
         | 
| 222 | 
            +
                             tdeps.insert(0,@deps[0])
         | 
| 223 | 
            +
                             tdeps << @deps[-1]
         | 
| 224 | 
            +
                             indx=indx+1
         | 
| 225 | 
            +
                             x0 = tinds[indx-1]
         | 
| 226 | 
            +
                             x1 = tinds[indx]
         | 
| 227 | 
            +
                             x2 = tinds[indx+1]
         | 
| 228 | 
            +
                             x3 = tinds[indx+2]
         | 
| 229 | 
            +
                             y0 = catsubread(indx-1,tdeps,*subargs)
         | 
| 230 | 
            +
                             y1 = catsubread(indx,tdeps,*subargs)
         | 
| 231 | 
            +
                             y2 = catsubread(indx+1,tdeps,*subargs)
         | 
| 232 | 
            +
                             y3 = catsubread(indx+2,tdeps,*subargs)                 
         | 
| 233 | 
            +
                             ans = catmull(xval,x0,x1,x2,x3,y0,y1,y2,y3)
         | 
| 234 | 
            +
                             
         | 
| 238 235 | 
             
                          else
         | 
| 239 236 | 
             
                             raise("invalid interpolation type")
         | 
| 240 237 | 
             
                          end
         | 
| @@ -245,28 +242,54 @@ module Interpolator | |
| 245 242 | 
             
            #
         | 
| 246 243 | 
             
            #  Same as read
         | 
| 247 244 | 
             
            #
         | 
| 248 | 
            -
                    | 
| 249 | 
            -
                      read(*args)
         | 
| 250 | 
            -
                   end  
         | 
| 245 | 
            +
                   alias_method :interpolate,:read
         | 
| 251 246 |  | 
| 252 247 | 
             
                   protected
         | 
| 248 | 
            +
                   
         | 
| 249 | 
            +
                   def subread (i,*subargs)
         | 
| 250 | 
            +
                      if subargs == []
         | 
| 251 | 
            +
                         @deps[i]
         | 
| 252 | 
            +
                      else
         | 
| 253 | 
            +
                         @deps[i].read(*subargs)
         | 
| 254 | 
            +
                      end
         | 
| 255 | 
            +
                   end
         | 
| 256 | 
            +
                   def catsubread (i,tdeps,*subargs)
         | 
| 257 | 
            +
                      if subargs == []
         | 
| 258 | 
            +
                         tdeps[i]
         | 
| 259 | 
            +
                      else
         | 
| 260 | 
            +
                         tdeps[i].read(*subargs)
         | 
| 261 | 
            +
                      end
         | 
| 262 | 
            +
                   end
         | 
| 253 263 |  | 
| 254 | 
            -
            # replace later with a high speed bisection
         | 
| 255 264 |  | 
| 265 | 
            +
            #
         | 
| 266 | 
            +
            # high speed bracket via last index and bisection
         | 
| 267 | 
            +
            # 
         | 
| 256 268 | 
             
                   def bracket (x)
         | 
| 257 | 
            -
                        | 
| 258 | 
            -
             | 
| 259 | 
            -
             | 
| 260 | 
            -
             | 
| 261 | 
            -
             | 
| 262 | 
            -
             | 
| 269 | 
            +
                       if (x<=@inds[0])
         | 
| 270 | 
            +
                           @ilast=0
         | 
| 271 | 
            +
                       elsif (x>=@inds[-2])
         | 
| 272 | 
            +
                           @ilast = @inds.size-2
         | 
| 273 | 
            +
                       else   
         | 
| 274 | 
            +
                           low  = 0
         | 
| 275 | 
            +
                           high = @inds.size-1
         | 
| 276 | 
            +
                           while !(x>=@inds[@ilast] && x<@inds[@ilast+1])
         | 
| 277 | 
            +
                              if (x>@inds[@ilast])
         | 
| 278 | 
            +
                                 low    =  @ilast + 1
         | 
| 279 | 
            +
                                 @ilast = (high - low) / 2 + low
         | 
| 280 | 
            +
                              else
         | 
| 281 | 
            +
                                 high    =  @ilast - 1
         | 
| 282 | 
            +
                                 @ilast = high - (high - low) / 2                  
         | 
| 283 | 
            +
                              end
         | 
| 284 | 
            +
                           end
         | 
| 263 285 | 
             
                       end
         | 
| 264 | 
            -
                        | 
| 286 | 
            +
                       @ilast
         | 
| 265 287 | 
             
                   end
         | 
| 266 288 |  | 
| 267 289 | 
             
                   def linear (x,x1,x2,y1,y2)
         | 
| 268 290 | 
             
                     r = (y2-y1) / (x2-x1) * (x-x1) + y1
         | 
| 269 291 | 
             
                   end
         | 
| 292 | 
            +
                   
         | 
| 270 293 | 
             
                   def lagrange2(x,x1,x2,x3,y1,y2,y3)   
         | 
| 271 294 | 
             
                     c12 = x1 - x2
         | 
| 272 295 | 
             
                     c13 = x1 - x3
         | 
| @@ -279,6 +302,7 @@ module Interpolator | |
| 279 302 | 
             
                     xx3 = x - x3
         | 
| 280 303 | 
             
                     r = xx3*(q1*xx2 - q2*xx1) + q3*xx1*xx2
         | 
| 281 304 | 
             
                   end
         | 
| 305 | 
            +
                   
         | 
| 282 306 | 
             
                   def lagrange3(x,x1,x2,x3,x4,y1,y2,y3,y4)
         | 
| 283 307 | 
             
                     c12 = x1 - x2
         | 
| 284 308 | 
             
                     c13 = x1 - x3
         | 
| @@ -297,6 +321,53 @@ module Interpolator | |
| 297 321 | 
             
                     r = xx4*(xx3*(q1*xx2 - q2*xx1) + q3*xx1*xx2) - q4*xx1*xx2*xx3
         | 
| 298 322 | 
             
                   end
         | 
| 299 323 |  | 
| 324 | 
            +
                   def catmull(xval,x0,x1,x2,x3,y0,y1,y2,y3)
         | 
| 325 | 
            +
                        m0 = (y2-y0)/(x2-x0)
         | 
| 326 | 
            +
                        m1 = (y3-y1)/(x3-x1)
         | 
| 327 | 
            +
                        h  = x2-x1
         | 
| 328 | 
            +
                        t  = (xval - x1)/h
         | 
| 329 | 
            +
                        h00 = 2.0*t**3 - 3.0*t**2+1.0
         | 
| 330 | 
            +
                        h10 = t**3-2.0*t**2+t
         | 
| 331 | 
            +
                        h01 = -2.0*t**3+3.0*t**2
         | 
| 332 | 
            +
                        h11 = t**3-t**2
         | 
| 333 | 
            +
                        ans = h00*y1+h10*h*m0+h01*y2+h11*h*m1
         | 
| 334 | 
            +
                   end
         | 
| 335 | 
            +
                   
         | 
| 336 | 
            +
                   def cubic(x,indx,x1,x2,y1,y2,*subargs)
         | 
| 337 | 
            +
                     if @secderivs == []
         | 
| 338 | 
            +
                       @secderivs = second_derivs(*subargs)  # this is painful so lets just do it once
         | 
| 339 | 
            +
                     end
         | 
| 340 | 
            +
                     step = x2 - x1
         | 
| 341 | 
            +
                     a = (x2 - x) / step
         | 
| 342 | 
            +
                     b = (x - x1) / step
         | 
| 343 | 
            +
                     r = a * y1 + b * y2 + ((a*a*a-a) * @secderivs[indx] + (b*b*b-b) * @secderivs[indx+1]) * (step*step) / 6.0
         | 
| 344 | 
            +
                   end
         | 
| 345 | 
            +
                   
         | 
| 346 | 
            +
                   def second_derivs(*subargs)
         | 
| 347 | 
            +
                    # natural spline has 0 second derivative at the ends
         | 
| 348 | 
            +
                     temp   = [0.0]
         | 
| 349 | 
            +
                     secder = [0.0]
         | 
| 350 | 
            +
                     if subargs.size==0
         | 
| 351 | 
            +
                       deps2 = @deps
         | 
| 352 | 
            +
                     else
         | 
| 353 | 
            +
                       deps2 = @deps.map do |a|
         | 
| 354 | 
            +
                          a.read(*subargs)
         | 
| 355 | 
            +
                       end
         | 
| 356 | 
            +
                     end
         | 
| 357 | 
            +
                     1.upto(@inds.size-2) do |i|
         | 
| 358 | 
            +
                        sig  = (@inds[i] - @inds[i-1])/(@inds[i+1] - @inds[i-1])
         | 
| 359 | 
            +
                        prtl = sig * secder[i-1] + 2.0
         | 
| 360 | 
            +
                        secder << (sig-1.0)/prtl
         | 
| 361 | 
            +
                        temp << ((deps2[i+1]-deps2[i])/(@inds[i+1]-@inds[i]) - (deps2[i]-deps2[i-1])/(@inds[i]-@inds[i-1]))
         | 
| 362 | 
            +
                        temp[i]=(6.0*temp[i]/(@inds[i+1]-@inds[i-1])-sig*temp[i-1])/prtl
         | 
| 363 | 
            +
                     end
         | 
| 364 | 
            +
                    # natural spline has 0 second derivative at the ends
         | 
| 365 | 
            +
                     secder << 0.0
         | 
| 366 | 
            +
                     (@inds.size-2).downto(0) do |i|
         | 
| 367 | 
            +
                        secder[i]=secder[i]*secder[i+1]+temp[i]
         | 
| 368 | 
            +
                     end
         | 
| 369 | 
            +
                     secder
         | 
| 370 | 
            +
                   end
         | 
| 300 371 | 
             
                end
         | 
| 301 372 |  | 
| 302 373 | 
             
            if __FILE__ == $0 then
         | 
| @@ -311,25 +382,35 @@ require 'test/unit' | |
| 311 382 | 
             
                   @t2 = Table.new([1.0,2.0],[Table.new([1.0,2.0],[3.0,4.0]),Table.new([2.0,3.0,5.0],[6.0,-1.0,7.0])])
         | 
| 312 383 | 
             
                   @t3 = Table.new [1.0,2.0],[3.0,4.0]
         | 
| 313 384 | 
             
                   @t4 = Table.new(
         | 
| 314 | 
            -
                           1=>Table.new(
         | 
| 315 | 
            -
                             1=>Table.new([1.0,2.0,3.0], | 
| 316 | 
            -
             | 
| 317 | 
            -
                              | 
| 318 | 
            -
             | 
| 319 | 
            -
                              | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 322 | 
            -
             | 
| 323 | 
            -
             | 
| 324 | 
            -
                             5=>Table.new([11.0,12. | 
| 385 | 
            +
                           1.0=>Table.new(
         | 
| 386 | 
            +
                             1.0=>Table.new([1.0,2.0,3.0],
         | 
| 387 | 
            +
                                            [4.0,5.0,6.0]),
         | 
| 388 | 
            +
                             4.0=>Table.new([11.0,12.0,13.0],
         | 
| 389 | 
            +
                                            [14.0,15.0,16.0]),
         | 
| 390 | 
            +
                             5.0=>Table.new([11.0,12.0,13.0],
         | 
| 391 | 
            +
                                            [-14.0,-15.0,-16.0])),
         | 
| 392 | 
            +
                           2.0=>Table.new(
         | 
| 393 | 
            +
                             2.0=>Table.new([1.1,2.0,3.0],
         | 
| 394 | 
            +
                                            [4.0,5.0,6.0]),
         | 
| 395 | 
            +
                             5.0=>Table.new([11.0,12.5,13.0],
         | 
| 396 | 
            +
                                            [14.0,15.0,16.0]),
         | 
| 397 | 
            +
                             6.2=>Table.new([1.0,12.0],
         | 
| 398 | 
            +
                                            [-14.0,-16.0])),
         | 
| 399 | 
            +
                           8.0=>Table.new(
         | 
| 400 | 
            +
                             1.0=>Table.new([1.0,2.0,3.0],
         | 
| 401 | 
            +
                                            [4.0,5.0,6.0]),
         | 
| 402 | 
            +
                             5.0=>Table.new([11.0,12.0,13.0],
         | 
| 403 | 
            +
                                            [-14.0,-15.0,-16.0]))
         | 
| 325 404 | 
             
                         )
         | 
| 326 405 | 
             
                   @t5 = Table.new [1.0,2.0,3.0],[1.0,4.0,9.0]     
         | 
| 327 406 | 
             
                   @t6 = Table.new [1.0,2.0,3.0,4.0],[1.0,8.0,27.0,64.0]     
         | 
| 407 | 
            +
                   @t7 = Table.new [0.0,0.8,1.9,3.1,4.2,5.0],[1.0,1.0,1.0,2.0,2.0,2.0]
         | 
| 408 | 
            +
                   @t8 = Table.new [0.0,1.0,2.0,3.0,4.0,5.0,6.0],[0.0,0.8415,0.9093,0.1411,-0.7568,-0.9589,-0.2794]
         | 
| 409 | 
            +
                   @t9 = Table.new([1.0,2.0,3.0],
         | 
| 410 | 
            +
                                   [Table.new([1.0,2.0],[3.0,4.0]),Table.new([2.0,3.0,5.0],[6.0,-1.0,7.0]),Table.new([4.0,5.0,6.0],[7.0,8.0,9.0])])
         | 
| 411 | 
            +
                   @t10 = Table.new [1.5,2.0,3.0,4.0],[4.0,5.0,6.0,7.0]
         | 
| 328 412 | 
             
                  end
         | 
| 329 413 |  | 
| 330 | 
            -
                  # def teardown
         | 
| 331 | 
            -
                  # end
         | 
| 332 | 
            -
             | 
| 333 414 | 
             
                  def test_uni
         | 
| 334 415 | 
             
                    assert_equal(@t1.read(1.0) ,     3.0)
         | 
| 335 416 | 
             
                    assert_equal(@t1.read(2.0) ,     4.0)
         | 
| @@ -375,7 +456,9 @@ require 'test/unit' | |
| 375 456 | 
             
                     assert_raise( RuntimeError ) {@t3.read(1.0)}    
         | 
| 376 457 | 
             
                     @t3.style=Table::LAGRANGE3
         | 
| 377 458 | 
             
                     assert_raise( RuntimeError ) {@t3.read(1.0)} 
         | 
| 378 | 
            -
                     @t3.style=Table:: | 
| 459 | 
            +
                     @t3.style=Table::CUBIC
         | 
| 460 | 
            +
                     assert_raise( RuntimeError ) {@t3.read(1.0)} 
         | 
| 461 | 
            +
                     @t3.style=Table::LINEAR         
         | 
| 379 462 | 
             
                     assert_nothing_raised( RuntimeError ) {@t3.read(1)}         
         | 
| 380 463 | 
             
                  end
         | 
| 381 464 | 
             
                  def test_notmono
         | 
| @@ -404,19 +487,41 @@ require 'test/unit' | |
| 404 487 | 
             
                     assert_raise( RuntimeError ) {
         | 
| 405 488 | 
             
                       t = Table.new [1.0,-2.0,1.5],[1.0,2.0,3.0]
         | 
| 406 489 | 
             
                       t.style=10
         | 
| 407 | 
            -
                       t.read(1)
         | 
| 490 | 
            +
                       t.read(1.0)
         | 
| 408 491 | 
             
                     }
         | 
| 492 | 
            +
                     @t7.style = Table::CUBIC
         | 
| 493 | 
            +
                     assert_in_delta(0.93261392,@t7.read(1.2),0.000001)
         | 
| 494 | 
            +
                     @t8.style = Table::CUBIC
         | 
| 495 | 
            +
                     assert_in_delta(0.59621,@t8.read(2.5),0.000001)
         | 
| 496 | 
            +
                     @t9.style = Table::CUBIC
         | 
| 497 | 
            +
                     assert_in_delta(8.98175,@t9.read(2.3,1.5),0.000001)
         | 
| 498 | 
            +
                     @t10.style=Table::CATMULL
         | 
| 499 | 
            +
                     assert_in_delta(3.666666,@t10.read(1.0),0.00001)
         | 
| 500 | 
            +
                     assert_in_delta(5.5416666,@t10.read(2.5),0.00001)
         | 
| 501 | 
            +
                     assert_in_delta(6.0,@t10.read(0.5),0.00001)
         | 
| 502 | 
            +
                     assert_in_delta(8.0,@t10.read(5.0),0.00001)
         | 
| 503 | 
            +
                     assert_in_delta(6.5,@t10.read(3.5),0.00001)
         | 
| 504 | 
            +
                     assert_in_delta(4.8427,@t10.read(1.9),0.0001)
         | 
| 505 | 
            +
                     @t10.extrapolate=false
         | 
| 506 | 
            +
                     assert_equal(4.0,@t10.read(1.0))
         | 
| 507 | 
            +
                     assert_equal(7.0,@t10.read(99.0))
         | 
| 409 508 | 
             
                  end
         | 
| 410 509 | 
             
                  def test_block
         | 
| 411 510 | 
             
                    t = Table.new [1.0,2.0,3.0],[3.0,4.0,5.0] do |tab| tab.extrapolate=false;tab.style=Table::LAGRANGE2 end
         | 
| 412 511 | 
             
                    assert_equal(t.read(4.0),5.0)
         | 
| 413 512 | 
             
                  end
         | 
| 513 | 
            +
                  def test_alias
         | 
| 514 | 
            +
                    assert_equal(@t1.read(1.5),@t1.interpolate(1.5))
         | 
| 515 | 
            +
                  end
         | 
| 516 | 
            +
                  def test_numargs
         | 
| 517 | 
            +
                    assert_raise( RuntimeError ) {@t1.read}
         | 
| 518 | 
            +
                    assert_raise( RuntimeError ) {@t2.read(1.0)}
         | 
| 519 | 
            +
                    assert_raise( RuntimeError ) {@t2.read(1.0,1.0,1.0)}
         | 
| 520 | 
            +
                    assert_nothing_raised( RuntimeError ) {@t2.read(1.0,1.0)}
         | 
| 521 | 
            +
                  end
         | 
| 414 522 |  | 
| 415 523 | 
             
                end
         | 
| 416 524 |  | 
| 525 | 
            +
             end
         | 
| 417 526 |  | 
| 418 527 | 
             
            end
         | 
| 419 | 
            -
             | 
| 420 | 
            -
             | 
| 421 | 
            -
            end
         | 
| 422 | 
            -
             | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: interpolator
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: "0. | 
| 4 | 
            +
              version: "0.14"
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - Eric T Meyers
         | 
| @@ -9,7 +9,7 @@ autorequire: | |
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date: 2009-08- | 
| 12 | 
            +
            date: 2009-08-15 00:00:00 -04:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: []
         | 
| 15 15 |  | 
| @@ -51,6 +51,6 @@ rubyforge_project: interpolator | |
| 51 51 | 
             
            rubygems_version: 1.3.5
         | 
| 52 52 | 
             
            signing_key: 
         | 
| 53 53 | 
             
            specification_version: 3
         | 
| 54 | 
            -
            summary: Module Interpolator proves a table class that supports n-dimensional numerical table construction, interpolation and extrapolation. Includes linear, 2nd order and 3rd order  | 
| 54 | 
            +
            summary: Module Interpolator proves a table class that supports n-dimensional numerical table construction, interpolation and extrapolation. Includes linear, 2nd order and 3rd order lagrange, natural and catmull-rom spline techniques.
         | 
| 55 55 | 
             
            test_files: []
         | 
| 56 56 |  |