Icon representing a recipe

Recipe: Gary Rebuild Worst 3.1

created by Bruno Kestemont

Profile


Name
Gary Rebuild Worst 3.1
ID
102513
Shared with
Public
Parent
Gary Rebuild Worst lua v2
Children
Created on
January 10, 2018 at 19:26 PM UTC
Updated on
January 10, 2018 at 19:26 PM UTC
Description

Rebuilding Worst Delta . Need 5 to reset delta. Based upon Walkin Rebuild but focuses on most impacted. Leaves secondary structure as is. Converted to lua v2 in order to make further improvements possible.

Best for


Code


--Gary Rebuild worst delta --A modified version of Walkin Rebuild V4 --Now converted to Lua v2 by Susume --V3 with dialog including new Min4Change by Bruno Kestemont 25/10/2017 --v3.1 cleanup with MovieSteps() ---------------------------------------- -- BEGIN V1 TO V2 CONVERSION LIBRARY ---------------------------------------- -- "lua v1 in v2" library by rav3n_pl --just add it in front of your v1 code and use v2 and v1 code in v2 scripts :) -- print(arg1[,...,argN]) no change :) function are_conditions_met() return current.AreConditionsMet() end function band_add_segment_segment(sgi1, sgi2) band.AddBetweenSegments(sgi1, sgi2) end function band_delete(bndIdx) if bndIdx~= nil then band.Delete(bndIdx) else band.DeleteAll() end end function band_disable(bndIdx) if bndIdx~=nil then band.Disable(bndIdx) else band.DisableAll() end end function band_enable(bndIdx) if bndIdx~=nil then band.Enable(bndIdx) else band.EnableAll() end end function band_set_length(bndIdx, len) band.SetGoalLength(bndIdx, len) end function band_set_strength(bndIdx, str) band.SetStrength(bndIdx, str) end function get_band_count() return band.GetCount() end function deselect_all() selection.DeselectAll() end function deselect_index(sgn) selection.Deselect(sgn) end function select_all() selection.SelectAll() end function select_index(sgn) selection.Select(sgn) end function select_index_range(sg1,sg2) selection.SelectRange(sg1,sg2) end function do_freeze(bbone,schain) freeze.FreezeSelected(bbone,schain) end function do_unfreeze_all() freeze.UnfreezeAll() end function do_global_wiggle_all(iters) structure.WiggleAll(iters,true,true) end function do_global_wiggle_backbone(iters) structure.WiggleAll(iters, true,false) end function do_global_wiggle_sidechains(iters) structure.WiggleAll(iters,false,true) end function do_local_rebuild(iters) structure.RebuildSelected(iters) end function do_local_wiggle(iters) structure.LocalWiggleSelected(iters,true,true) end function do_mutate(iters) structure.MutateSidechainsSelected(iters) end function do_shake(iters) structure.ShakeSidechainsSelected(iters) end function do_sidechain_snap(sgn, snap) rotamer.SetRotamer(sgn, snap) end function get_sidechain_snap_count(sgn) return rotamer.GetCount(sgn) end function load_structure() save.LoadSecondaryStructure() end function save_structure() save.SaveSecondaryStructure() end function quickload(slot) save.Quickload(slot) end function quicksave(slot) save.Quicksave(slot) end function get_exploration_score() return current.GetExplorationMultiplier() end function get_ranked_score() return current.GetScore() end function get_score() return current.GetEnergyScore() end function get_segment_distance(sg1,sg2) return structure.GetDistance(sg1,sg2) end function get_aa(sn) return structure.GetAminoAcid(sn) end function get_segment_count() return structure.GetCount() end function get_ss(sn) return structure.GetSecondaryStructure(sn) end function is_hydrophobic(sn) return structure.IsHydrophobic(sn) end function replace_aa(aa) for i=1,structure.GetCount() do if selection.IsSelected(i) then structure.SetAminoAcid(i, aa) end end end function replace_ss(ss) for i=1,structure.GetCount() do if selection.IsSelected(i) then structure.SetSecondaryStructure(i,ss) end end end function get_segment_score(sg) return current.GetSegmentEnergyScore(sg) end function get_segment_score_part(score_part,sg) return current.GetSegmentEnergySubscore(sg,score_part) end function reset_puzzle() puzzle.StartOver() end function restore_abs_best() absolutebest.Restore() end function restore_credit_best() creditbest.Restore() end function reset_recent_best() recentbest.Save() end function restore_recent_best() recentbest.Restore() end function set_behavior_clash_importance(ci) behavior.SetClashImportance(ci) end ----------------------------------- -- END V1 TO V2 CONVERSION LIBRARY ----------------------------------- CG303={} game={} gary={ -- sort a table of talbes on element y -- of the embedded tables BubbleSort = function(x, y) s=gary.CopyScores(x) for i=1,#s - 1 do for j =#s, i + 1, -1 do if s[i][y] < s[j][y] then s[j], s[i] = s[i], s[j] end end end return s end, CopyScores = function(x) copy={} for i=1, #x do copy[i]={x[i][1], x[i][2]} end return copy end, GetSegScores = function() -- set of segment # and score at seg # local scores={} for i=1, game.segCount do --fill score table scores[i]={i, get_segment_score(i)} end return scores end, GetBadRange = function(segW,maxLen) -- get a set of segments up to maxLen with scores worst than segW local segWScore=get_segment_score(segW) local worstFound=true local len=1 local segS=segW local segE=segW while (len<maxLen) and worstFound do worstFound=false if segS>1 then if get_segment_score(segS-1) < segWScore then segS=segS-1 worstFound=true len=len+1 end end if (segE<game.segCount) and (len<maxLen) then if get_segment_score(segE+1) < segWScore then segE=segE+1 worstFound=true len=len+1 end end end return segS, segE end, ZeroScores = function() -- set of segment # and score at seg # local scores={} for i=1, game.segCount do --fill score table with zeroes scores[i]={i, 0} end return scores end, AddScores = function(s1,s2) -- s1 and s2 need to be same size and order -- no test is performed local delta={} for i=1, #s1 do delta[i]={s1[i][1],s1[i][2] + s2[i][2]} end return delta end, SubtractScores = function(s1,s2) -- s1 and s2 need to be same size and order -- no test is performed local delta={} for i=1, #s1 do delta[i]={s1[i][1], s1[i][2] - s2[i][2]} end return delta end } function CG303.detect_ligand(flag) --[[ ligand puzzle detection normally, segments have a secondary structure of "E", "H" or "L" and they always have a spatial distance of about 3.75 to 3.85 to their next index neighbour. a ligand is more far away. this function should respond true if this is a ligand puzzle, and false if it is not. if flag is nil, ligand auto-detection is enabled, distance of last two segments is checked if flag is not nil, ligand auto-detection is disabled, result is flag It also returns the last segment index which is no ligand ]]-- local flag=flag local LastPos=get_segment_count() -- fetch very last segment index number if flag==nil then -- print("Detecting if there is a ligand.") local ss=get_ss(LastPos) flag=not(ss=="L" or ss=="H" or ss=="E" ) -- if last segment's ss is neither "L" nor "H" nor "E" flag=flag or (get_segment_distance(LastPos-1,LastPos)>=3.9) -- or distance to second last segment is bigger or equal than 3.9 end -- if local os="This should " if flag then LastPos=LastPos-1 else os=os.."not " end -- if flag print(os,"be a ligand puzzle.") return flag,LastPos end -- function function Round(x)--cut all afer 3-rd place return x-x%0.001 end function SelectSphere(sg, radius,nodeselect) if nodeselect~=true then deselect_all() end for i=1, game.segCount do if get_segment_distance(sg,i)<radius then select_index(i) end end end function AllLoop() do_unfreeze_all() select_all() replace_ss("L") end mingain = 0.05 --minimum gain per 2 wiggle iterations buddies = 2 -- how many segments asida should be wiggled too (n, n+1 then n, n-1) -- ie worst segment is no 44 and buddies set to 1 then -- willging seg 43+44; later seg 44+45 function wig() local change=false ss=get_score(true) repeat sc=get_score(true) do_local_wiggle(4) se=get_score(true) wg=se-sc until wg<mingain es=get_score(true) if es<ss then restore_recent_best() else change=true end deselect_all() return change end function wiggle(s) local change=false deselect_all() do_unfreeze_all() if s+1<=game.segCount then select_index(s+1)end if s-1>=1 then select_index(s-1)end do_freeze(true, true) deselect_all() select_index(s) if wig() then change=true end if buddies > 0 then --select buddies for b=1, buddies do deselect_all() do_unfreeze_all() if s+b+1<=game.segCount then select_index(s+b+1)end if s-1>=1 then select_index(s-1)end do_freeze(true, true) deselect_all() if s+b>game.segCount then select_index_range(s,game.segCount) else select_index_range(s,s+b)end if wig() then change=true end deselect_all() do_unfreeze_all() if s+1<=game.segCount then select_index(s+1)end if s-b-1>=1 then select_index(s-b-1)end do_freeze(true, true) deselect_all() if s-b<1 then select_index_range(1,s) else select_index_range(s-b,s)end if wig() then change=true end deselect_all() do_unfreeze_all() end end return change end function Gibaj(jak, iters, minppi) --score conditioned recursive wiggle/shake if jak==nil then jak="wa" end if iters==nil then iters=8 end if minppi==nil then minppi=0.04 end if iters>0 then iters=iters-1 local sp=get_score(true) if jak == "s" then do_shake(1) elseif jak == "wb" then do_global_wiggle_backbone(25) elseif jak == "ws" then do_global_wiggle_sidechains(25) elseif jak == "wa" then do_global_wiggle_all(25) end local ep = get_score(true) local ig=ep-sp if ig > minppi then Gibaj(jak, iters, minppi) end end end function BlueFuse(locally) reset_recent_best() if locally ~=true then select_all() end set_behavior_clash_importance(.05) do_shake(1) set_behavior_clash_importance(1) Gibaj() set_behavior_clash_importance(.07) do_shake(1) set_behavior_clash_importance(1) Gibaj() restore_recent_best() set_behavior_clash_importance(.3) do_global_wiggle_all(1) set_behavior_clash_importance(1) Gibaj() restore_recent_best() end function Lws(mingain) --score conditioned local wiggle, local change=false set_behavior_clash_importance(1) if mingain==nil then mingain=1 end repeat --wiggles selected segments local ss=get_score(true) do_local_wiggle(4) local se=get_score(true) local wg=se-ss if wg<0 then restore_recent_best() else change=true end until wg<mingain return change end function AfterRebuild(lws, bf,locally) if lws==nil then lws=true end if bf==nil then bf=true end reset_recent_best() set_behavior_clash_importance(1) Gibaj("s",1) Gibaj("ws",1) Gibaj("s",1) Gibaj("ws",1) if lws then Lws(4) end if bf then BlueFuse(locally) end select_all() Gibaj() end function Rebuild(maxIters)--local rebuild until any change if maxIters==nil then maxIters=5 end local s=get_score(true) local i=0 repeat i=i+1 if i>maxIters then break end--impossible to rebuild! do_local_rebuild(i) until get_score(true)~=s if get_score(true)==s then return false else return true end end function LocalRebuild(ss,se,maxiters,sphere, lws, bf) local change=false deselect_all() select_index_range(ss,se) local sc=get_score(true) local ok=Rebuild(maxIters) if ok then for s=ss, se do SelectSphere(s,sphere,true) end AfterRebuild(lws,bf,true) end local gain =get_score(true)-sc if gain>0+Min4Change then quicksave(3) print("Gained: ",get_score(true)-sc," NewScore: ",get_score(true)) change=true elseif gain<0+Min4Change then quickload(3) else print("Failed") end return change end function Build(sSeg, eSeg, backward, len, maxiters, loopmode, sphere, lws, bf) if backward then for i=eSeg, sSeg,-1 do local ss=i-len+1 if ss>sSeg then LocalRebuild(ss,i,maxiters,sphere, lws, bf) end end else for i=sSeg, eSeg do local se=i+len-1 if se<game.segCount then LocalRebuild(i,se,maxiters,sphere, lws, bf) end end end end function gary.RebuildDelta(maxLen, maxiters, sphere, lws, bf, minChange, initRebuilds) local sscore = get_score(true) local rebuilds=initRebuilds print("Gary Rebuild Delta started. Score: ",Round(sscore)) print("delta calculated after ",initRebuilds," good rebuilds") reset_recent_best() for j= 1, 1000 do quicksave(3) do_unfreeze_all() deselect_all() local oscores=gary.GetSegScores() local delta=gary.BubbleSort(oscores,2) local i=#delta local segW=delta[i][1] local segS, segE = gary.GetBadRange(segW,maxLen) repeat if segS~=segE then print("Working on sgmnts ",segS,"-",segE," with delta ", delta[i][2]) else print("Working on sgmnt ",segS," with delta ", delta[i][2]) end local oldScore=get_score(true) if LocalRebuild(segS,segE,maxiters,sphere, lws, bf) then --if enough gain SaveBigSteps() if get_score(true) - oldScore > minChange then minChange=minChange / minChangeDelta if rebuilds>2 then rebuilds=rebuilds-1 print("Need ", rebuilds," more.") i=i-1 else rebuilds=initRebuilds for x=segS,segE do oscores[x][2]=get_segment_score(x) end nscores=gary.GetSegScores() delta=gary.BubbleSort(gary.SubtractScores(nscores,oscores),2) i=#delta end else i=i-1 end if i > 0 then segW=delta[i][1] segS, segE = gary.GetBadRange(segW,maxLen) end else minChange=minChange * minChangeDelta if segS < segE then segS, segE=gary.GetBadRange(segW,segE-segS) else i=i-1 if i > 0 then segW=delta[i][1] segS, segE = gary.GetBadRange(segW,maxLen) end end end until i==0 print("Total rebuild gain: ",Round(get_score(true)-sscore)) OldMin4Change= Min4Change Min4Change=Min4Change * minChangeDelta *0.9 print("Changing gain condition to "..Round(Min4Change).. " from "..Round(OldMin4Change)) end end function ReBuild(sSeg, eSeg, backward, minLen, maxLen, maxiters, loopmode, sphere, lws, bf) local sscore = get_score(true) print("Walking Rebuild started. Score: ",Round(sscore)) do_unfreeze_all() deselect_all() if loopmode then save_structure() AllLoop() end reset_recent_best() quicksave(3) for i=minLen, maxLen do Build(sSeg, eSeg, backward, i, maxiters, loopmode, sphere, lws, bf) end print("Total rebuild gain: ",Round(get_score(true)-sscore)) if loopmode then load_structure() end end function get_parameters () local dlog = dialog.CreateDialog ( "Gary Rebuild Worst" ) dlog.sSeg = dialog.AddSlider ( "From seg" , sSeg , 1 , eSeg-1 , 0 ) dlog.eSeg = dialog.AddSlider ( "To seg" , eSeg , 2 , eSeg , 0 ) dlog.initRebuilds = dialog.AddSlider ( "Init Rebuilds" , initRebuilds , 1 , 20 , 0 ) dlog.backward=dialog.AddCheckbox ( "Backward " , backward ) dlog.minLen = dialog.AddSlider ( "Min len 2 rebuild" , minLen , 1 , 2 , 0 ) dlog.maxLen = dialog.AddSlider ( "Max len 2 rebuild" , maxLen , 2 , 8 , 0 ) dlog.maxiters = dialog.AddSlider ( "Max nb rebuilds" , maxiters , 2 , 8 , 0 ) dlog.loopmode=dialog.AddCheckbox ( "Loopmode " , loopmode ) dlog.sphere = dialog.AddSlider ( "Sphere" , sphere , 2 , 20 , 0 ) dlog.lws=dialog.AddCheckbox ( "lws " , lws ) dlog.bf=dialog.AddCheckbox ( "bf " , bf ) dlog.minChange = dialog.AddSlider ( "Min Change" , minChange , 0.1 , 5 , 1 ) dlog.minChangeDelta = dialog.AddSlider ( "Min Change Delta" , minChangeDelta , 0.01 , 1.99 , 2 ) dlog.Min4Change = dialog.AddSlider ( "Min gain 2 save" , Min4Change , 0 , 100 , 0 ) dlog.ok = dialog.AddButton ( "OK" , 1 ) dlog.cancel = dialog.AddButton ( "Cancel" , 0 ) if ( dialog.Show ( dlog ) > 0 ) then sSeg = dlog.sSeg.value eSeg = dlog.eSeg.value initRebuilds = dlog.initRebuilds.value backward= dlog.backward.value minLen = dlog.minLen.value maxLen = dlog.maxLen.value maxiters = dlog.maxiters.value loopmode=dlog.loopmode.value sphere = dlog.sphere.value lws=dlog.lws.value bf=dlog.bf.value minChange = dlog.minChange.value minChangeDelta = dlog.minChangeDelta.value Min4Change=dlog.Min4Change.value return true else return false end end --START Movie store big steps --SLOTS: --[[ 50-100 used to record each big steps for movie at the end ]]-- SlotStepStart=50 -- New 4/11/2014 SlotStep=SlotStepStart StepScore= get_score(true) function StoreBigStep() StepScore= get_score(true) save.Quicksave(SlotStep) SlotStep=SlotStep+1 end function SaveBigSteps() -- in order to be able to display big steps afterwards in undos local s= get_score(true) local g= s-StepScore if s >0 and ( (s <7000 and g>500) or (s <9000 and g>200) or (s <10000 and g>100) or (s >10000 and g>50)) then StoreBigStep() end end function MovieSteps() undo.SetUndo(true) print("See remembering of big steps in undos") for i= SlotStepStart, SlotStep do save.Quickload(SlotStep) end --save.Quickload(3) end --END Movie store big steps --[[ options ReBuild(sSeg, eSeg, backward, minLen, maxLen, maxiters, loopmode, sphere, lws, bf) sSeg- start segment to rebuild eSeg- end segment to rebuild backward- start from end minLen- minimum sgmnts len to rebuild (may be even 1) maxLen- maximum len to rebuild (over 7 seems useless) maxiters- maximum tries to rebuild loopmode- work in all-loop mode sphere- sphere size for shake/wiggle after rebuild lws- LWS sphere around (min gain 2pts, not LWSing totally) bf- BlueFuze sphere around minChange- minimum change to accept as a change initRebuilds- Rebuilds needed to calcualte delta. ]]-- game.isLigand, game.segCount=CG303.detect_ligand() sSeg=1 eSeg=game.segCount backward=false minLen=1 maxLen=2 maxiters=5 loopmode=true sphere=9 lws=true bf=true minChange=0.5 minChangeDelta=.99 initRebuilds=5 Min4Change = 0 -- new fo sketchbook (BK) --ReBuild(sSeg, eSeg, backward, minLen, maxLen, maxiters, loopmode, sphere, lws, bf) function Cleanup(err) -- NEW BK print("Restoring CI, best result, filter and structures") CI(1) undo.SetUndo(true) MovieSteps() save.Quickload(3) --MovieSteps() print(err) end function main() if get_parameters () then gary.RebuildDelta(maxLen, maxiters, sphere, lws, bf, minChange, initRebuilds) end end xpcall(main,Cleanup)

Comments


AtOneMent Lv 1

Rebuild delta.
Number of good rebuilds and others.

It would be nice to see a description of what they are/do. If there is already a description, please include the link to it.

Pretty please!

Bruno Kestemont Lv 1

For most of the recipes, you have the explanations in comments in the code of the recipe. Please open the code and read there.
Most of the terminology used here is standard to many recipes.
bf= blue fuze
lws = local wiggle strategy
delta is often the loss accepted for a rebuild before to shake and wiggle it
minimum gain is linked to the minimum gain accepted to go on with a solution etc.