Skip to content

Commit

Permalink
Merge pull request #94 from johnlees/refine_range
Browse files Browse the repository at this point in the history
Improved default model refinement range
  • Loading branch information
johnlees committed Jul 14, 2020
2 parents 58bef9e + 122cab9 commit 161ba02
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 14 deletions.
8 changes: 4 additions & 4 deletions PopPUNK/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,10 +160,10 @@ def get_options():

# model refinement
refinementGroup = parser.add_argument_group('Refine model options')
refinementGroup.add_argument('--pos-shift', help='Maximum amount to move the boundary away from origin [default = 0.2]',
type=float, default=0.2)
refinementGroup.add_argument('--neg-shift', help='Maximum amount to move the boundary towards the origin [default = 0.4]',
type=float, default=0.4)
refinementGroup.add_argument('--pos-shift', help='Maximum amount to move the boundary away from origin [default = to between-strain mean]',
type=float, default = None)
refinementGroup.add_argument('--neg-shift', help='Maximum amount to move the boundary towards the origin [default = to within-strain mean]',
type=float, default = None)
refinementGroup.add_argument('--manual-start', help='A file containing information for a start point. '
'See documentation for help.', default=None)
refinementGroup.add_argument('--indiv-refine', help='Also run refinement for core and accessory individually', default=False,
Expand Down
17 changes: 9 additions & 8 deletions PopPUNK/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ def fit(self, X, sample_names, model, max_move, min_move, startFile = None, indi
raise RuntimeError("Unrecognised model type")

# Main refinement in 2D
self.start_point, self.optimal_x, self.optimal_y = refineFit(X/self.scale,
self.start_point, self.optimal_x, self.optimal_y, self.min_move, self.max_move = refineFit(X/self.scale,
sample_names, self.start_s, self.mean0, self.mean1, self.max_move, self.min_move,
slope = 2, no_local = no_local, num_processes = threads)
self.fitted = True
Expand All @@ -597,13 +597,14 @@ def fit(self, X, sample_names, model, max_move, min_move, startFile = None, indi
if indiv_refine:
try:
sys.stderr.write("Refining core and accessory separately\n")

start_point, self.core_boundary, core_acc = refineFit(X/self.scale, sample_names, self.start_s,
self.mean0, self.mean1, self.max_move, self.min_move, slope = 0, no_local = no_local,
num_processes = threads)
start_point, acc_core, self.accessory_boundary = refineFit(X/self.scale, sample_names, self.start_s,
self.mean0, self.mean1, self.max_move, self.min_move, slope = 1, no_local = no_local,
num_processes = threads)
# optimise core distance boundary
start_point, self.core_boundary, core_acc, self.min_move, self.max_move = refineFit(X/self.scale,
sample_names, self.start_s, self.mean0, self.mean1, self.max_move, self.min_move,
slope = 0, no_local = no_local,num_processes = threads)
# optimise accessory distance boundary
start_point, acc_core, self.accessory_boundary, self.min_move, self.max_move = refineFit(X/self.scale,
sample_names, self.start_s,self.mean0, self.mean1, self.max_move, self.min_move, slope = 1,
no_local = no_local, num_processes = threads)
self.indiv_fitted = True
except RuntimeError as e:
sys.stderr.write("Could not separately refine core and accessory boundaries. "
Expand Down
9 changes: 7 additions & 2 deletions PopPUNK/refine.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ def refineFit(distMat, sample_names, start_s, mean0, mean1,
sys.stderr.write("Decision boundary starts at (" + "{:.2f}".format(start_point[0])
+ "," + "{:.2f}".format(start_point[1]) + ")\n")

# calculate distance between start point and means if none is supplied
if min_move is None:
min_move = ((mean0[0] - start_point[0])**2 + (mean0[1] - start_point[1])**2)**0.5
if max_move is None:
max_move = ((mean1[0] - start_point[0])**2 + (mean1[1] - start_point[1])**2)**0.5

# Boundary is left of line normal to this point and first line
gradient = (mean1[1] - mean0[1]) / (mean1[0] - mean0[0])

Expand Down Expand Up @@ -121,7 +127,7 @@ def refineFit(distMat, sample_names, start_s, mean0, mean1,
if optimal_x < 0 or optimal_y < 0:
raise RuntimeError("Optimisation failed: produced a boundary outside of allowed range\n")

return start_point, optimal_x, optimal_y
return start_point, optimal_x, optimal_y, min_move, max_move


def newNetwork(s, sample_names, distMat, start_point, mean1, gradient, slope=2, cpus = 1):
Expand Down Expand Up @@ -299,4 +305,3 @@ def decisionBoundary(intercept, gradient):
y = intercept[1] + intercept[0] / gradient
return(x, y)


0 comments on commit 161ba02

Please sign in to comment.