module NumRu::Misc

Public Instance Methods

check_shape_consistency(cshapes, *args) click to toggle source
# File lib/numru/misc/misc.rb, line 92
def check_shape_consistency(cshapes, *args)
   ranks = Array.new
   elm2idx = Hash.new
   spl = cshapes.split(' +')
   if spl.length >= 2 && /^\.\.\.?$/ =~ spl[-1]  # '..' or '...'
      ((spl.length-1)...args.length).each{|i|
         spl[i]=spl[i-1]
      }         
   end
   if spl.length != args.length
      raise ArgumentError,"# of the argument (#{args.length}) is inconsistent with the 1st arg '#{cshapes}'"
   end
   spl.each_with_index{|csh,i| 
      sh = csh.split(',')
      ranks.push( sh.length )
      sh.each_with_index{|tag,j|
         elm2idx[tag] = Array.new if !elm2idx[tag]
         elm2idx[tag].push([i,j])
      }
   }
   ranks.each_with_index{|len,i|
      if args[i].rank != len
         raise "(#{i+1}th arg) unexepected rank #{args[i].rank} for #{len}"
      end
   }
   elm2idx.each{|tag,ary|
      if tag.to_i > 0   # numeric (positive integer)
         size = tag.to_i
         start = 0
      else              # alphabet
         size = args[ary[0][0]].shape[ary[0][1]]
         start = 1
      end
      (start...ary.length).each{|i|
         if args[ary[i][0]].shape[ary[i][1]] != size
            if start == 0
               raise "length of dim #{ary[i][1]} of #{ary[i][0]+1}th "+
                     "arg is unexpected " +
                     "(#{args[ary[i][0]].shape[ary[i][1]]} for #{size})"
            else
               raise "Dimension lengths inconsistent between "+
                  "dim #{ary[0][1]} of #{ary[0][0]+1}th arg and " +
                  "dim #{ary[i][1]} of #{ary[i][0]+1}th arg"
            end
         end
      }
   }
   nil
end