| 93 | return ret, max_idx |
| 94 | |
| 95 | class problem(Structure): |
| 96 | _names = ["l", "n", "y", "x", "bias"] |
| 97 | _types = [c_int, c_int, POINTER(c_double), POINTER(POINTER(feature_node)), c_double] |
| 98 | _fields_ = genFields(_names, _types) |
| 99 | |
| 100 | def __init__(self, y, x, bias = -1): |
| 101 | if len(y) != len(x) : |
| 102 | raise ValueError("len(y) != len(x)") |
| 103 | self.l = l = len(y) |
| 104 | self.bias = -1 |
| 105 | |
| 106 | max_idx = 0 |
| 107 | x_space = self.x_space = [] |
| 108 | for i, xi in enumerate(x): |
| 109 | tmp_xi, tmp_idx = gen_feature_nodearray(xi) |
| 110 | x_space += [tmp_xi] |
| 111 | max_idx = max(max_idx, tmp_idx) |
| 112 | self.n = max_idx |
| 113 | |
| 114 | self.y = (c_double * l)() |
| 115 | for i, yi in enumerate(y): self.y[i] = y[i] |
| 116 | |
| 117 | self.x = (POINTER(feature_node) * l)() |
| 118 | for i, xi in enumerate(self.x_space): self.x[i] = xi |
| 119 | |
| 120 | self.set_bias(bias) |
| 121 | |
| 122 | def set_bias(self, bias): |
| 123 | if self.bias == bias: |
| 124 | return |
| 125 | if bias >= 0 and self.bias < 0: |
| 126 | self.n += 1 |
| 127 | node = feature_node(self.n, bias) |
| 128 | if bias < 0 and self.bias >= 0: |
| 129 | self.n -= 1 |
| 130 | node = feature_node(-1, bias) |
| 131 | |
| 132 | for xi in self.x_space: |
| 133 | xi[-2] = node |
| 134 | self.bias = bias |
| 135 | |
| 136 | |
| 137 | class parameter(Structure): |