On Thu, Dec 07, 2006 at 04:25:43PM +0900, Gary Boone wrote:
} 
} Suppose you want to do several runs of a program or function, varying
} the parameters each time. You start with a hash of parameter lists:
} 
}     params = { speed=>[1,2,3], beta=>[0.1, 0.002, 0.4], x=>['a', 'b'] }
} 
} Given this set, you'll call the test function 18 times:
} 
}    test_function( {speed=>1, beta=>0.1, x=>'a'} )
}    test_function( {speed=>1, beta=>0.1, x=>'b'} )
}    test_function( {speed=>1, beta=>0.002, x=>'a'} )
}    ... etc
} 
} So the puzzle is how to take the original params list and generate a
} list of all the combinations of the parameters? The resulting parameter
} sets will be passed one at a time to the function as shown above.
} 
} Notes:
} - I used hashes and lists to explain the problem. Maybe there's a better
} way.
} - You don't know how many parameters will be given.
} - The number of values for each parameter is unknown in advance.
} - The parameters have different types, as shown above. Each parameter's
} values are all the same type, though.

params = { :speed => [1,2,3], :beta => [0.1, 0.002, 0.4], :x => ['a', 'b'] }

all = params.inject([{}]) do |perms,(k,list)|
        perms.inject([]) do |expanded,base|
          list.each do |v|
            expanded << base.merge(k => v)
          end
          expanded
        end
      end

require 'yaml'
puts all.size
puts all.to_yaml

--Greg