def exec_oneshot(self, *args): keyframes = self.global_extractor.get_n_keyframes(self.n_globals) n_keyframes = len(keyframes) interps = [] for name in self.curves.keys(): for dim in self.dimensions[name].keys(): if not self.dimensions[name][dim]: continue index = -1 if dim == "rx": index = 1 if dim == "ry": index = 2 if dim == "rz": index = 3 curve = [] for i in range(len(Motion.mocap["single"][name])): curve.append([Motion.mocap["single"][name].item(i, 0), Motion.mocap["single"][name].item(i, index)]) curve = np.array(curve) for i in range(1, n_keyframes): k1 = keyframes[i-1] k2 = keyframes[i] seg_curve = curve[k1:k2+1] interp = interp_f.unconstrained(seg_curve, 100) interps.append(interp) for i in range(len(interps)): seg = interps[i] if len(seg.curve) <= 3: interps[i] = interp_f.line(seg.curve, 100) self.interps = interps self.app.update() return interps
def create_zerotable(self): n = self.n_data self.zero_table = [[-1 for i in range(n)] for j in range(n)] curve_tangents = segment_fitting.tangents_of_curve(self.curve) if self.verbose: print "Creating zerostop table" print "-" * (n-1) for i in range(n - 1): if self.verbose: sys.stdout.write("#") for j in range(i, n): if i == j: continue if abs(i - j) == 1: self.zero_table[i][j] = 0 else: seg = make_seg.true_tangents( self.curve[i:j+1] , curve_tangents[i:j+1] , self.res ) cost, cost_index = self.cost_fn(seg) self.zero_table[i][j] = cost if self.verbose: print ""
def per_segment_solve(self, curve, keyframes): interps = [] res = Algorithm.interp_res curve_tangents = segment_fitting.tangents_of_curve(curve) # Do initial fit using true tangents and # iterating-constrainted-salient-points n_keyframes = len(keyframes) for i in range(1, n_keyframes): k1 = keyframes[i-1] k2 = keyframes[i] seg_curve = curve[k1:k2+1] seg_tangents = curve_tangents[k1:k2+1] # if len(seg_curve) > 3: interp = interp_f.true_tangents( seg_curve , seg_tangents , res) # for j in range(5): # nts = interp.ts_nearest() # interp = interp_f.true_tangents( interp.curve # , curve_tangents # , res # , nts) interps.append(interp) return interps
def exec_coupledsolve(self, *args): keyframes = self.global_extractor.get_n_keyframes(self.n_globals) n_keyframes = len(keyframes) interps = [] for name in self.curves.keys(): for dim in self.dimensions[name].keys(): if not self.dimensions[name][dim]: continue index = -1 if dim == "rx": index = 1 if dim == "ry": index = 2 if dim == "rz": index = 3 curve = [] for i in range(len(Motion.mocap["single"][name])): curve.append([Motion.mocap["single"][name].item(i, 0), Motion.mocap["single"][name].item(i, index)]) curve = np.array(curve) interps += global_fitting.coupled_solve( curve , keyframes , self.alpha , self.beta , 100) for i in range(len(interps)): seg = interps[i] if len(seg.curve) <= 3: interps[i] = interp_f.line(seg.curve, 100) self.interps = interps self.app.update() return interps
def coupled_solve(self, curve, keyframes): interps = global_fitting.coupled_solve( curve , keyframes , self.r_straight_tangents , self.r_small_tangents , Algorithm.interp_res) for i in range(len(interps)): seg = interps[i] if len(seg.curve) <= 3: interps[i] = interp_f.line(seg.curve, Algorithm.interp_res) return interps
def create_zerostop_truetangents_cl(self): tmp_table = [[[0] for i in range(self.n_data)] for j in range(self.n_data)] curve_tangents = segment_fitting.tangents_of_curve(self.curve) cols = [] col_index = 0 n_i, n_j = self.curve.shape n = n_j inds_a = [] inds_b = [] inds_c = [] fill_cell = [] if self.verbose: print "-" * (self.n_data - 1) for s in range(self.n_data - 1): if self.verbose: sys.stdout.write("#") for e in range(s + 1, self.n_data): if s == e: continue if abs(e - s) == 1: continue else: seg = make_seg.true_tangents( self.curve[s:e+1] , curve_tangents[s:e+1] , self.res ) a_p = seg.n_curve_interps(30) b_p = seg.n_sampling(30) # print a_p[:10] # print a_b[:10] # raise "hi" for i in range(len(a_p)): cols += a_p[i].tolist() inds_a.append(col_index); col_index += 1 cols += b_p[i].tolist() inds_b.append(col_index); col_index += 1 inds_c.append(0) fill_cell.append((s, e)) if self.verbose: print "" results = gg.gogo("dist_many.cl", n, cols, inds_a, inds_b, inds_c) for i in range(len(fill_cell)): s, e = fill_cell[i] tmp_table[s][e].append(results[i]) self.zero_table = [[-1 for i in range(self.n_data)] for j in range(self.n_data)] for i in range(self.n_data): for j in range(self.n_data): self.zero_table[i][j] = sum(tmp_table[i][j])
def tighten_fitting_with_breaking(self, interps): for i in range(len(interps)): interp = interps[i] refit = interp_f.unconstrained( interp.curve , Algorithm.interp_res ) cost_org = Algorithm.eval_method_refit(interp)[0] cost_new = Algorithm.eval_method_refit(refit)[0] if cost_org == 0: continue # print "%s %s %d improved = before:%2.3f after:%2.3f" % i, cost_org, cost_new) if 1 - (cost_new / float(cost_org)) > Algorithm.refit_cost: interps[i] = refit return interps
def eval_errors(self): def keyframe_of_worst(cases): max_cost = 0 keyframe = -1 for (cost, index) in cases: if cost > max_cost: max_cost = cost keyframe = index return keyframe def combine_costs(cases): return max([case[0] for c in cases]) worst_cases = [] for i in range(1, n_keyframes): k1 = keyframes[i-1] k2 = keyframes[i] seg = make_seg.unconstrained(self.curve[k1:k2+1], self.res) cost, index = self.cost_fn(seg) worst_cases.append([cost, k1 + index]) return combine_costs(cases)
def coupled_solve(curve, keyframes, alpha, t_lambda, res): # Break the motion curve into a list of segments segments = [] for i in range(1, len(keyframes)): start = keyframes[i - 1] finish = keyframes[i] segments.append(curve[start:finish + 1]) # Run least-sqaures solve, and format solved = solve_constrained(segments, keyframes, alpha, t_lambda) output = [solved[i] for i in range(len(solved))] # Format results into a chain of interpolation functions. interps = [] for i in range(len(segments)): seg = segments[i] hB = np.array([output[i * 4 + 0], output[i * 4 + 2]]) hC = np.array([output[i * 4 + 1], output[i * 4 + 3]]) interp = InterpolationFactory.from_coordinates(seg, res, seg[0], hB, hC, seg[-1]) interps.append(interp) return interps