    # File lib/facets/core/string/similarity.rb, line 25
      def similarity( str_in )
        return 0 if str_in == nil
        return 1 if self == str_in

        # Make a graph of each word (okay, so its not a true graph, but is similar)
        graph_A = Array.new
        graph_B = Array.new

        # "graph" self
        last = self.length
        (0..last).each do |ff|
          loc  = self.length
          break if ff == last - 1
          wordB = (1..(last-1)).to_a.reverse!
          if (wordB != nil)
            wordB.each do |ss|
              break if ss == ff
              graph_A.push( "#{self[ff..ss]}" )
            end
          end
        end

        # "graph" input string
        last = str_in.length
        (0..last).each{ |ff|
          loc  = str_in.length
          break if ff == last - 1
          wordB = (1..(last-1)).to_a.reverse!
          wordB.each do |ss|
            break if ss == ff
            graph_B.push( "#{str_in[ff..ss]}" )
          end
        }

        # count how many of these "graph edges" we have that are the same
        matches = graph_A & graph_B
        #matches = Array.new
        #graph_A.each do |aa|
        #  matches.push( aa ) if( graph_B.include?( aa ) )
        #end

        # For eliminating subsets, we want to start with the smallest hits.
        matches.sort!{|x,y| x.length <=> y.length}

        # eliminate any subsets
        mclone = matches.dup
        mclone.each_index do |ii|
          reg = Regexp.compile( mclone[ii] )
          count = 0.0
          matches.each{|xx| count += 1 if xx =~ reg}
          matches.delete(mclone[ii]) if count > 1
        end

        score = 0.0
        matches.each{ |mm| score += mm.length }
        self.length > str_in.length ? largest = self.length : largest = str_in.length
        return score/largest
      end