python:intvectorrange
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
python:intvectorrange [2012/08/30 17:24] – tkbletsc | python:intvectorrange [2012/09/25 13:04] (current) – tkbletsc | ||
---|---|---|---|
Line 12: | Line 12: | ||
# if only one argument is given to __init__, then the range goes from [0,0,...,0] to the vector given | # if only one argument is given to __init__, then the range goes from [0,0,...,0] to the vector given | ||
class IntVectorRange(object): | class IntVectorRange(object): | ||
- | def __init__(self, | + | |
- | if end is None: | + | if end is None: |
- | end=start | + | end=start |
- | start=[0] * len(end) | + | start=[0] * len(end) |
- | self.start=start | + | |
- | self.end=end | + | self.end=end |
- | self.size = len(start) | + | self.size = len(start) |
- | self.delta = [end[i]-start[i]+1 | + | self.delta = [end[i]-start[i]+1 |
- | self.len = reduce(lambda x,y: x*y, self.delta, 1) | + | self.len = reduce(lambda x,y: x*y, self.delta, 1) |
- | def __getitem__(self, | + | |
- | if index >= self.len: raise IndexError | + | if index >= self.len: raise IndexError |
- | r = [0] * self.size | + | r = [0] * self.size |
- | for i in xrange(self.size): | + | for i in xrange(self.size): |
- | r[i] = index % self.delta[i] + self.start[i] | + | r[i] = index % self.delta[i] + self.start[i] |
- | index /= self.delta[i] | + | index /= self.delta[i] |
- | return r | + | return r |
- | def __len__(self): | + | |
- | + | ||
- | # provides | + | # Provides |
# (based on a binary IntVectorRange object) | # (based on a binary IntVectorRange object) | ||
# | # | ||
- | # Example: | + | # Example: |
# [] | # [] | ||
# | # | ||
Line 45: | Line 45: | ||
# | # | ||
# | # | ||
- | class AllCombinations: | + | class AllSubsets: |
- | def __init__(self, | + | def __init__(self, |
- | self.vector_range = IntVectorRange([1] * len(items)) | + | self.vector_range = IntVectorRange([1] * len(items)) |
- | self.items = items | + | self.items = items |
- | + | ||
- | def __getitem__(self, | + | def __getitem__(self, |
- | v = self.vector_range[index] | + | v = self.vector_range[index] |
- | return [self.items[i] for i in xrange(len(v)) if v[i]] | + | return [self.items[i] for i in xrange(len(v)) if v[i]] |
- | + | ||
- | def __len__(self): | + | def __len__(self): |
# for academic purposes only, here's the same class based on inheritence instead of composition | # for academic purposes only, here's the same class based on inheritence instead of composition | ||
- | class AllCombinations2(IntVectorRange): | + | class AllSubsets2(IntVectorRange): |
def __init__(self, | def __init__(self, | ||
super(AllCombinations2, | super(AllCombinations2, | ||
Line 66: | Line 66: | ||
return [self.items[i] for i in xrange(len(v)) if v[i]] | return [self.items[i] for i in xrange(len(v)) if v[i]] | ||
+ | |||
+ | # Provides a list with all possible " | ||
+ | # | ||
+ | # Example: AllCombinations([" | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | class AllCombinations: | ||
+ | def __init__(self, | ||
+ | self.vector_range = IntVectorRange([len(choice)-1 for choice in choices]) | ||
+ | self.choices = choices | ||
+ | |||
+ | def __getitem__(self, | ||
+ | c_indices = self.vector_range[index] | ||
+ | return [self.choices[i][c_indices[i]] for i in xrange(len(self.choices))] | ||
+ | |||
+ | def __len__(self): | ||
</ | </ | ||
Line 86: | Line 109: | ||
class Choice(list): | class Choice(list): | ||
def optimize(func, | def optimize(func, | ||
- | choices = dict((k, | + | |
- | fixed_values = dict((k,v) for k,v in vargs.items() if not isinstance(v, | + | fixed_values = {} |
- | c_keys = choices.keys() | + | |
- | + | | |
- | choice_max_indices | + | |
- | + | c_keys = choices.keys() | |
- | best_value = None | + | |
- | best_inputs = None | + | |
- | for c_indices | + | best_value = None |
- | #print c_indices | + | best_inputs = None |
- | c_values | + | for c_values |
- | all_values = c_values.copy() | + | |
- | all_values.update(fixed_values) | + | all_values = chosen.copy() |
- | value = func(**all_values) | + | all_values.update(fixed_values) |
- | if best_value is None or is_this_better(value, | + | value = func(**all_values) |
- | best_inputs = c_values | + | if best_value is None or is_this_better(value, |
- | best_value = value | + | best_inputs = chosen |
- | if print_on_better: | + | best_value = value |
- | #print c_values | + | if print_on_better: |
- | return (best_inputs, | + | return (best_inputs, |
</ | </ | ||
+ | |||
+ |
python/intvectorrange.1346372671.txt.gz · Last modified: 2012/08/30 17:24 by tkbletsc