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