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: by tkbletsc
