package Ġnl . t ue . set sche matic s . action Ċ Ċ import Ġnl . t ue . set sche matic s . hyper graph . Vertex Ċ import Ġnl . t ue . set sche matic s . state . Edge Ċ import Ġnl . t ue . set sche matic s . state . State Ċ import Ġnl . t ue . set sche matic s . util . find In duced Cross ings Ċ import Ġnl . t ue . set sche matic s . util . calc Pen alty Ċ import Ġnl . t ue . set sche matic s . util . clone Ċ import Ġnl . t ue . set sche matic s . util . oct iline arity Pen alty Ċ Ċ class ĠRemove Anchor Action ( val Ġanchor : ĠVertex , Ġval Ġnew Edge : ĠEdge ?, Ġval Ġold Edges : ĠList < Edge >) Ġ: ĊĠĠĠĠĠĠĠ ĠState Action Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply ( state : ĠState ): ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Location Assignment Ġ= Ġstate . location Assignment . clone (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove ByKey ( anchor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġnew Ġedge Ġalready Ġexists : ĊĠĠĠĠĠĠĠ Ġval Ġold New Edge Ġ= Ġnew Edge ?. let Ġ{ Ġstate . edges . find Ġ{ Ġit . endpoints Ġ== Ġnew Edge . endpoints Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġold Cross ings Ġ= Ġfind In duced Cross ings ( old Edges Ġ+ Ġ ĠlistOf NotNull ( old New Edge ), Ġstate . edges , Ġstate . location Assignment ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Cross ings Ġ= Ġnew Edge ?. let Ġ{ Ġfind In duced Cross ings ( listOf ( new Edge ), Ġstate . edges , Ġnew Location Assignment ) Ġ} Ġ?: Ġlinked Set Of () ĊĊĠĠĠĠĠĠĠ Ġval Ġold Pen alty Ġ= Ġcalc Pen alty ( old Edges , Ġstate . vertices Ġ- Ġanchor , Ġstate . location Assignment ) Ġ+ Ġcalc Pen alty ( state . edges , Ġset Of ( anchor ), Ġstate . location Assignment ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Pen alty Ġ= Ġnew Edge ?. let Ġ{ Ġcalc Pen alty ( set Of ( new Edge ), Ġstate . vertices Ġ- Ġanchor , Ġnew Location Assignment ) Ġ} Ġ?: Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġold Oct i Ġ= Ġold Edges . sum By Double Ġ{ Ġoct iline arity Pen alty ( it , Ġstate . location Assignment ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Oct i Ġ= Ġnew Edge ?. let Ġ{ Ġoct iline arity Pen alty ( it , Ġnew Location Assignment ) Ġ} Ġ?: Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstate . clone With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Assignment Ġ= Ġnew Location Assignment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Points Ġ= ĠLinked HashSet ( state . anchor Points Ġ- Ġanchor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedges Ġ= Ġstate . edges . clone (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġold Edges ) Ġremove ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Edge Ġ!= Ġnull ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Edge Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNew Ġedge Ġalready Ġexists . ĠCollect Ġthe Ġhyper edges Ġand Ġre - add ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Edge . hyper edges . addAll ( find Ġ{ Ġit . endpoints Ġ== Ġnew Edge . endpoints Ġ} !!. hyper edges ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( new Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( new Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex To Hyper edges Ġ= Ġstate . vertex To Hyper edges . clone (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( anchor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross ings Ġ= ĠLinked HashSet ( state . cross ings Ġ- Ġold Cross ings Ġ+ Ġnew Cross ings ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġugly Vertex Pen alty Ġ= Ġstate . ug ly Vertex Pen alty Ġ- Ġold Pen alty Ġ+ Ġnew Pen alty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoct iline arity Pen alty Ġ= Ġstate . oct iline arity Pen alty Ġ- Ġold Oct i Ġ+ Ġnew Oct i ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ