<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def search( self, trace_func: Callable[ [List[LineSequence], float, float, float, bool], None] = None) -> List[LineSequence]: """Issues new linear sequence search. Each call to this method starts new search. Args: trace_func: Optional callable which will be called for each simulated annealing step with arguments: solution candidate (list of linear sequences on the chip), current temperature (float), candidate cost (float), probability of accepting candidate (float), and acceptance decision (boolean). Returns: List of linear sequences on the chip found by this method. """


        def search_trace(state: _STATE, temp: float,
                         cost: float, probability: float, accepted: bool):
            if trace_func:
                trace_seqs, _ = state
                trace_func(trace_seqs, temp, cost, probability, accepted)

        seqs, _ = optimization.anneal_minimize(
            self._create_initial_solution(),
            self._quadratic_sum_cost,
            self._force_edges_active_move,
            self._rand.random_sample,
            trace_func=search_trace)
        return seqs