-- Automating tedious start to electron density puzzles
recipename= "Electron Density kick-off v0.2"
-- Adjust default values based on puzzle segment count
segmentCount = structure.GetCount()
defWiggle = segmentCount / 100
defShake = segmentCount / 1000
defCycle = segmentCount / 200
local ask = dialog.CreateDialog("Electron Density - start of puzzle")
ask.revertWiggleStrength = dialog.AddCheckbox("Wiggle strenth Auto when finished?", false)
ask.firstShakeOrWiggle = dialog.AddCheckbox("Shake first?", true)
ask.instructionsIterations = dialog.AddLabel("Iters before checking for improvement")
ask.wiggleIterations = dialog.AddSlider("Wiggle Iters", 7, 1, 20, 0)
ask.shakeIterations = dialog.AddSlider("Shake Iters", 3, 1, 10, 0)
ask.instructionsMinimums = dialog.AddLabel("Minimum improvements before break out")
ask.wiggleImprovement = dialog.AddSlider("Wiggle Min", defWiggle, 0.1, 100, 2)
ask.shakeImprovement = dialog.AddSlider("Shake Min", defShake, 0.01, 10, 2)
ask.cycleImprovement = dialog.AddSlider("Cycle Min", defCycle, 0.1, 100, 2)
ask.OK = dialog.AddButton("OK", 1)
ask.Cancel = dialog.AddButton("Cancel", 0)
if (dialog.Show(ask) > 0) then
wiggleIterations = ask.wiggleIterations.value
shakeIterations = ask.shakeIterations.value
revertWiggleStrength = ask.revertWiggleStrength.value
wiggleImprovement = ask.wiggleImprovement.value
shakeImprovement = ask.shakeImprovement.value
cycleImprovement = ask.cycleImprovement.value
shakeOrWiggle = ask.firstShakeOrWiggle
end
print ("Puzzle size = "..segmentCount)
print ("wiggleIterations = "..wiggleIterations)
print ("shakeIterations = "..shakeIterations)
print ("wiggleImprovement breakout = "..wiggleImprovement)
print ("shakeImprovement breakout = "..shakeImprovement)
print ("cycleImprovement breakout = "..cycleImprovement)
-- Set behavior to 'best fit' the cloud
behavior.SetClashImportance(1)
behavior.SetBackboneHBondImportance(0)
behavior.SetSidechainHBondImportance(0)
behavior.SetWigglePower("h")
behavior.SetDensityImportance(2)
function DoWiggle()
-- Keeps looping while improvement better than dialogue spec
local recentBest = recentbest.GetEnergyScore()
local startingScore = current.GetEnergyScore()
for i=1, 200 do -- 200 to stop infinite loop to an asymptote
-- Measure the improvement from one wiggle set
local loopStartScore = current.GetEnergyScore()
structure.WiggleAll(wiggleIterations)
local loopEndScore = current.GetEnergyScore()
-- Break if improvement less than dialogue spec for wiggles
if (loopEndScore - loopStartScore < wiggleImprovement) then
break
end
-- Let everyone know what's happening
print ("DoWiggle "..i.." done, now:"..loopEndScore)
end
return current.GetEnergyScore() > recentBest
end
function DoShake()
-- Keeps looping while improvement better than dialogue spec
local recentBest = recentbest.GetEnergyScore()
local startingScore = current.GetEnergyScore()
for i=1, 200 do -- 200 to stop infinite loop to an asymptote
-- Measure the improvement from one shake set
local loopStartScore = current.GetEnergyScore()
structure.ShakeSidechainsAll(shakeIterations)
local loopEndScore = current.GetEnergyScore()
-- Break if improvement less than dialogue spec for shakes
if (loopEndScore - loopStartScore < shakeImprovement) then
break
end
-- Let everyone know what's happening
print ("DoShake "..i.." done, now: "..loopEndScore)
end
return current.GetEnergyScore() > recentBest
end
function DoCycle()
-- Switches back and forth between wiggle and shake while improvement better than dialogue spec
local recentBest = recentbest.GetScore()
local startingScore = current.GetEnergyScore()
for i=1, 200 do -- 200 to stop infinite loop to an asymptote
-- Measure improvement from one cycle
local loopStartScore = current.GetEnergyScore()
if shakeOrWiggle then
DoShake()
DoWiggle()
else
DoWiggle()
DoShake()
end
local loopEndScore = current.GetEnergyScore()
-- Break if improvement less than dialogue spec for cycles
if (loopEndScore - loopStartScore < cycleImprovement) then
break
end
-- Let everyone know what's happening
print ("DoCycle "..i.." end: "..loopEndScore)
end
return current.GetEnergyScore() > recentBest
end
-- Loose munge to the cloud shape
print ("Starting the cloud-fit bit, not worrying about score")
DoCycle()
-- Restore normal behavior
behavior.SetBackboneHBondImportance(1)
behavior.SetSidechainHBondImportance(1)
behavior.SetDensityImportance(1)
-- Get some points
print ("Time to get some points!")
DoCycle()
if revertWiggleStrength then
behavior.SetWigglePower("a")
print ("Wiggle strength reset to Auto")
else
print ("Wiggle strength left on High")
end
print ("Electron density kick-off wiggles and shakes complete.")
print ("Do not re-run once you've improved from here - it will make it worse.")
print ("Over to you.")